從百度圖片下載一些圖片當做訓練集,好久沒寫爬蟲,生疏了。沒有任何反爬,隨便抓。
網頁:
動態加載,往下划會出現更多的圖片,一次大概30個。先找到保存每一張圖片的json,其對應的url:
打開調試,清空,然后往下划。然后出現:
點擊左側的鏈接,出現右邊的詳細信息,對應的就是URL。對這個url做請求即可。以下是代碼:
# -*- coding: utf-8 -*- # import tensorflow as tf # import os # import numpy as np import requests import my_fake_useragent as ua import re import random # 藍色背景 def blue_print(*s, end='\n'): for item in s: print('\033[46m {} \033[0m'.format(item), end='') print(end=end) # 高亮,綠色字體,紅色背景 def green_print(*s, end='\n'): # print('\033[1m {} \033[0m'.format(s), end=end) for item in s: print('\033[1;32;41m {} \033[0m'.format(item), end='') print(end=end) class download_data(): def __init__(self): # 初始化常用參數 # 請求頭 self.user_agent = ua.UserAgent() # 正則用於匹配響應內容中的圖片url self.pattern_url = r'"thumbURL":"(.*?)"' # 爬蟲:從網上下載數據集 def get_url_from_internet(self, url): for i in range(5): try: # print(self.user_agent.random()) res = requests.get(url, headers={'User-Agent': self.user_agent.random()}, timeout=5) # print(res.text) url_list = re.findall(self.pattern_url, res.text) # print(url_list) return url_list except: pass # 這里可以將請求失敗的url存入數據庫,防止數據丟失 return None def write_img(self, url): for i in range(3): try: # 真正下載圖片數據的,就這兩行代碼 res = requests.get(url, headers={'User-Agent': self.user_agent.random()}, timeout=5) img = res.content # print(img) # 將響應內容寫入本地*.jpg文件中 with open('dataset/monkey{}.jpg'.format(random.randint(10 ** 8, 10 ** 9)), 'wb') as f: f.write(img) print('monkey{} 下載完成'.format(random.randint(10 ** 8, 10 ** 9))) return except: pass # 這里可以將請求失敗的url存入數據庫,防止數據丟失 return None if __name__ == '__main__': tt = download_data() for page in range(0, 1000, 30): # 構造url,設置range的右邊界越大,下載的圖片就越多 url = 'https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result\ &queryWord=%E7%8C%B4%E5%AD%90+%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=&z=&ic=\ &hd=&latest=©right=&word=%E7%8C%B4%E5%AD%90+%E5%9B%BE%E7%89%87&s=&se=&tab=&width=&height=&face=\ &istype=&qc=&nc=&fr=&expermode=&force=&pn={}&rn=30&gsm=&1572502599384='.format(page) url_list = tt.get_url_from_internet(url) if url_list: for each_url in url_list: tt.write_img(each_url)
什么都不打印看着不舒服,隨便打印一些結果出來:
文件夾:
用網上的圖片作訓練集,而且還是自己抓的,效果估計不會太好。先用着看。自己手動將質量差的圖片刪一刪。
11-19
有時候會遇到一點點反爬,響應碼403,在headers中添加 "referer": "https://image.baidu.com"即可