近两年出现曾报道一些关于非法抓取数据的程序员被告上法庭的事例, 而非法抓取的一个典型做法就是不遵守网站的 robots.txt
规则进行爬取. 早年就曾有搜索引擎不遵守淘宝的 robots.txt
还去收录网站的信息被告的案例.
在 Scrapy
中的 settings.py
中默认是遵守 robots.txt
的, 一般我们也不会去关闭.
禁止示例
今天在做收集新闻数据爬虫的时候便碰到被 robots.txt
禁止的情况. 笔者在拿到网站 json 数据接口准备测试的时候, 发现网站的响应内容为空, 而浏览器仍可正常访问.
再看回终端的输出, 才发现被禁止访问了, 正是由 robots.txt
禁止的
那么, robots.txt
里面说了什么?打开浏览器访问会看到下面的内容.
第一行 User-Agent
用户代理是说明访问人身份的, 如果 用户代理 的名称为 MJ12bot 的会直接禁止访问全站内容.
不信? 将settings.py
中的用户代理设置为下面的 USER_AGENT = 'MJ12bot'
, 然后scrapy shell 访问 https://www.jiemodui.com/
, 看看是不是收到DEBUG: Forbidden by robots.txt: <GET https://www.jiemodui.com/>
的信息?
换成其他名字便又可以正常访问了, 可见网站并不是禁止所有爬虫, 禁止搜索引擎收录的.其他的用户代理可以正常访问 ALLOW
对应的 url
前缀下的网页. 但是Disallow
下的 url
是不允许的, 收录或爬虫均违法. 而笔者最开始爬的网址正中不允许的范围.
另辟蹊径
作为守法的好公民, 虽然是带着镣铐在跳舞, 但是仍有我们发挥的余地. 可以看到该网站允许访问的网址还是不少, 甚至笔者还发现了一个在网站首页没有的入口:
按标签筛选 https://www.jiemodui.com/T
按作者筛选 https://www.jiemodui.com/W
按公司筛选 https://www.jiemodui.com/O
如此, 笔者的爬取需求已经得到满足, 同时还遵守了 robots.txt
. 有同学会问, 如果网址不在 robots.txt
中怎么办? 我认为私下自己使用就好, 不在里面的网址搜索引擎一般也不会去收录. 比如笔者在后面分析数据源的时候还发现了带有 /api/
的网址, 我们平时搜索的时候应该还没搜出来过打开是 json
数据的结果吧.
总结
如果平时我们遇到了浏览器能访问, 但自己的爬虫被禁止的情况, 应该注意查看输出是否是因为 robots.txt
而被禁止.
如果是, 要认真分析 robots.txt
的每一个允许的网址有没有自己需要的接口; 如果没有自己要的接口, 再用浏览器的开发者工具查看有没有隐藏的数据接口. 如果真的没有, 选择不遵守 robots.txt
时要慎重, 出于自己学习的目的私下使用可能不是什么大事, 但是公开或者商业使用就有可能要吃官司了.
新闻数据源项目地址: https://github.com/FesonX/finvest-spider
欢迎 star , 有好的新闻源欢迎 pull request, 有问题欢迎 issue.