人生苦短,我用 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. 原生JS实现队结构及利用队列模拟‘击鼓传花’游戏

    1. 前言 队列,是一种遵从先进先出(FIFO,First-In-First-Out)原则的有序集合.队列在尾部添加新元素,并从顶部移除元素,最新添加的元素必须排在队列的末尾. 2.功能说明 enqu ...

  2. Apache Flink任意Jar包上传导致远程代码执行漏洞复现

    0x00 简介 Apache Flink是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎.Flink以数据并行和流水线方式执行任意流数据程序,Fl ...

  3. python——函数的基本概念

    Python函数认识 数学定义 y = f(x), y是x的函数,x是自变量. python中的函数组成 由若干语句组成的语句块.函数名称.参数列表构成,函数是组织代码的最小单元 像一个黑盒子,我们给 ...

  4. 5种常见Bean映射工具的性能比对

    本文由 JavaGuide 翻译自 https://www.baeldung.com/java-performance-mapping-frameworks .转载请注明原文地址以及翻译作者. 1. ...

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

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

  6. 深入理解计算机系统 第二章 信息的表示和处理 Part1 第二遍

    <深入理解计算机系统> 第三版 第二遍读这本书,每周花两到三小时时间,能读多少读多少(这次看了 22 ~ 28 页) 第一遍对应笔记链接 https://www.cnblogs.com/s ...

  7. Reporting service个人使用经验

    (此文章是从自己写的Word文档里复制过来的,图没有了,文字也有些乱,凑合看吧) 部署环境 Windows server 2012 R2 软件环境 安装完整的sqlsever2012,IIS服务 需要 ...

  8. PHP 核心特性 - 命名空间

    提出 在命名空间提出之前,不同的组件很容易碰到命名的冲突,例如 Request .Response 等常见的命名.PHP 在 5.3 后提出了命名空间用来解决组件之间的命名冲突问题,主要参考了文件系统 ...

  9. __FILE__ basename() 作用

    __FILE__  basename() 作用 __FILE__ 获取当前文件或文件夹的绝对路径 basename(__FILE__) 获取当前文件或文件夹的名称 basename(__FILE__, ...

  10. lqb 基础练习 闰年判断

    基础练习 闰年判断 时间限制:1.0s   内存限制:256.0MB     问题描述 给定一个年份,判断这一年是不是闰年. 当以下情况之一满足时,这一年是闰年: 1. 年份是4的倍数而不是100的倍 ...