人生苦短,我用 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.html

小白学 Python 爬虫(15):urllib 基础使用(五)的更多相关文章

  1. 小白学 Python 爬虫(13):urllib 基础使用(三)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  2. 小白学 Python 爬虫(11):urllib 基础使用(一)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  3. 小白学 Python 爬虫(12):urllib 基础使用(二)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  4. 小白学 Python 爬虫(14):urllib 基础使用(四)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  5. 小白学 Python 爬虫(16):urllib 实战之爬取妹子图

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  6. 小白学 Python 爬虫(17):Requests 基础使用

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  7. 小白学 Python 爬虫(30):代理基础

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  8. 小白学 Python 爬虫(32):异步请求库 AIOHTTP 基础入门

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

  9. 小白学 Python 爬虫(33):爬虫框架 Scrapy 入门基础(一)

    人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Li ...

随机推荐

  1. 分布式系统中session一致性问题

    业务场景 在单机系统中,用户登陆之后,服务端会保存用户的会话信息,只要用户不退出重新登陆,在一段时间内用户可以一直访问该网站,无需重复登陆.用户的信息存在服务端的 session 中,session中 ...

  2. 路由传参 query 和 params

    vue路由传参分为两种情况: 一.query和params传参的区别: 1.query传参显示参数,params传参不显示参数,params相对于query来说较安全一点. 2.取值方法也有不同:qu ...

  3. NOIP模拟赛 华容道 (搜索和最短路)蒟蒻的第一道紫题

    题目描述 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 B 玩的华容道 ...

  4. Promise对象及它在js中的执行顺序

    关于Promise对象的学习及它的执行顺序 学习阮一峰老师的ES6入门后的记录 1.promise的定义 promise是一个对象,通常包裹着一个异步操作,promise对象提供一些接口的方法,返回一 ...

  5. SSE图像算法优化系列三十:GIMP中的Noise Reduction算法原理及快速实现。

    GIMP源代码链接:https://gitlab.gnome.org/GNOME/gimp/-/archive/master/gimp-master.zip GEGL相关代码链接:https://gi ...

  6. SSM配置梳理

      这两天梳理了一下 SSM 的配置,做一个小总结   可能有一些不对的地方,如果您发现了什么错误,非常希望能帮忙指出,谢谢 我参考了很多文章,都标明了来源(链接),可能会影响阅读的连贯性,抱歉   ...

  7. iOS--通过runtime完成归档,反归档

    通过runtime,不管模型有多少属性,通过几句代码就能完成. 假设person类有N多个属性而是(这里随便写3个) .h #import <Foundation/Foundation.h> ...

  8. 小白学 Python(24):Excel 基础操作(下)

    人生苦短,我选Python 前文传送门 小白学 Python(1):开篇 小白学 Python(2):基础数据类型(上) 小白学 Python(3):基础数据类型(下) 小白学 Python(4):变 ...

  9. tensorflow中的学习率调整策略

    通常为了模型能更好的收敛,随着训练的进行,希望能够减小学习率,以使得模型能够更好地收敛,找到loss最低的那个点. tensorflow中提供了多种学习率的调整方式.在https://www.tens ...

  10. Mysql主从同步的实现原理与配置实战

    1.什么是mysql主从同步? 当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库. 2.主从同步有什么好处? 水平扩展数据库的负载能力. 容错,高可用.Failover ...