利用urllib的robotparser
模塊,咱們能夠實現網站Robots協議的分析。本節中,咱們來簡單瞭解一下該模塊的用法。php
Robots協議也稱做爬蟲協議、機器人協議,它的全名叫做網絡爬蟲排除標準(Robots Exclusion Protocol),用來告訴爬蟲和搜索引擎哪些頁面能夠抓取,哪些不能夠抓取。它一般是一個叫做robots.txt的文本文件,通常放在網站的根目錄下。html
當搜索爬蟲訪問一個站點時,它首先會檢查這個站點根目錄下是否存在robots.txt文件,若是存在,搜索爬蟲會根據其中定義的爬取範圍來爬取。若是沒有找到這個文件,搜索爬蟲便會訪問全部可直接訪問的頁面。python
下面咱們看一個robots.txt的樣例:bash
User-agent: *
Disallow: /
Allow: /public/
複製代碼
這實現了對全部搜索爬蟲只容許爬取public目錄的功能,將上述內容保存成robots.txt文件,放在網站的根目錄下,和網站的入口文件(好比index.php、index.html和index.jsp等)放在一塊兒。微信
上面的User-agent
描述了搜索爬蟲的名稱,這裏將其設置爲*則表明該協議對任何爬取爬蟲有效。好比,咱們能夠設置:網絡
User-agent: Baiduspider
複製代碼
這就表明咱們設置的規則對百度爬蟲是有效的。若是有多條User-agent
記錄,則就會有多個爬蟲會受到爬取限制,但至少須要指定一條。jsp
Disallow
指定了不容許抓取的目錄,好比上例子中設置爲/則表明不容許抓取全部頁面。ide
Allow
通常和Disallow
一塊兒使用,通常不會單獨使用,用來排除某些限制。如今咱們設置爲/public/
,則表示全部頁面不容許抓取,但能夠抓取public目錄。fetch
下面咱們再來看幾個例子。禁止全部爬蟲訪問任何目錄的代碼以下:網站
User-agent: *
Disallow: /
複製代碼
容許全部爬蟲訪問任何目錄的代碼以下:
User-agent: *
Disallow:
複製代碼
另外,直接把robots.txt文件留空也是能夠的。
禁止全部爬蟲訪問網站某些目錄的代碼以下:
User-agent: *
Disallow: /private/
Disallow: /tmp/
複製代碼
只容許某一個爬蟲訪問的代碼以下:
User-agent: WebCrawler
Disallow:
User-agent: *
Disallow: /
複製代碼
這些是robots.txt的一些常見寫法。
你們可能會疑惑,爬蟲名是哪兒來的?爲何就叫這個名?其實它是有固定名字的了,好比百度的就叫做BaiduSpider。表3-1列出了一些常見的搜索爬蟲的名稱及對應的網站。
表3-1 一些常見搜索爬蟲的名稱及其對應的網站
瞭解Robots協議以後,咱們就可使用robotparser
模塊來解析robots.txt了。該模塊提供了一個類RobotFileParser
,它能夠根據某網站的robots.txt文件來判斷一個爬取爬蟲是否有權限來爬取這個網頁。
該類用起來很是簡單,只須要在構造方法裏傳入robots.txt的連接便可。首先看一下它的聲明:
urllib.robotparser.RobotFileParser(url='')
複製代碼
固然,也能夠在聲明時不傳入,默認爲空,最後再使用set_url()
方法設置一下也可。
下面列出了這個類經常使用的幾個方法。
set_url()
:用來設置robots.txt文件的連接。若是在建立RobotFileParser
對象時傳入了連接,那麼就不須要再使用這個方法設置了。read()
:讀取robots.txt文件並進行分析。注意,這個方法執行一個讀取和分析操做,若是不調用這個方法,接下來的判斷都會爲False
,因此必定記得調用這個方法。這個方法不會返回任何內容,可是執行了讀取操做。parse()
:用來解析robots.txt文件,傳入的參數是robots.txt某些行的內容,它會按照robots.txt的語法規則來分析這些內容。can_fetch()
:該方法傳入兩個參數,第一個是User-agent
,第二個是要抓取的URL。返回的內容是該搜索引擎是否能夠抓取這個URL,返回結果是True
或False
。mtime()
:返回的是上次抓取和分析robots.txt的時間,這對於長時間分析和抓取的搜索爬蟲是頗有必要的,你可能須要按期檢查來抓取最新的robots.txt。modified()
:它一樣對長時間分析和抓取的搜索爬蟲頗有幫助,將當前時間設置爲上次抓取和分析robots.txt的時間。下面咱們用實例來看一下:
from urllib.robotparser import RobotFileParser
rp = RobotFileParser()
rp.set_url('http://www.jianshu.com/robots.txt')
rp.read()
print(rp.can_fetch('*', 'http://www.jianshu.com/p/b67554025d7d'))
print(rp.can_fetch('*', "http://www.jianshu.com/search?q=python&page=1&type=collections"))
複製代碼
這裏以簡書爲例,首先建立RobotFileParser
對象,而後經過set_url()
方法設置了robots.txt的連接。固然,不用這個方法的話,能夠在聲明時直接用以下方法設置:
rp = RobotFileParser('http://www.jianshu.com/robots.txt')
複製代碼
接着利用can_fetch()
方法判斷了網頁是否能夠被抓取。
運行結果以下:
True
False
複製代碼
這裏一樣可使用parser()
方法執行讀取和分析,示例以下:
from urllib.robotparser import RobotFileParser
from urllib.request import urlopen
rp = RobotFileParser()
rp.parse(urlopen('http://www.jianshu.com/robots.txt').read().decode('utf-8').split('\n'))
print(rp.can_fetch('*', 'http://www.jianshu.com/p/b67554025d7d'))
print(rp.can_fetch('*', "http://www.jianshu.com/search?q=python&page=1&type=collections"))
複製代碼
運行結果同樣:
True
False
複製代碼
本節介紹了robotparser
模塊的基本用法和實例,利用它,咱們能夠方便地判斷哪些頁面能夠抓取,哪些頁面不能夠抓取。
本資源首發於崔慶才的我的博客靜覓: Python3網絡爬蟲開發實戰教程 | 靜覓
如想了解更多爬蟲資訊,請關注個人我的微信公衆號:進擊的Coder
weixin.qq.com/r/5zsjOyvEZ… (二維碼自動識別)