【Python3網絡爬蟲開發實戰】3.1.4-分析Robots協議

利用urllib的robotparser模塊,咱們能夠實現網站Robots協議的分析。本節中,咱們來簡單瞭解一下該模塊的用法。php

1. Robots協議

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的一些常見寫法。

2. 爬蟲名稱

你們可能會疑惑,爬蟲名是哪兒來的?爲何就叫這個名?其實它是有固定名字的了,好比百度的就叫做BaiduSpider。表3-1列出了一些常見的搜索爬蟲的名稱及對應的網站。

表3-1 一些常見搜索爬蟲的名稱及其對應的網站

3. robotparser

瞭解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,返回結果是TrueFalse
  • 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… (二維碼自動識別)

相關文章
相關標籤/搜索