python爬蟲之爬取動態加載的圖片_百度


運行壞境

python3.x

選擇目標——百度

當我們在使用右鍵查看網頁源碼時,出來的卻是一大堆JavaScript代碼,並沒有圖片的鏈接等信息

因為它是一個動態頁面嘛。它的網頁原始數據其實是沒有這個圖片的,通過運行JavaScript,把這個圖片數據把它插入到網頁的html標簽里面

那這樣造成的結果是,我們在開發者工具中雖然能看到這個html標簽,但實際上,當我們在看網頁的原始數據的時候,其實是沒有這個標簽的,它只在運行時加載和渲染

進行抓包就好了,我們點擊Network–XHR,然后我們在往下滑動滾動條時,會一直出現一個名為:acjson?tn=resultjson&ipn=…的請求,點擊它再點Preview,我們看到這是一條json數據,點開data,我們看到這里面有30條數據,每一條都對應着一張圖片。

如下:

 

 

於是我們就清楚了,百度圖片一開始只加載30張圖片,當我們往下滑動滾動條時,頁面會動態加載json數據,每條json數據里面包含了30條信息,信息里面又包含了圖片的URL,JavaScript會將這些url解析並顯示出來。這樣,每次滾動到底就又多出30張圖片。

那么,這些一直出現的json數據有什么規律呢?

我們點擊Headers,然后對比這些json數據的頭部信息。

通過對比,我們發現headers下的Query String Parameters中的字段大多保持不變,只有pn字段保持以30為步長遞增

比較

總結

import requests
import os

def getManyPages(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)
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
else:
print('圖片鏈接不存在')

if __name__ == '__main__':
dataList = getManyPages('風景',10) # 參數1:關鍵字,參數2:要下載的頁數
getImg(dataList,'*********') # 參數2:指定保存的路徑

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM