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