1. 程式人生 > >Python爬蟲入門教程 19-100 51CTO學院IT技術課程抓取

Python爬蟲入門教程 19-100 51CTO學院IT技術課程抓取

寫在前面

從今天開始的幾篇文章,我將就國內目前比較主流的一些線上學習平臺數據進行抓取,如果時間充足的情況下,會對他們進行一些簡單的分析,好了,平臺大概有51CTO學院CSDN學院網易雲課堂慕課網等平臺,資料統一抓取到mongodb裡面,如果對上述平臺造成了困擾,請見諒,畢竟我就抓取那麼一小會的時間,不會對伺服器有任何影響的。

1. 目標網站

今天的目標網站是 http://edu.51cto.com/courselist/index.html?edunav 資料量大概在1W+,還不錯
在這裡插入圖片描述

2. 分析頁面需要的資訊

下圖標註的框框,就是我們需要的資訊了
在這裡插入圖片描述

如果檢視原始碼,我們還能得到其他有價值的隱藏資訊,也同時的抓取到,另外,今天的主題不是下載圖片,所以針對課程縮圖,我只保留一個圖片連結到mongodb

裡面,就不做單獨的處理了。

在開發者工具中,繼續檢索有用資訊。發現一個獨家 這個資訊看似有用唉,可以做保留。

在這裡插入圖片描述

3. 分析爬取方式

分析完畢就是要爬取操作了,看一下這個網站是否是ajax動態載入的,如果不是,那麼就採用最笨的辦法爬取。
查閱網站原始碼之後,發現沒有非同步資料。
採用URL拼接的方式爬取即可。

URL規律如下,因為資料相對變化不大,末尾的頁碼是417,所以URL直接生成就可以了。

http://edu.51cto.com/courselist/index-p2.html
http://edu.51cto.com/courselist/index-p3.html
http://edu.51cto.com/courselist/index-p4.html
http://edu.51cto.com/courselist/index-p5.html
...
http://edu.51cto.com/courselist/index-p417.html

今天主要使用requests-html這個庫
github地址 : https://github.com/kennethreitz/requests-html 依舊是大神開發的,非常6。

我們拿51cto學院 完整的練個手

from requests_html import HTMLSession

BASE_URL = "http://edu.51cto.com/courselist/index.html"
def get_content():
    session = HTMLSession()
    r = session.get(BASE_URL)
    print(r.html)

if __name__ == '__main__':
    get_content()

使用上面的程式碼,就能快速的獲取到一個請求的響應了。
繼續編寫下面幾行程式碼之後,你不得不驚歎,我去~,資料都獲取到了!

    print(r.html)
    print(r.html.links)
    print(r.html.absolute_links)   # 獲取所有的絕對地址
    print(r.html.find('.cList',first=True))  # 獲取class=cList的第一個標籤
    c_list = r.html.find('.cList',first=True)
    print(c_list.text)

在這裡插入圖片描述
當然這些對咱來說還是遠遠不夠的,畢竟我們要把他寫入mongodb裡面

上面的只是叫你對這個庫有一個基本的認知,更多的資料你可以去他的教程網站查閱

http://html.python-requests.org/

4. 分析爬取方式

看一下非同步方式,非同步的出現可以為我們的爬蟲加速

在這裡插入圖片描述

這個地方有一個你一定要注意的,我寫這篇文章的時候,requests-html 是從github下載之後,更新的本次,你如果之前使用pip進行安裝,那麼非同步應該是沒有更新上去的。

好了,接下來我們實現一下非同步,可能由於作者認為非同步目前不是很穩定,所以我查閱了一下他的原始碼,然後實現瞭如下程式碼,寫的不好,請見諒~
下面的程式碼,注意看模組的區別,以及核心的非同步函式

async def get_html():
    for i in range(1,3):
        r =  await asession.get(BASE_URL.format(i))   # 非同步等待
        get_item(r.html)
if __name__ == '__main__':
    result = asession.run(get_html)
from requests_html import AsyncHTMLSession   # 匯入非同步模組

asession = AsyncHTMLSession()

BASE_URL = "http://edu.51cto.com/courselist/index-p{}.html"

async def get_html():
    for i in range(1,3):
        r =  await asession.get(BASE_URL.format(i))   # 非同步等待
        get_item(r.html)

def get_item(html):
    c_list = html.find('.cList',first=True)
    if c_list:
        items = c_list.find('.cList_Item')
        for item in items:
            title = item.find("h3",first=True).text # 課程名稱
            href = item.find('h3>a',first=True).attrs["href"]  # 課程的連結地址
            class_time = item.find("div.course_infos>p:eq(0)",first=True).text
            study_nums = item.find("div.course_infos>p:eq(1)", first=True).text
            stars = item.find("div.course_infos>div", first=True).text
            course_target = item.find(".main>.course_target", first=True).text
            price = item.find(".main>.course_payinfo h4", first=True).text
            dict = {
                "title":title,
                "href":href,
                "class_time":class_time,
                "study_nums":study_nums,
                "stars":stars,
                "course_target":course_target,
                "price":price
            }
            print(dict)

    else:
        print("資料解析失敗")

if __name__ == '__main__':
    result = asession.run(get_html)

程式碼執行之後,控制檯就會輸出相應的內容,上述程式碼中有個地方用到了大量的解析HTML,這個你搜索一下官方文件就可以看明白,不進行過多的解釋。
在這裡插入圖片描述

5. 寫入到mongodb裡面

這部分程式碼就非常非常簡單了
結果如下
在這裡插入圖片描述

實際的爬取過程中,也沒有發現反爬蟲的一些限制,不過咱畢竟是為了研究一下requests-html的用法,所以只能對51CTO網站說一句多有得罪,罪過罪過。



程式碼上面除了mongodb部分,基本是完整的,自己拷貝一下使用吧。