自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

編寫爬蟲竟然成了“面向監(jiān)獄編程”,就是因為不懂Robots協(xié)議

網(wǎng)絡(luò) 網(wǎng)絡(luò)管理
編寫Python爬蟲很容易,不過要想安全地編寫Python爬蟲,就需要了解更多的至少,不光是技術(shù)上的,還有法律上的,Robots協(xié)議就是其中之一,如果不了解Robots協(xié)議,抓取了不該抓取的東西,可能會面臨牢獄之災(zāi)哦!

[[386960]]

編寫Python爬蟲很容易,不過要想安全地編寫Python爬蟲,就需要了解更多的至少,不光是技術(shù)上的,還有法律上的,Robots協(xié)議就是其中之一,如果不了解Robots協(xié)議,抓取了不該抓取的東西,可能會面臨牢獄之災(zāi)哦!

1. Robots協(xié)議簡介

Robots協(xié)議也稱作爬蟲協(xié)議、機(jī)器人協(xié)議,它的全名是網(wǎng)絡(luò)爬蟲排除標(biāo)準(zhǔn)(Robots Exclusing Protocol),用來告訴爬蟲和搜索引擎哪些頁面可以抓取,哪些不可以抓取。該協(xié)議的內(nèi)容通常放在一個名為robots.txt的文本文件中,該文件一般位于網(wǎng)站的根目錄下。

注意,robots.txt文件中的內(nèi)容只是告訴爬蟲應(yīng)該抓取什么,不應(yīng)該抓取什么,但并不是通過技術(shù)手段阻止爬蟲抓取那些被禁止的資源,而只是通知爬蟲而已。盡管編寫爬蟲可以不遵循robots.txt文件的描述,但作為一只有道德、有文化、有紀(jì)律的爬蟲,應(yīng)該盡量遵循robots.txt文件描述的規(guī)則。否則,有可能會引起法律糾紛。

當(dāng)爬蟲訪問一個網(wǎng)站時,首先會檢查這個網(wǎng)址根目錄下是否存在robots.txt文件,如果存在,爬蟲就會根據(jù)該文件中定義的抓取范圍來抓取Web資源。如果這個文件并不存在,爬蟲就會抓取這個網(wǎng)站所有可直接訪問的頁面。下面來看一個robots.txt文件的例子:

  1. User-agent:* 
  2. Disallow:/ 
  3. Allow:/test/ 

這個抓取規(guī)則首先告訴爬蟲對所有的爬蟲有效,而且除了test目錄外的任何資源都不允許抓取。如果將這個robots.txt文件放在某個網(wǎng)站的根目錄,那么搜索引擎的爬蟲就會只抓取test目錄下的資源,我們會發(fā)現(xiàn)搜索引擎中再也查不到其他目錄下的資源了。

上面的User-agent描述了爬蟲的名字,這里將其設(shè)置為*,則表示對所有的爬蟲有效,我們還可以特指某些爬蟲,如下面的設(shè)置明確指定百度爬蟲。

  1. User-agent:BaiduSpider 

robots.txt文件中有2個重要的授權(quán)指令:Disallow和Allow,前者表示禁止抓取,后者表示運(yùn)行抓取。也就是說,Disallow是黑名單,Allow是白名單。 例如,下面是一些Robots協(xié)議的例子。

1. 禁止所有爬蟲抓取網(wǎng)站所有的資源

  1. User-agent:* 
  2. Disallow:/ 

2. 禁止所有爬蟲抓取網(wǎng)站/private和/person目錄中的資源

  1. User-agent: * 
  2. Disallow: /private/ 
  3. Disallow:/person/ 

3. 只禁止百度爬蟲抓取網(wǎng)站資源

  1. User-agent:BaiduSpider 
  2. Disallow:/ 

很多搜索引擎的爬蟲都有特定的名稱,表1列出了一些常用的爬蟲名稱。

表1 常用的爬蟲名稱

爬蟲名稱
搜索引擎
網(wǎng)站
Googlebot
谷歌
www.google.com
BaiduSpider
百度
www.baidu.com
360Spider
360搜索
www.so.com
Bingbot
必應(yīng)
www.bing.com

2. 分析Robots協(xié)議

Robots協(xié)議并不需要我們自己去分析,urllib庫的robotparser模塊提供了相應(yīng)的API來解析robots.txt文件,這就是RobotFileParser類。可以用多種方式使用RobotFileParser類。例如,可以通過set_url方法設(shè)置robots.txt文件的URL,然后進(jìn)行分析,代碼如下:

  1. form urllib.robotparser import RobotFileParser 
  2. robot = RobotFileParser() 
  3. robot.set_url('https://www.jd.com/robots.txt'
  4. robot.read() 
  5. print(robot.can_fetch('*','https://www.jd.com/test.js')) 

其中can_fetch方法用來獲得該網(wǎng)站某一個URL根據(jù)Robots協(xié)議是否有權(quán)抓取,如果可以抓取,返回True,否則返回False。

RobotFileParser類的構(gòu)造方法也可以接受一個URL,然后使用can_fetch方法判斷是否可以抓取某一個頁面。

  1. robot = RobotFileParser('https://www.jd.com/robots.txt'
  2. print(robot.can_fetch('*','https://www.jd.com/test.js')) 

下面的案例使用了parse方法指定robots.txt文件的數(shù)據(jù),并輸出不同的URL是否允許抓取,這是另外一種使用RobotFileParser類的方式。

  1. from urllib.robotparser import RobotFileParser 
  2. from urllib import request 
  3. robot = RobotFileParser() 
  4. url = 'https://www.jianshu.com/robots.txt' 
  5. headers = { 
  6.     'User-Agent''Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
  7.     'Host''www.jianshu.com'
  8. req = request.Request(url=url, headers=headers) 
  9.   
  10. # 抓取robots.txt文件的內(nèi)容,并提交給parse方法進(jìn)行分析 
  11. robot.parse( request.urlopen(req).read().decode('utf-8').split('\n')) 
  12. # 輸出True 
  13. print(robot.can_fetch('*','https://www.jd.com')) 
  14. # 輸出True 
  15. print(robot.can_fetch('*','https://www.jianshu.com/p/92f6ac2c350f')) 
  16. # 輸出False 
  17. print(robot.can_fetch('*','https://www.jianshu.com/search?q=Python&page=1&type=note')) 

運(yùn)行結(jié)果如下:

  1. True 
  2. True 
  3. False 

本文轉(zhuǎn)載自微信公眾號「極客起源」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系極客起源公眾號。

 

責(zé)任編輯:武曉燕 來源: 極客起源
相關(guān)推薦

2021-05-07 06:15:32

編程開發(fā)端口掃描

2020-11-08 14:34:31

小視頻瀏覽器

2016-12-12 15:22:41

編程

2022-07-30 23:41:53

面向過程面向?qū)ο?/a>面向協(xié)議編程

2019-10-28 10:57:35

程序員監(jiān)獄編程

2018-05-10 13:45:15

Swift網(wǎng)絡(luò)層協(xié)議

2015-04-14 10:39:09

iWatch蘋果

2019-10-28 10:21:00

程序員網(wǎng)絡(luò)爬蟲數(shù)據(jù)

2021-01-27 12:22:08

Python爬蟲代碼

2021-06-03 08:55:58

面向協(xié)議編程

2020-04-21 09:49:41

運(yùn)維編程系統(tǒng)

2015-04-13 10:32:32

2013-06-13 08:58:02

iOS7WWDCDesign By C

2010-10-26 10:37:31

Java之父蘋果

2018-03-07 18:14:07

物聯(lián)網(wǎng)信息網(wǎng)絡(luò)

2020-07-29 10:02:47

Java內(nèi)存故障內(nèi)存

2020-07-27 08:08:47

Java內(nèi)存JVM

2021-04-07 17:06:55

String Final存儲

2021-06-04 09:01:27

Cocoa 協(xié)議編程 Swift

2012-05-28 10:47:33

跳槽程序員
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號