導讀
有些時候我們需要構建一個自己的資料集來訓練模型。但是,卻苦於沒有大量的資料,此時就需要去谷歌、百度、必應搜尋引擎上去爬取一些圖片作為自己的資料集。
很自然的,我們就會想到寫一個爬蟲的程式去爬取圖片,然後就開始學習scrapy、Beautiful Soup、Selenium,除此之外還需要學習一些HTML和JS來解析網頁獲取我們想要的資料。這樣看起來,好像點複雜。畢竟我們只是想爬取點圖片,為什麼要搞的如此複雜。
icrawler就可以幫我們輕鬆解決這些問題,不需要去學習其他的庫了,甚至連解析網頁這樣的工作也不需要我們做。
icrawer官網教程:https://icrawler.readthedocs.io/en/latest/
icrawler是一個mini的web爬蟲框架,按照模組化的設計標準,我們能夠很容易的去使用和繼承它,支援圖片、視訊以及文字等資訊的爬取。相對於功能強大的scrapy來說,icrawer要輕便小很多。icrawler也提供了很好的多執行緒、異常處理和執行緒排程的支援,提供了抓取搜尋引擎網站(谷歌、百度、必應)上的圖片的內建方法。
環境要求python版本:2.7+或3.4+
安裝方法pip安裝pip install icrawlerconda安裝
conda install -c hellock icrawler
爬取搜尋引擎上的圖片
我們將通過示例來介紹,如何通過icrawler從百度上抓取圖片,對於從必應和谷歌上抓取圖片的方式類似,就不重複介紹了。
icrawler結構設計crawler主要由三個部分組成,Feeder、Parser、Downloader,每一個都連線一個FIFO佇列。url_queue儲存可能包含圖片網頁的url地址,task_queue儲存媒體資料(圖片、視訊、文字)的url地址,task_queue佇列中的每個元素都是一個字典,每個字典必須包含img_url屬性。Feeder將網頁的url地址放到url_queue中,Parser解析網頁將媒體資料的url放到task_queue中,Downloder從task_queue中獲取媒體資料的url下載並儲存到本地。從百度爬取圖片from icrawler.builtin import BaiduImageCrawler#設定圖片儲存目錄save_img_dir = r"D:\\dataset\\icrawler_dataset"#定義一個圖片的Crawler物件baidu_crawler = BaiduImageCrawler(storage={"root_dir":save_img_dir})#設定搜尋的關鍵詞和從百度上爬取圖片的數量baidu_crawler.crawl(keyword="二哈",max_num=10)
在從搜尋引擎上爬取圖片的過程中會從控制檯輸出一些資訊
從百度爬取到的圖片
有些圖片肯定是不符合要求的,後續大家可以根據自己的要求做一下後處理工作,將部分圖片剔除。
爬取圖片引數設定
在下載圖片的時候,我們可以設定引數來過濾一些圖片,還可以設定執行緒數來加快下載速度
不同的搜尋引擎能夠設定的引數會有一些差別,在呼叫crawl方法的時候我們可以設定filters引數設定下載圖片的過濾條件,如上圖紅色方框中的引數。
GoogleImageCrawler:
BingImageCrawler:
type:同上color:同上size:同上license:同上layout:版式,square、wide、tallpeople:人物、face、portraitdate:同上BaiduImageCrawler
type:同上color:同上from icrawler.builtin import BaiduImageCrawler#設定圖片儲存目錄save_img_dir = r"D:\\dataset\\icrawler_dataset"#定義一個圖片的Crawler物件baidu_crawler = BaiduImageCrawler( feeder_threads=1,#設定獲取網頁連結的執行緒數 parser_threads=1,#設定解析網頁的執行緒數 downloader_threads=5,#設定下載圖片的執行緒數 storage={"root_dir":save_img_dir})#設定引數filters_config = dict( type="animated",#下載動圖 color="orange")#設定搜尋的關鍵詞和從百度上爬取圖片的數量baidu_crawler.crawl(keyword="二哈",filters=filters_config,offset=0,max_num=10)代理設定
如果需要爬取Google或者一些海外網站的資料,需要設定代理,icrawler提供了兩種不同代理的設定方式,BaiduImageCrawler類繼承了Crawler類,如果想要設定代理我們只需要重新set_proxy_pool方法
代理小於30個def set_proxy_pool(self): self.proxy_pool = ProxyPool() self.proxy_pool.default_scan(region='overseas', expected_num=10, out_file='proxies.json')
上面的程式會自動掃描10個有效代理,然後去請求網頁下載圖片資料
自定義掃描代理需求我們可以根據自己對於代理掃描的需求來自定義代理掃描函式
def set_proxy_pool(self): proxy_scanner = ProxyScanner() proxy_scanner.register_func(proxy_scanner.scan_file, {'src_file': 'proxy_overseas.json'}) proxy_scanner.register_func(your_own_scan_func, {'arg1': '', 'arg2': ''}) self.proxy_pool.scan(proxy_scanner, expected_num=10, out_file='proxies.json')
每次請求會從proxy_pool中獲取一個代理然後發起請求,每個代理都會有一個proxy_weight引數,proxy_weight引數的取值範圍在0到1之間,掃描程式會根據成功和失敗的次數來增加或減少proxy_weight的大小,proxy_weight值越大,被選中的機會越大。
自定義Crawler我們可以根據BaiduImageCrawler的結構來自定義一個類,爬取網站的資料,官網有詳細介紹,這裡就不說明了。