小白学 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
360Spider360 搜索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

相关推荐