上一篇文章: Python3網絡爬蟲實戰---2二、使用Urllib:解析連接
下一篇文章:
利用 Urllib 的 robotparser 模塊咱們能夠實現網站 Robots 協議的分析,本節咱們來簡單瞭解一下它的用法。php
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 的一些常見寫法。
你們可能會疑惑,爬蟲名是哪兒來的?爲何就叫這個名?其實它是有固定名字的了,好比百度的就叫作 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 |
瞭解了什麼是 Robots 協議以後,咱們就可使用 robotparser 模塊來解析 robots.txt 了。
robotparser 模塊提供了一個類,叫作 RobotFileParser。它能夠根據某網站的 robots.txt 文件來判斷一個爬取爬蟲是否有權限來爬取這個網頁。
使用很是簡單,首先看一下它的聲明
urllib.robotparser.RobotFileParser(url='')
使用這個類的時候很是簡單,只須要在構造方法裏傳入 robots.txt的連接便可。固然也能夠聲明時不傳入,默認爲空,再使用 set_url() 方法設置一下也能夠。
有經常使用的幾個方法分別介紹一下:
以上是這個類提供的全部方法,下面咱們用實例來感覺一下:
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 模塊的基本用法和實例講解,利用它咱們就能夠方便地判斷哪些頁面能夠抓取哪些不能夠了。