第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

首頁 慕課教程 Python 原生爬蟲教程 Python 原生爬蟲教程 14 開發(fā)小案例-綜合運(yùn)用

開發(fā)小案例-綜合運(yùn)用

學(xué)習(xí)了這么多知識(shí),這節(jié)課我們來實(shí)踐一下,我們?cè)谶@節(jié)課會(huì)設(shè)計(jì)一個(gè)小爬蟲來爬取慕課網(wǎng)所有的免費(fèi)課信息。當(dāng)然,爬取慕課網(wǎng)所有免費(fèi)課信息只是一個(gè)大的目標(biāo)而已,具體要實(shí)現(xiàn)這個(gè)目標(biāo)我們還需要對(duì)劃分步驟,將一個(gè)大目標(biāo)分解成一個(gè)個(gè)的小目標(biāo)才可以。在實(shí)際的開發(fā)工作中我們也需要這樣,拿到需求之后不要上來就開始寫代碼,然后一邊寫一邊運(yùn)行調(diào)試,雖然這樣不能說錯(cuò)吧,但是卻跟裝運(yùn)氣一樣,試對(duì)了就對(duì)了,錯(cuò)了還一直在哪里糾結(jié)。下面我們先來看下這個(gè)小爬蟲的案例步驟:

1. 案例步驟與目標(biāo):

  1. 分析網(wǎng)站
  2. 書寫程序
  3. 運(yùn)行程序,并將結(jié)果存入MongoDB

1.1 目標(biāo):

通過本案例,學(xué)習(xí)BeautifulSoup的網(wǎng)站分析方法,以及掌握將數(shù)據(jù)存入MongoDB

1.2 分析網(wǎng)站

第一步,打開慕課網(wǎng)網(wǎng)址,然后點(diǎn)擊免費(fèi)課程,效果如下:

圖片描述

接下來,我們右鍵單擊鼠標(biāo),效果如下:

圖片描述

點(diǎn)擊 Inspect 后,在瀏覽器的下端,會(huì)彈出瀏覽器 debug 控制面板:
圖片描述

單擊左上角的小三角,然后選定一個(gè)課程,效果如下:

圖片描述

如下圖陰影部分所示,是圖片的在 html 中的位置,我們需要整個(gè)課程的信息,因此提取 course-card-content 作為基本模塊:
圖片描述

在程序里,我們需要使用 BeautifulSoup 定位到到這里。

2. 書寫程序

我們先來看一下代碼的架構(gòu):

圖片描述

接下來,讓我們看看所有代碼。

import requests
from bs4 import BeautifulSoup   
from  pprint import pprint
import os
import lxml
import pymongo

headers = {'User-Agent' : 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36'} # 請(qǐng)求頭部

def get_course_info():
    """ get all course basic unit """

    url = "http://idcbgp.cn/course/list" #慕課網(wǎng)免費(fèi)課地址
    r = requests.get(url, headers= headers) # 發(fā)送請(qǐng)求
    bs = BeautifulSoup(r.text, "lxml")   # 解析網(wǎng)頁
    course_data = bs.find_all("div", class_="course-card-container") # 定位課程信息
    return course_data


def save_pics(course_data):
    """ save pics from imooc free course """

    for each_item in course_data:
        img = each_item.find("img")
        image_link = img.attrs["data-original"].split("/")
        image_address = "http:" + img.attrs["data-original"] 
        with open(image_link[-1],'wb+') as f:
            res = requests.get(image_address, headers= headers) # 發(fā)送請(qǐng)求
            f.write(res.content)


def save_courses_to_mongodb(mongod_con, course_data):
    """ save info to mongodb """

    for each_item in course_data:
        imgs = each_item.find("img")
        desc = each_item.find("p", class_="course-card-desc") # 定位課程信息
        class_name = each_item.find("h3", class_="course-card-name") # 定位課程信息
        imooc_dict = { "class_name": class_name.getText(), "class_pics": imgs.attrs["data-original"], "people":desc.getText()}
        x = mongod_con.insert_one(imooc_dict)


def create_local_pic_dir():
    """ if don't have local dir, create one for holding the pics which download from the imooc. """

    directory = os.path.dirname(os.path.realpath(__file__)) + '/imooc_pics/'    
    if not os.path.exists(directory):
        os.makedirs(directory)
    os.chdir(directory)


def db_connectin():
    """ Connection to local mongo db service."""

    try:
        myclient = pymongo.MongoClient("mongodb://localhost:27017/")
        mydb = myclient["practice"]
        mongod_con = mydb["imooc_courses"]
    except Exception as e:
        print("ERROR(MongoPipeline):", e)

    return mongod_con


def main():
    """ This is the main entry for running code.""" 

    create_local_pic_dir()
    mycol = db_connectin()

    data = get_course_info()

    if data:
        save_pics(data)
        save_courses_to_mongodb(mycol, data)

if __name__ == "__main__":
    main()

代碼主要有 6 個(gè)函數(shù):

  • create_local_pic_dir: 用來創(chuàng)建本地文件夾,來存儲(chǔ)爬取的圖片;
  • db_connectin: 用來連接 mongodb;
  • get_course_info :用來獲取課程基本信息;
  • save_pics :函數(shù)將圖片存儲(chǔ)在本地;
  • save_courses_to_mongodb :將數(shù)據(jù)存儲(chǔ)到 MongoDB;
  • main :負(fù)責(zé)運(yùn)行程序。

2.1 create_local_pic_dir

首先,在本地創(chuàng)建一個(gè)文件夾,來存儲(chǔ)從慕課網(wǎng)下載下來的圖片信息。

2.2 db_connectin

建立本地的連接,并返回一個(gè)連接句柄。

2.3 get_course_info

通過前面網(wǎng)站的分析,我們可以通過調(diào)用 bs4 的 find_all() 方法來定位課程的基本單元,然后通過遍歷,獲取課程的詳細(xì)信息。

2.4 save_pics

在存儲(chǔ)圖片的時(shí)候,我們需要提取圖片的名稱,使用 split 將網(wǎng)址分開,然后取倒數(shù)第一數(shù)據(jù),就是圖片的名稱。

2.5 save_courses_to_mongodb

在我們成功連接 mongdb 之后,通過調(diào)用 insert_one() 方法,我們可以把課程的字典信息,一條一條的存儲(chǔ)到 mongodb 中。

2.6 運(yùn)行程序,并將結(jié)果存入MongoDB

可以看到,程序創(chuàng)建了 imooc_pics 文件夾,里面存儲(chǔ)了我們從慕課網(wǎng)下載的免費(fèi)課程的介紹圖片。

圖片描述

打開一張圖片可以看到是一張課程的封面圖:

圖片描述

最后,我們使用 MongoDB 的可視化工具,看一下圖片的存儲(chǔ)情況,效果如下圖所示:

圖片描述

3. 小結(jié)

這一小節(jié),我們通過實(shí)際的案例,熟悉了網(wǎng)址的分析,數(shù)據(jù)的存儲(chǔ),以及圖片的存儲(chǔ)。通過整個(gè)案例,我們需要掌握 BeautifulSoup 的用法,以及 mongoDB 數(shù)據(jù)存儲(chǔ)的使用。掌握了這個(gè)完整的案例,同學(xué)們可以舉一反三,可以使用相同的步驟輕松爬取的許多類似的網(wǎng)站。