運行壞境
python3.xhtml
選擇目標——百度
當咱們在使用右鍵查看網頁源碼時,出來的倒是一大堆JavaScript代碼,並無圖片的連接等信息python
由於它是一個動態頁面嘛。它的網頁原始數據實際上是沒有這個圖片的,經過運行JavaScript,把這個圖片數據把它插入到網頁的html標籤裏面json
那這樣形成的結果是,咱們在開發者工具中雖然能看到這個html標籤,但實際上,當咱們在看網頁的原始數據的時候,實際上是沒有這個標籤的,它只在運行時加載和渲染python3.x
進行抓包就行了,咱們點擊Network–XHR,而後咱們在往下滑動滾動條時,會一直出現一個名爲:acjson?tn=resultjson&ipn=…的請求,點擊它再點Preview,咱們看到這是一條json數據,點開data,咱們看到這裏面有30條數據,每一條都對應着一張圖片。app
以下:工具
因而咱們就清楚了,百度圖片一開始只加載30張圖片,當咱們往下滑動滾動條時,頁面會動態加載json數據,每條json數據裏面包含了30條信息,信息裏面又包含了圖片的URL,JavaScript會將這些url解析並顯示出來。這樣,每次滾動到底就又多出30張圖片。url
那麼,這些一直出現的json數據有什麼規律呢?spa
咱們點擊Headers,而後對比這些json數據的頭部信息。code
經過對比,咱們發現headers下的Query String Parameters中的字段大多保持不變,只有pn字段保持以30爲步長遞增htm
比較
總結
import requestsimport osdef 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 urlsdef 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:指定保存的路徑