1. 程式人生 > 實用技巧 >最近剛學了python的爬蟲,那今天就寫個簡單的,一目瞭然

最近剛學了python的爬蟲,那今天就寫個簡單的,一目瞭然

前言

最近剛學了python的爬蟲,剛好可以用來爬取漂亮的圖片作為桌布,網上美圖網站有很多,比如:花瓣,堆糖。它們請求圖片資料的方式差不多類似,都是通過使用者不斷下滑載入新的圖片,這種請求技術就叫做Ajax,全稱為 Asynchronous JavaScript and XML,即非同步載入資料、資源。

PS:如有需要Python學習資料的小夥伴可以加下方的群去找免費管理員領取

可以免費領取原始碼、專案實戰視訊、PDF檔案等

所以今天就來寫個簡答的python小爬蟲來練練手,抓取堆糖上的圖片。

開啟堆糖網站

https://www.duitang.com

接著在輸入框輸入咱們感興趣的內容,進行搜尋,咱們的目標就是將搜尋結果裡的圖片爬取到本地硬碟上。

廢話不說,立即寫個程式碼來跑一跑。不過在寫程式碼前,咱們還是得先分析一下抓取資料的步驟。

首先,可以檢視上瀏覽器上的位址列,可以看出這個搜尋結果的網址構成還是挺有規律的,前面是堆糖的首頁網址,?後面是咱們的請求資料,請求資料裡面最關鍵的就是(kw="搜尋關鍵詞"),這是會根據咱們搜尋內容不同而改變的。

接著按鍵盤上的f12調出開發者工具,點選Network,再按f5重新整理下網頁進行資料重新請求,可以看到在Name的下拉框下有許多的請求檔案,咱們可以點選一個檔案進行檢視下里面請求頭資料,這是待會寫爬蟲非常重要的請求頭構造資料來源。

由於網站是通過非同步載入資料的方式來獲取圖片的,所以咱們要找到網站請求的json資料,關注到上邊的資源過濾器,當前選擇的是All,即所有的資原始檔。但是這麼多的資原始檔不是咱們都需要的,咱們只關注的是json資料,所以點選上面的XHR可以看到裡面是空白的,這時你可能會疑惑,咱們要的資料在哪呢?別急,前面說到網頁資料是非同步載入的,所以咱們只要不斷向下滾動滑鼠來載入新的圖片,這時就會發現Name下拉框下多了很多資原始檔,隨便選擇一個進行檢視,將滑鼠停留在資原始檔上時,會浮出一個url地址。咱們分析下這個url地址,這和前面的url地址有點像,但是複雜了很多。

看不出規律可以單擊下資原始檔,右邊視窗的Request URL行也有這個url,咱們多點選幾個檔案進行檢視,並將裡面url地址複製到文字上檢視。

可以看出這些url前面是都是相同的,唯一不同的是後面start和_不同。咱們待會寫程式碼時就構造這個url。

雙擊可以開啟這個url地址,裡面會是大段的json資料,裡面就有咱們要爬的的資料,不過密集恐懼症患者看後表示有點頭暈。當然還有另一個地方可以檢視這些資料。

單擊一個資原始檔,再點選右邊Preview,可以看到這裡面有許多資料,而咱們要的資料就是前面的json資料,黑色三角形是可以點選的,點選後會展開詳細的資料資訊。

通過檢視分析,這裡photo下面的path行應該就是咱們的圖片的url地址,也就是說只要將這個地址拿到,就可以進行圖片的爬取。

分析到這裡,就可以來寫咱們的程式碼,開啟pycharm,先匯入必要的庫。

from urllib.parse import urlencode
import requests
import time
import os

接著構造咱們的請求頭和每一頁的url。

base_url='https://www.duitang.com/napi/blog/list/by_search/?'

headers = {
    'Host':'www.duitang.com',
    'Referer':'https://www.duitang.com/search/?kw=%e7%be%8e%e5%a5%b3&type=feed',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
    'X-Requested-With':'XMLHttpRequest'
}
def get_page(start,count):
    params={
        'kw':'小姐姐',
        'type':'feed',
        'include_fields':'top_comments,is_root,source_link,item,buyable,root_id,status,like_count,like_id,sender,album,reply_count,favorite_blog_id',
        '_type':'',
        'start':start,
        '_':count
    }
    url = base_url + urlencode(params)
    try:
        response = requests.get(url,headers=headers)
        if response.status_code == 200:
            return response.json()
        else:
            print("error")
    except requests.ConnectionError as e:
        print('Error',e.args)   

獲取到圖片url就可以進行讀寫操作了。

def parse_page(json):
    if json:
        items = json.get('data').get('object_list')
        for item in items:
            data = {}
            data['favorite_count'] = item.get('favorite_count');
            item = item.get('photo')
            data['path']=item.get('path'); ## 獲取圖片url地址
            file_path = '{0}/{1}'.format('./'+download_dir, data['path'].split('/')[-1]) ## 將圖片寫入到本地硬碟上
            with open(file_path, 'wb') as f:
                img = requests.get(data['path'])
                print(img)
                f.write(img.content)
            yield data

再寫個主函式,完成

start_page = 0 ## 從第幾頁開始爬
page_size = 5 ## 要爬多少頁
count = 1597729530322 ## 第1頁請求資料中下劃線的取值
download_dir = "downlode_img" ## 存放圖片資料夾名稱

if __name__ == '__main__':
    count = 1597729530322 + start_page;
    if not os.path.exists('./' + download_dir) :
        os.mkdir('./' + download_dir); ## 建立資料夾
    for start in range(start_page,page_size*24+1,24):
        json = get_page(start,count)
        results = parse_page(json)
        for result in results:
            print(result)

        count += 1;
        time.sleep(2) ## 每爬完一頁暫停2秒,減輕伺服器壓力

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

作者:it新猿