$ c* [5 y( ]" J6 q% O
近两年出现曾报道一些关于非法抓取数据的程序员被告上法庭的事例, 而非法抓取的一个典型做法就是不遵守网站的 robots.txt 规则进行爬取. 早年就曾有搜索引擎不遵守淘宝的 robots.txt 还去收录网站的信息被告的案例.
% v7 S6 Z& X: k" ?, Y; ? 在 Scrapy 中的 settings.py 中默认是遵守 robots.txt 的, 一般我们也不会去关闭.
/ k; D" W+ s* n% H$ p& ] 禁止示例今天在做收集新闻数据爬虫的时候便碰到被 robots.txt 禁止的情况. 笔者在拿到网站 json 数据接口准备测试的时候, 发现网站的响应内容为空, 而浏览器仍可正常访问.
0 Y8 Q. {* u& ` 再看回终端的输出, 才发现被禁止访问了, 正是由 robots.txt 禁止的
% V" S( w/ c( {) Y. }$ t 那么, robots.txt 里面说了什么?打开浏览器访问会看到下面的内容.
2 G$ I: g6 G6 _# g 第一行 User-Agent 用户代理是说明访问人身份的, 如果 用户代理 的名称为 MJ12bot 的会直接禁止访问全站内容.不信? 将 settings.py 中的用户代理设置为下面的 USER_AGENT=MJ12bot, 然后scrapy shell 访问 https://www.jiemodui.com/, 看看是不是收到下方的输出?
9 @8 s' R$ d, P8 M" } DEBUG:Forbiddenbyrobots.txt:
3 z6 K# F2 _$ M1 y: Y: H* i 换成其他名字便又可以正常访问了, 可见网站并不是禁止所有爬虫, 禁止搜索引擎收录的.其他的用户代理可以
8 K' E* S9 o+ O! v# U: } 正常访问 ALLOW 对应的 url 前缀下的网页. 但是 Disallow 下的 url是不允许的, 收录或爬虫均违法. 而笔者最开始爬的网址正中不允许的范围. ' [) ^3 G0 u: U' h a/ t% m
另辟蹊径作为守法的好公民, 虽然是带着镣铐在跳舞, 但是仍有我们发挥的余地. 可以看到该网站允许访问的网址还是不少, 甚至笔者还发现了一个在网站首页没有的入口: 按标签筛选 https:0 d2 d$ M5 ?& h; o5 y( p
//www.jiemodui.com/T% S( p# H2 t* C: \5 u8 B; f
按作者筛选 https:
% c3 t7 e: x; I4 h //www.jiemodui.com/W: D9 O' r, X f$ g) v1 ?, L& [
按公司筛选 https:
0 D8 U* G* E1 }. z4 h1 { //www.jiemodui.com/O
& J9 c$ K( X( R [- T- \
; F: H: C7 E. M8 d) h 如此, 笔者的爬取需求已经得到满足, 同时还遵守了 robots.txt. 有同学会问, 如果网址不在 robots.txt 中怎么办? 我认为私下自己使用就好, 不在里面的网址搜索引擎一般也不会去收录. 9 i& D& E5 m. n" H! s3 E
比如笔者在后面分析数据源的时候还发现了带有 /api/ 的网址, 我们平时搜索的时候应该还没搜出来过打开是 json 数据的结果吧.总结如果平时我们遇到了浏览器能访问, 但自己的爬虫被禁止的情况, 应该注意查看输出是否是因为 robots.txt 而被禁止. 4 ~& m* e; s+ ~9 G% r y, N
如果是, 要认真分析 robots.txt 的每一个允许的网址有没有自己需要的接口; 如果没有自己要的接口, 再用浏览器的开发者工具查看有没有隐藏的数据接口. 如果真的没有, 选择不遵守 robots.txt 时要慎重, 9 E! X4 L# q9 \/ }5 f& T
出于自己学习的目的私下使用可能不是什么大事, 但是公开或者商业使用就有可能要吃官司了. 7 e9 O# B- B6 d, Y8 Y- W9 x
8 ^) c( |% | L
) A) E+ n1 c! M P/ i
* O; Z: ]" ~, d7 v" [/ B0 F j: a5 s, u
|