1. 前言
先貼代碼
# -*- coding:utf8 -*-
import requests
import json
from urllib import parse
import os
import time
class BaiduImageSpider(object):
def __init__(self):
self.json_count = 0 # 請求到的json文件數(shù)量(一個json文件包含30個圖像文件)
self.url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=5179920884740494226&ipn=rj&ct' \
'=201326592&is=&fp=result&queryWord={' \
'}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word={' \
'}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={' \
'}&rn=30&gsm=1e&1635054081427= '
self.directory = r"C:\Users\cun\Pictures\download\{}" # 存儲目錄 這里需要修改為自己希望保存的目錄 {}不要丟
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30 '
}
# 創(chuàng)建存儲文件夾
def create_directory(self, name):
self.directory = self.directory.format(name)
# 如果目錄不存在則創(chuàng)建
if not os.path.exists(self.directory):
os.makedirs(self.directory)
self.directory += r'\{}'
# 獲取圖像鏈接
def get_image_link(self, url):
list_image_link = []
strhtml = requests.get(url, headers=self.header) # Get方式獲取網(wǎng)頁數(shù)據(jù)
jsonInfo = json.loads(strhtml.text)
for index in range(30):
list_image_link.append(jsonInfo['data'][index]['thumbURL'])
return list_image_link
# 下載圖片
def save_image(self, img_link, filename):
res = requests.get(img_link, headers=self.header)
if res.status_code == 404:
print(f"圖片{img_link}下載出錯------->")
with open(filename, "wb") as f:
f.write(res.content)
print("存儲路徑:" + filename)
# 入口函數(shù)
def run(self):
searchName = input("查詢內(nèi)容:")
searchName_parse = parse.quote(searchName) # 編碼
self.create_directory(searchName)
pic_number = 0 # 圖像數(shù)量
for index in range(self.json_count):
pn = (index+1)*30
request_url = self.url.format(searchName_parse, searchName_parse, str(pn))
list_image_link = self.get_image_link(request_url)
for link in list_image_link:
pic_number += 1
self.save_image(link, self.directory.format(str(pic_number)+'.jpg'))
time.sleep(0.2) # 休眠0.2秒,防止封ip
print(searchName+"----圖像下載完成--------->")
if __name__ == '__main__':
spider = BaiduImageSpider()
spider.json_count = 10 # 定義下載10組圖像,也就是三百張
spider.run()
如果要使用上述程序的話,需要修改兩個地方:
- self.directory 這是本地存儲地址,修改為自己電腦的地址,另外,**{}**不要刪
- spider.json_count = 10 這是下載的圖像組數(shù),一組有30張圖像,10組就是三百張,根據(jù)需求下載
也可以去gitee倉庫直接下載程序。
關(guān)于python爬蟲入門,如何查看網(wǎng)頁源碼,可以參考我的另一篇文章 點擊跳轉(zhuǎn)
2. Python爬蟲批量下載百度圖片
流程:先分析頁面,然后寫爬蟲程序。
打開“百度圖片”,隨便搜索一個詞匯,例如玫瑰,可以查詢到相關(guān)的圖片
- 分析頁面
點擊鼠標右鍵–>檢查–元素,先找到第一層div
然后往下找,可以找到一堆li,也就是以列表排列的元素,經(jīng)研究發(fā)現(xiàn),每個li代表一個模塊,每個模塊包含圖像和下面的字,實際上,下面的字也帶有相應(yīng)鏈接,點擊可以跳轉(zhuǎn)到新頁面。
可以先數(shù)一下,包含前面的廣告圖片,總共也就二十多個li,也就是只包含了二十多張圖像。
根據(jù)使用經(jīng)驗來看,鼠標滾輪下滾,會看到源源不斷的圖像,并不局限于二十多張圖像,那么我們先下滾鼠標滾輪,看看會發(fā)生什么。(此時只有一個類名為“imgpage”的div)
鼠標滾輪下滾,類名為“imgpage”的div增加了很多,繼續(xù)下滾,還會繼續(xù)增加。
由此可以得出一個結(jié)論,“百度圖片”初始只會渲染部分圖像到頁面上,隨著滾輪下滾,就會請求新的數(shù)據(jù)。而請求數(shù)據(jù),就可以在“網(wǎng)絡(luò)“中獲取請求信息,
打開”網(wǎng)絡(luò)“,可以發(fā)現(xiàn)請求的數(shù)據(jù)非常非常多,而我們只想找剛剛請求的圖像數(shù)據(jù)。
這里再了解一個新技術(shù)–XHR,關(guān)于XHR,推薦一篇文章XHR-點擊跳轉(zhuǎn),簡單來說,在XHR之前,網(wǎng)頁要獲取客戶端和服務(wù)器的任何狀態(tài)更新,都需要刷新一次,而XHR可以不用刷新就請求到新的數(shù)據(jù)。剛才的下滾鼠標滾輪并沒有刷新界面信息。
打開”網(wǎng)絡(luò)“中的【XHR】,這里的數(shù)據(jù)都是通過XHR請求到的,通過名稱可以初步判斷出,請求到的文件是json格式的。
隨便點開一個文件,查看請求的url,可以發(fā)現(xiàn),url很長
比對以下不同文件的請求url,可以發(fā)現(xiàn)兩個【pn】和【gsm】不同(gsm可以不用管它,這是通信系統(tǒng))
對比多個文件,可以看到特點:
- pn:30
- pn:60
- pn:90
- ……
下滾鼠標滾輪,會添加一個新的json文件,實際上,pn表示一組數(shù)據(jù),一組數(shù)據(jù)包含30個圖像內(nèi)容,也就是第一次請求會得到30個圖像,再次請求會得到另外30個圖像。
現(xiàn)在已經(jīng)分析出查詢同種類型圖像的url特點,那么不同類型的請求url呢?
這里又查詢了一下”向日葵“,,pn也是按30、60、90進行排列的。對比”玫瑰“和”向日葵“的請求url,不同的屬性增加了【logid】、【queryWord】、【word】,而【queryWord】和【word】的信息是相同的,通過名稱可以看出,【queryWord】和【word】代表的是查詢信息。
queryWord=%E5%90%91%E6%97%A5%E8%91%B5
這后面的信息是編碼后的查詢數(shù)據(jù),至于為什么編碼,是因為URL只支持一部分ASCII編碼,而中文內(nèi)容需要進行編碼,才能用于url
使用在線URL編碼工具嘗試編碼”向日葵“,發(fā)現(xiàn)與url使用中的相同
到這里,我們可以嘗試一下這個url請求
import requests # 導入requests包
url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=6991546938775238432&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%90%91%E6%97%A5%E8%91%B5&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word=%E5%90%91%E6%97%A5%E8%91%B5&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&nojc=&pn=30&rn=30&gsm=1e&1635046467636='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'}
strhtml = requests.get(url, headers=headers) # Get方式獲取網(wǎng)頁數(shù)據(jù)
print(strhtml.text)
請求到的數(shù)據(jù)如下圖所示,可以看到返回結(jié)果是json格式的。
既然是json格式的,我們也不用BeautifulSoup進行解碼了,直接根據(jù)json格式獲取信息。
import requests # 導入requests包
import json
url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=6991546938775238432&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%90%91%E6%97%A5%E8%91%B5&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&word=%E5%90%91%E6%97%A5%E8%91%B5&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&fr=&expermode=&nojc=&pn=30&rn=30&gsm=1e&1635046467636='
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30'}
strhtml = requests.get(url, headers=headers) # Get方式獲取網(wǎng)頁數(shù)據(jù)
jsonInfo = json.loads(strhtml.text)
for index in range(30):
print(jsonInfo['data'][index]['thumbURL'])
點擊相應(yīng)的鏈接,可以查詢出相應(yīng)的圖像。
- 編寫爬蟲程序
經(jīng)過上面分析,基本上有了編寫程序的思路。
- 獲取請求url
- 解析出圖像對應(yīng)的url
- 根據(jù)圖像url下載圖像
根據(jù)設(shè)計思路,編寫爬蟲程序
# -*- coding:utf8 -*-
import requests
import json
from urllib import parse
import os
import time
class BaiduImageSpider(object):
def __init__(self):
self.json_count = 0 # 請求到的json文件數(shù)量(一個json文件包含30個圖像文件)
self.url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&logid=5179920884740494226&ipn=rj&ct' \
'=201326592&is=&fp=result&queryWord={' \
'}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word={' \
'}&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&nojc=&pn={' \
'}&rn=30&gsm=1e&1635054081427= '
self.directory = r"C:\Users\cun\Pictures\download\{}" # 存儲目錄 這里需要修改為自己希望保存的目錄 {}不要丟
self.header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/95.0.4638.54 Safari/537.36 Edg/95.0.1020.30 '
}
# 創(chuàng)建存儲文件夾
def create_directory(self, name):
self.directory = self.directory.format(name)
# 如果目錄不存在則創(chuàng)建
if not os.path.exists(self.directory):
os.makedirs(self.directory)
self.directory += r'\{}'
# 獲取圖像鏈接
def get_image_link(self, url):
list_image_link = []
strhtml = requests.get(url, headers=self.header) # Get方式獲取網(wǎng)頁數(shù)據(jù)
jsonInfo = json.loads(strhtml.text)
for index in range(30):
list_image_link.append(jsonInfo['data'][index]['thumbURL'])
return list_image_link
# 下載圖片
def save_image(self, img_link, filename):
res = requests.get(img_link, headers=self.header)
if res.status_code == 404:
print(f"圖片{img_link}下載出錯------->")
with open(filename, "wb") as f:
f.write(res.content)
print("存儲路徑:" + filename)
# 入口函數(shù)
def run(self):
searchName = input("查詢內(nèi)容:")
searchName_parse = parse.quote(searchName) # 編碼
self.create_directory(searchName)
pic_number = 0 # 圖像數(shù)量
for index in range(self.json_count):
pn = (index+1)*30
request_url = self.url.format(searchName_parse, searchName_parse, str(pn))
list_image_link = self.get_image_link(request_url)
for link in list_image_link:
pic_number += 1
self.save_image(link, self.directory.format(str(pic_number)+'.jpg'))
time.sleep(0.2) # 休眠0.2秒,防止封ip
print(searchName+"----圖像下載完成--------->")
if __name__ == '__main__':
spider = BaiduImageSpider()
spider.json_count = 10 # 定義下載10組圖像,也就是三百張
spider.run()
如果要使用上述程序的話,需要修改兩個地方:
- self.directory 這是本地存儲地址,修改為自己電腦的地址,另外,**{}**不要刪
- spider.json_count = 10 這是下載的圖像組數(shù),一組有30張圖像,10組就是三百張,根據(jù)需求下載
測試下載3組玫瑰,程序運行情況:
下載的玫瑰圖像數(shù)據(jù):
10組向日葵圖像:
值得注意的是,下載過程中使用了休眠,這里設(shè)置了下載一張圖像休眠0.2秒,是為了防止查詢過快導致ip地址被封,更進階的做法是添加【代理ip池】
3. 后言
爬蟲還是比較好入門的,這得益于成熟的爬蟲工具。
爬蟲可以滿足自己的個性化搜索需求,快動手試試吧。文章來源:http://www.zghlxwxcb.cn/news/detail-403565.html
如果覺得文章還不錯的話,留個贊再走吧,非常感謝?。?!文章來源地址http://www.zghlxwxcb.cn/news/detail-403565.html
到了這里,關(guān)于Python爬蟲系列(二)——Python爬蟲批量下載百度圖片的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!