如何用python做一隻優雅的爬蟲?
在互聯網大數據時代,除了知名搜索引擎的爬蟲外,互聯網上還有大量的不知名、個人小爬蟲在運行。
這些爬蟲通常使用暴力方式突破Web伺服器的爬蟲檢測,導致了Web伺服器和爬蟲進入了一種惡戰狀態,最終爬蟲要付出很大的代價才能抓取Web數據,這是損人害己。
做一隻優雅的爬蟲其實很簡單,你只要了解Robots協議,在爬蟲程序設計中遵守該協議的實現就可以。該協議具體體現就是Web伺服器根目錄下的robots.txt文件,裡面規定了爬蟲的訪問許可、訪問時段、訪問頻率等重要參量。這些約定是Web服務端設定,遵守這些約定的爬蟲就是一個好爬蟲。兩者類似於甲方和乙方的關係。
可以使用python中的RobotFileParser類對robots.txt文件進行解析,並獲得訪問許可的判斷,以下是對該類的說明。該類的主要方法有:
set_url(url),設置指向robots.txt的URL。
read(),讀取robots.txt。
can_fetch(useragent, url),指定useragent及url,判斷useragent的爬蟲是否可以訪問url,返回值為True表示可以訪問,False表示不允許訪問。
crawl_delay(useragent),返回指定useragent的爬蟲,其抓取延時的值。如果robots.txt中沒有為useragent指定相應的抓取延時,則返回None。
request_rate(useragent),返回指定useragent的爬蟲,其抓取頻率的值。如果robots.txt中沒有為useragent指定相應的抓取頻率,則返回None。
下面的例子則展示如何使用該類來設計一個友好爬蟲。
首先從https://item.taobao.com/robots.txt看一下伺服器的約定。
User-agent: baiduspider
Disallow: /
User-Agent: Googlebot
Allow: /item.htm
以下是python代碼的實現,之所以是友好的,主要體現在if rp.can_fetch(useragent, url)這句上,實現有條件抓取,伺服器允許的才抓取。當然完整的友好爬蟲還需要實現訪問時段、訪問頻率的約定。
import urllib.robotparser
import urllib.request
#讀取robots.txt文件
rp = urllib.robotparser.RobotFileParser()
rp.set_url("https://item.taobao.com/robots.txt")
rp.read()
#模擬Baiduspider或Googlebot,僅僅只是為了驗證robotparser才這樣設置。
#冒充知名爬蟲的User-agent是不適合的。
useragent="Baiduspider"
url="https://item.taobao.com/item.htm?spm=a219r.lm897.14.38.5d2346e28rO73l&id=522811099442&ns=1&abbucket=7"
if rp.can_fetch(useragent, url):
data=file.read() #讀取全部
fb=open("bd-html","wb") #將爬取的網頁保存在本地
fb.write(data)
fb.close()
可以看到useragent="Baiduspider"時,該爬蟲不會抓取數據。而設置為Googlebot則可以抓取數據。
作者編著的《互聯網大數據處理技術與應用》專著(清華大學出版社,2017)、同名公眾號,專註於大數據技術的相關科學和工程知識傳播,同時也為讀者提供一些拓展閱讀材料。歡迎選用本書做大數據相關專業的教材,有相關教學資源共享。
...

