Python3網絡爬蟲實戰---2三、使用Urllib:分析Robots協議

上一篇文章: Python3網絡爬蟲實戰---2二、使用Urllib:解析連接
下一篇文章:

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

1. Robots協議

Robots 協議也被稱做爬蟲協議、機器人協議,它的全名叫作網絡爬蟲排除標準(Robots Exclusion Protocol),用來告訴爬蟲和搜索引擎哪些頁面能夠抓取,哪些不能夠抓取。它一般是一個叫作 robots.txt 的文本文件,放在網站的根目錄下。html

當搜索爬蟲訪問一個站點時,它首先會檢查下這個站點根目錄下是否存在 robots.txt 文件,若是存在,搜索爬蟲會根據其中定義的爬取範圍來爬取。若是沒有找到這個文件,那麼搜索爬蟲便會訪問全部可直接訪問的頁面。python

下面咱們看一個 robots.txt 的樣例:segmentfault

User-agent: *
Disallow: /
Allow: /public/

以上的兩行實現了對全部搜索爬蟲只容許爬取 public目錄的做用。網絡

如上簡單的兩行,保存成 robots.txt 文件,放在網站的根目錄下,和網站的入口文件放在一塊兒。好比 index.php、index.html、index.jsp 等等。jsp

那麼上面的 User-agent 就描述了搜索爬蟲的名稱,在這裏將值設置爲 *,則表明該協議對任何的爬取爬蟲有效。好比咱們能夠設置:ide

User-agent: Baiduspider

這就表明咱們設置的規則對百度爬蟲是有效的。若是有多條 User-agent 記錄,則就會有多個爬蟲會受到爬取限制,但至少須要指定一條。函數

Disallow 指定了不容許抓取的目錄,好比上述例子中設置爲/則表明不容許抓取全部頁面。fetch

Allow 通常和 Disallow 一塊兒使用,通常不會單獨使用,用來排除某些限制,如今咱們設置爲 /public/ ,起到的做用是全部頁面不容許抓取,可是 public 目錄是能夠抓取的。網站

下面咱們再來看幾個例子感覺一下:
禁止全部爬蟲訪問任何目錄

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,下面的表格列出了一些常見的搜索爬蟲的名稱及對應的網站:

爬蟲名稱 名稱 網站
BaiduSpider 百度 www.baidu.com
Googlebot 谷歌 www.google.com
360Spider 360搜索 www.so.com
YodaoBot 有道 www.youdao.com
ia_archiver Alexa www.alexa.cn
Scooter altavista www.altavista.com

3. robotparser

瞭解了什麼是 Robots 協議以後,咱們就可使用 robotparser 模塊來解析 robots.txt 了。

robotparser 模塊提供了一個類,叫作 RobotFileParser。它能夠根據某網站的 robots.txt 文件來判斷一個爬取爬蟲是否有權限來爬取這個網頁。

使用很是簡單,首先看一下它的聲明

urllib.robotparser.RobotFileParser(url='')

使用這個類的時候很是簡單,只須要在構造方法裏傳入 robots.txt的連接便可。固然也能夠聲明時不傳入,默認爲空,再使用 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

4. 結語

以上介紹了 robotparser 模塊的基本用法和實例講解,利用它咱們就能夠方便地判斷哪些頁面能夠抓取哪些不能夠了。

相關文章
相關標籤/搜索