小白學 Python 爬蟲(15):urllib 基礎使用(五)

人生苦短,我用 Pythonhtml

前文傳送門:python

小白學 Python 爬蟲(1):開篇git

小白學 Python 爬蟲(2):前置準備(一)基本類庫的安裝github

小白學 Python 爬蟲(3):前置準備(二)Linux基礎入門數據庫

小白學 Python 爬蟲(4):前置準備(三)Docker基礎入門安全

小白學 Python 爬蟲(5):前置準備(四)數據庫基礎網絡

小白學 Python 爬蟲(6):前置準備(五)爬蟲框架的安裝框架

小白學 Python 爬蟲(7):HTTP 基礎iphone

小白學 Python 爬蟲(8):網頁基礎ide

小白學 Python 爬蟲(9):爬蟲基礎

小白學 Python 爬蟲(10):Session 和 Cookies

小白學 Python 爬蟲(11):urllib 基礎使用(一)

小白學 Python 爬蟲(12):urllib 基礎使用(二)

小白學 Python 爬蟲(13):urllib 基礎使用(三)

小白學 Python 爬蟲(14):urllib 基礎使用(四)

引言

前面幾篇 urllib 的基礎介紹,分別介紹了 urllib 的處理 URL 的模塊,還剩最後一個 robotparser 模塊未作介紹,本篇文章來簡單的聊聊 robotparser 。

Robotparser 從命名上來看,好像是說機器人,實際上這裏的機器人指的是爬蟲。

在說 Robotparser 以前,咱們先介紹一個概念:Robots協議。

Robots 協議

Robots 協議也稱做爬蟲協議、機器人協議,它的全名叫做網絡爬蟲排除標準(Robots Exclusion Protocol)。

Robots 協議一般會保存在一個叫作 robots.txt 的文本文件中,該文件通常位於網站的跟目錄中。

這個文件中記載了該網站哪些目錄容許爬取,哪些目錄不容許爬取。

雖然這個文件並非強制生效的,可是各位同窗最好能夠遵循此文件定義的爬取規則。

最近不少搞爬蟲的公司都進去了,各位同窗必定引覺得戒,作一位知法守法的好公民。

咱們來看一下淘寶的 Robots 協議,一塊兒瞭解下 Robots 協議的語法規則:

如下 robots.txt 內容來源:https://www.taobao.com/robots.txt ,因爲內容過多,僅截取部份內容。

User-agent:  Baiduspider
Allow:  /article
Allow:  /oshtml
Allow:  /ershou
Allow: /$
Disallow:  /product/
Disallow:  /

User-Agent:  Googlebot
Allow:  /article
Allow:  /oshtml
Allow:  /product
Allow:  /spu
Allow:  /dianpu
Allow:  /oversea
Allow:  /list
Allow:  /ershou
Allow: /$
Disallow:  /

......複製代碼

能夠看到,一個 robots.txt 總共分爲三個部分:

  • User-Agent:描述了搜索爬蟲的名稱,若是設置爲 * 則表明對全部爬蟲生效。
  • Allow:指定了雲訊爬取的目錄。
  • Disallow:指定了不容許爬取的目錄,通常和 Allow 配合使用。

好比上面的這個 Robots 協議,其中的內容定義了百度爬蟲和谷歌爬蟲的爬取規則,其中對百度爬蟲定義了的可爬取路徑有 /article/oshtml/ershou/$ ,不可爬取的路徑有 /product// 目錄。

各位同窗可能會有疑問,爬蟲的名字是哪來的呢?

emmmmmmmmm,這個小編也不清楚,就當作一些固定用法吧,下表列出一些常見的爬蟲名稱:

爬蟲名稱 來源 來源網站
BaiduSpider 百度搜索 www.baidu.com
Googlebot 谷歌搜索 www.google.com
360Spider 360 搜索 www.so.com
Bingbot 必應搜索 cn.bing.com
Yisouspider 神馬搜索 m.sm.cn
Sogouspider 搜狗搜索 www.sogou.com
Yahoo! Slurp 雅虎搜索 www.yahoo.com
Sosospider 搜搜 www.soso.com

robotparser

官方文檔:https://docs.python.org/zh-cn/3.7/library/urllib.robotparser.html

在瞭解了什麼是 Robots 協議以後,咱們可使用 robotparser 來解析 Robots 協議。

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

首先咱們看一下這個類的聲明:

urllib.robotparser.RobotFileParser(url='')複製代碼

看起來很簡單,只須要在構造方法中傳入 robots.txt 的路徑便可。

接下來咱們來看下這個類所具備的方法:

  • set_url(url): 若是在聲明 `RobotFileParser` 的時候沒有傳入 `robots.txt` 的路徑,能夠調用這個方法傳入 `robots.txt` 的路徑。
  • read():讀取 robots.txt 文件並進行分析。注意,這個方法執行一個讀取和分析操做,若是不調用這個方法,接下來的判斷都會爲 False ,因此必定記得調用這個方法。這個方法不會返回任何內容,可是執行了讀取操做。
  • parse(lines):用來解析 robots.txt 文件,傳入的參數是 robots.txt 某些行的內容,它會按照 robots.txt 的語法規則來分析這些內容。
  • can_fetch(useragent, url):該方法傳入兩個參數,第一個是 User-agent ,第二個是要抓取的 URL 。返回的內容是該搜索引擎是否能夠抓取這個 URL ,返回結果是 True 或 False 。
  • mtime():返回的是上次抓取和分析 robots.txt 的時間,這對於長時間分析和抓取的搜索爬蟲是頗有必要的,你可能須要按期檢查來抓取最新的 robots.txt
  • modified():它一樣對長時間分析和抓取的搜索爬蟲頗有幫助,將當前時間設置爲上次抓取和分析 robots.txt 的時間。
  • crawl_delay(useragent):從 `robots.txt` 返回有關用戶代理的抓取延遲參數的值。 若是沒有這樣的參數,或者該參數不適用於指定的用戶代理,或者該參數的 `robots.txt` 條目的語法無效,則返回 None 。
  • request_rate(useragent):以指定的元組 RequestRate(requests,seconds) 的形式從 `robots.txt` 返回 Request-rate 參數的內容。 若是沒有這樣的參數,或者該參數不適用於指定的用戶代理,或者該參數的 `robots.txt` 條目的語法無效,則返回 None 。

舉一個簡單的例子:

import urllib.robotparser

rp = urllib.robotparser.RobotFileParser()
rp.set_url("https://www.taobao.com/robots.txt")
rp.read()

print(rp.can_fetch('Googlebot', 'https://www.taobao.com/article'))
print(rp.can_fetch('Googlebot', "https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q=iphone&suggest=history_1&_input_charset=utf-8&wq=&suggest_query=&source=suggest"))複製代碼

執行結果以下:

True
False複製代碼

小編這裏就用某寶作栗子了,首先建立 RobotFileParser 對象,而後經過 set_url() 方法設置了 `robots.txt` 的連接。

固然,不用這個方法的話,能夠在聲明時直接用以下方法設置:

rp = urllib.robotparser.RobotFileParser('https://www.taobao.com/robots.txt')複製代碼

接着利用 can_fetch() 方法判斷了網頁是否能夠被抓取。

小結

本篇內容到這裏就結束了,內容比較簡單,但願各位同窗之後在寫爬蟲時候能夠遵循 Robot 協議,爲了本身的安全着想。

但願各位同窗能夠本身動手實際操做試試看。

示例代碼

本系列的全部代碼小編都會放在代碼管理倉庫 Github 和 Gitee 上,方便你們取用。

示例代碼-Github

示例代碼-Gitee

參考

https://www.cnblogs.com/zhangxinqi/p/9170312.html

若是個人文章對您有幫助,請掃碼關注下做者的公衆號:獲取最新干貨推送:)
相關文章
相關標籤/搜索