第十三章 爬蟲入門實例

從第一章到上一章為止,基本把python所有的基礎點都已經包括了,我們有控制邏輯的關鍵字,有內置數據結構,有用于工程需要的函數和模塊,又有了標準庫和第三方庫,可以寫正規的程序了。

python可以做非常多的事情,最火爆的事情應該是大家一直都在討論的爬蟲,這里編寫一個簡單的爬蟲例子,它能夠真正的運行,但主要的目的是在提高對之前知識點的理解和熟悉python如何編寫簡單工程。

編寫一個爬蟲,爬取www.duitang.com網站的數據,主要的功能是通過搜索詞得到搜索結果,并分析網頁得到商品圖片的鏈接地址并下載圖片。

程序的各個模塊功能

爬蟲的一個重要的模塊是根據url獲取網頁數據,我們利用前面一章介紹的第三方庫requests,用簡單的幾行代碼來抓取網頁數據,可以熟悉函數的寫法和邏輯控制。

def get_http_content(url):

    s = requests.Session()

    request = s.get(url, headers = headers,timeout=120, verify=False)
    body = ''
    if request.status_code == 200:
        body = request.text
    return body

下載圖片的功能如下:

def get_image( url, name):
    image_path = os.path.join('images/', name)
    if not os.path.exists(image_path):
        r = requests.get(url, stream=True, headers=headers)
        if r.status_code == 200:
            with open(image_path, 'wb') as f:
                for chunk in r:
                    f.write(chunk)
        else:
            print('==> get image error: ', url)

get_image有兩個參數,一個是圖片的url地址,一個是圖片的名稱,為了不想有太多的參數,圖片存放的地址在程序中寫的是當前路徑下的images/目錄。

程序的邏輯控制

這里我們會詳細的解釋如何對網站進行分析,如何抽取出我們最想要的數據來滿足我們的需求。先用瀏覽器打開鏈接 https://www.duitang.com/search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&from=tuijian 我們搜索的是中秋節這個關鍵字,如下:

查看網頁的源代碼,也就是我們通過get_http_content 能夠得到的數據,一般來說可以利用Beautiful Soup對數據進行處理,并取出關鍵的字段。但duitang的搜索比較特殊,通過它分頁的數據可以看出是動態加載網頁內容,查看網絡請求,看看是哪一個網絡接口。

通過網絡請求的數據,查到了搜索的分頁數據,接口在

https://www.duitang.com/napi/blog/list/by_search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&_type=&start=0

分析里面的接口參數,start為分頁參數,要取得所有的分頁數據只需要改變這個參數。

如,第二頁數據在:

https://www.duitang.com/napi/blog/list/by_search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&_type=&start=24

可以使用for循環,取前十頁的數據:

url_start = 'https://www.duitang.com/napi/blog/list/by_search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&_type=&start='
for i in range(0,10):
    url = url_start + str(i*24)

整個流程如下:

if __name__ == '__main__':

    # 接口地址
    url_start = 'https://www.duitang.com/napi/blog/list/by_search/?kw=%E4%B8%AD%E7%A7%8B%E8%8A%82&type=feed&_type=&start='
    next_start = 0
    while True:
        #獲取api接口數據
        url = url_start + str(next_start)
        content = get_http_content(url)
        json_data = json.loads(content)

        # 分析得出圖片地址,并下載
        for object_list in json_data['data']['object_list']:
            image_path = object_list['photo']['path']
            image_name = os.path.basename(image_path)
            get_image(image_path,image_name)

        #下一頁
        next_start = json_data['data']['next_start']

        # 分頁結束
        if next_start == 0:
            break

程序通過不斷的取得分頁的數據,用json模塊解析數據,提出圖片的地址,并下載圖片。在images/ 目錄下存放著下載的圖片文件。

總結

一個簡單的對網頁進行爬取,并根據自己的需求提取網頁中所需要的字段,并對字段進行處理,這里僅僅是對圖片進行了下載,你還可以對需求進一步的進行擴展,比如把特殊的字段存到數據庫中,搜索更多的熱詞等,進行更多的嘗試。

繼續閱讀

所有評論

如果對文章有異議,請加qq:1752338621