百度鮮花影象爬取
深度學習依賴大量的資料,除了使用公開的資料集之外就是利用Python的爬蟲技術自己收集和整理,爬蟲的本質是利用程式碼模擬瀏覽器向網頁發起請求,得到網站的相應進行分析從中獲取想要爬取的資料,本例子利用程式碼在百度圖片上搜索鮮花,將搜尋到的圖片儲存到本地。
首先對百度圖片搜尋鮮花頁面進行分析,圖片是不斷動態載入的,它是一個ajax請求,右鍵點選檢查項開啟網頁分析視窗,檢視新載入資料的URL及引數,引數中有queryWord和Word的值為搜尋框輸入的鮮花關鍵字,引數pn為從第幾張開始載入,rn為載入多少張圖片,將響應內容利用json解析工具進行解析,每張圖片的的地址在thumbURL中。
根據上面的分析設計設計函式get_param(keyword,paginator)根據輸入的關鍵字和頁數,生成請求引數;定義函式get_urls(url,params) 拼接形成每一頁的完整請求連結;定義函式get_image_url(urls,headers)獲取頁面響應,並轉換成json格式,json資料的data欄位中提取thumbURL欄位值即每張圖片的地址;定義函式get_image(keyword,image_url)請求圖片地址,將圖片資料下載到本地資料夾。
# 根據輸入的關鍵字和頁數,生成請求引數
def get_param(keyword,paginator):
keyword=urllib.parse.quote(keyword) #對中文關鍵詞轉換編碼
params=[]
for i in range(1,paginator+1):
# 因為頁面圖片是動圖載入的
params.append('tn=resultjson_com&logid=10338332981203604364&ipn=rj&ct=201326592&is=&fp=result&fr=&word={}&queryWord={}&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=&hd=&latest=©right=&s=&se=&tab=&width=&height=&face=&istype=&qc=&nc=1&expermode=&nojc=&isAsync=&pn={}&rn=30&gsm=78&1650241802208='.format(keyword,keyword,30*i))
return params
# 定義函式拼接形成每一頁的完整請求連結
def get_urls(url,params):
urls=[]
for param in params:
urls.append(url+param)
return urls
# 獲取頁面,將相應轉換成json格式,從data欄位提取每一張圖片的地址
def get_image_url(urls,headers):
image_url=[]
for url in urls:
page_json=requests.get(url,headers=headers).json()
page_data=page_json.get('data')
for data in page_data:
if data:
image_url.append(data.get('thumbURL'))
return image_url
# 獲取圖片地址將圖片儲存到本地資料夾中
def get_image(keyword,image_url):
file_name=os.path.join('.',keyword)
print(file_name)
if not os.path.exists(file_name):
os.mkdir(file_name)
for index,url in enumerate(image_url,start=1):
with open(file_name+'/{}.jpg'.format(index),'wb')as f:
f.write(requests.get(url,headers=headers).content)
if index !=0 and index % 30==0:
print('第{}頁下載完成'.format(index/30))
if __name__=='__main__':
url='http://image.baidu.com/search/acjson?'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/100.0.4896.60 Safari/537.36'}
# 只需要修改下面的關鍵字和頁數,就爬取不同的百度影象
keyword='鮮花' #定義關鍵字
paginator=2 #定義要爬取的頁數
params=get_param(keyword,paginator)
urls=get_urls(url,params)
image_urls=get_image_url(urls,headers)
get_image(keyword,image_urls)