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

若是个人文章对您有帮助,请扫码关注下做者的公众号:获取最新干货推送:)
相关文章
相关标签/搜索