Python3 爬取百度瀑布流動態加載圖片

    百度圖片的網頁是一個動態頁面,它的網頁原始數據是沒有圖片的,通過運行 JavaScript ,把圖片數據插入到網頁的 html 標籤裏,所以在原始數據裏是沒有圖片的,它只在運行時加載和渲染,得通過抓包的方式來爬取。

    打開百度圖片搜索 吉娃娃 關鍵字,然後 F12 打開開發者工具 Network -> XHR -> Preview ,向下滑動滾動條到一定程度時會出現 acjson?tn=resultijson_com$ipn=rj$ct=20132659..... 這樣的請求,這是條 json 數據,點開 data ,可以看到裏面有 0-29 ,共 30 條數據,每一條都對應一張圖片。

    

    百度圖片剛開始只加載了 30 張圖片,滑動滾動條時,頁面會動態加載 1 條 json 數據,每條 json 數據裏面包含了30 條信息,信息裏面包含了圖片的 URL ,JavaScript 會將這些 URL 解析並顯示出來。滾動條滾動到底時重複這一操作。

    觀察 Headers 下 Query String Parameters 裏的 pn 字段,第一條 json 數據爲 30 ,第二條 json 數據爲 60 ,它是以 30 爲步長遞增。再看 queryWord 和 word ,這兩個就是前面輸入的關鍵字。其它的字段都保持不變的狀態。不過最後一行是什麼鬼?亂入。

    

    原理就是這樣的,然後寫代碼:

    

import requests
import os

def getPages(keyword,pages):
    params = []
    for i in range(30, 30*pages+30, 30):
        params.append({
                      'tn': 'resultjson_com',
                      'ipn': 'rj',
                      'ct': 201326592,
                      'is': '',
                      'fp': 'result',
                      'queryWord': keyword,
                      'cl': 2,
                      'lm': -1,
                      'ie': 'utf-8',
                      'oe': 'utf-8',
                      'adpicid': '',
                      'st': -1,
                      'z': '',
                      'ic': 0,
                      'word': keyword,
                      's': '',
                      'se': '',
                      'tab': '',
                      'width': '',
                      'height': '',
                      'face': 0,
                      'istype': 2,
                      'qc': '',
                      'nc': 1,
                      'fr': '',
                      'pn': i,
                      'rn': 30,
                      'gsm': '1e',
                      '1488942260214': ''
                  })
    url = 'https://image.baidu.com/search/acjson'
    urls = []
    for i in params:
        urls.append(requests.get(url, params=i).json().get('data'))
    return urls

def getImg(dataList, localPath):

    if not os.path.exists(localPath):
        os.mkdir(localPath)

    try:
        x = 0
        for list in dataList:
            for i in list:
                if i.get('thumbURL') != None:
                    print('正在下載:%s' % i.get('thumbURL'))
                    ir = requests.get(i.get('thumbURL'))
                    open(localPath + '%d.jpg' % x, 'wb').write(ir.content)
                    x += 1
        print('圖片下載完成')
    except Exception:
        print("圖片下載失敗")

if __name__ == '__main__':
    dataList = getPages('吉娃娃', 3)
    getImg(dataList, 'D:/images/')
    運行完的結果:

    

    這樣就爬好了,但這樣爬下來的是小圖,小圖,不能忍。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章