1. 程式人生 > >小白學 Python 爬蟲(15):urllib 基礎使用(五)

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

人生苦短,我用 Python

前文傳送門:

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

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

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

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

小白學 Python 爬蟲(5):前置準備(四)資料庫基礎

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

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

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

小白學 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.h