當前位置:
首頁 > 最新 > 如何用python做一隻優雅的爬蟲?

如何用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)、同名公眾號,專註於大數據技術的相關科學和工程知識傳播,同時也為讀者提供一些拓展閱讀材料。歡迎選用本書做大數據相關專業的教材,有相關教學資源共享。

...


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |