大家好,今天小编又和大家见面了,我是团队中的python高级研发工程师,日常工作是开发python代码;偶尔还要来平台写写文章;最近老板又给我安排一个活:帮助粉丝解决各种技术问题。
是的,朋友们如果在做项目或者写代码的过程中遇到了问题,欢迎私信小编,小编每天都会抽出一定的时间来帮忙解决粉丝朋友们的问题。此外,朋友们还可以私信来索取精美简历模板哦。
![f304ed4791b5eafc971ded3197322c4c.png](https://i-blog.csdnimg.cn/blog_migrate/c0b11e1bf11b95a2ce515fe504b534e8.jpeg)
问题描述
今天这位朋友的问题是,他在window7下面,使用python3.7和scrapy框架抓取百度图片。由于使用了框架,所以程序很快就开发好了,但是启动爬虫之后,发现连第一页数据都抓取不到,爬虫就退出了。
由于scrapy框架打印了近百行的错误输出,所以很难定位问题。这位朋友反复检查了几次代码,又在chrome浏览器里面重新抓包,都找不出来问题的原因所在。
甚至他还用php代码模拟了scrapy中类似的抓取功能,发现抓取百度图片的功能代码运行起来非常的正常。从直觉出发,看来问题还是出在scrapy框架里面。
![72903970ea314d2c9a8d037a820f91d9.png](https://i-blog.csdnimg.cn/blog_migrate/d209c29d5cb3cb9b8781e768e7d9d08e.jpeg)
问题定位
小编向这位朋友索要了代码,然后在自己的开发机里面尝试运行了一下,也是同样的结果,抓第一页数据的时候,爬虫就出错退出了。
通过仔细观察日志,小编在近百行的出错日志里面很敏捷地就发现了几个关键词: Forbidden by robots.txt,翻译成中文,就是“robots.txt禁止爬虫抓取”。
![3a066d5a10499727ca0afc30b0d7bba2.png](https://i-blog.csdnimg.cn/blog_migrate/64b872bdb8494df7cc754500932011cb.jpeg)
问题原理
小编又仔细地观察了一下爬虫的debug日志,发现一个规律:爬虫在请求我们设定的url之前,它会先向服务器根目录请求一个txt文件,也就是robots.txt。
robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的记事本,就可以创建和编辑它,它是搜索引擎访问网站的时候要查看的第一个文件,它会告诉蜘蛛程序在服务器上什么文件是可以被查看的、什么文件是不允许被查看(抓取)的。
![07b5329c1cd0de987c4f2f166c5070b5.png](https://i-blog.csdnimg.cn/blog_migrate/e2fa013ed43e167ab18ac853da63e5d4.jpeg)
当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。
Robots协议用来告知搜索引擎哪些页面能被抓取,哪些页面不能被抓取;可以用来屏蔽一些网站中比较大的文件,如:图片,音乐,视频等,节省服务器带宽;或者屏蔽站点的一些死链接。也可以方便搜索引擎抓取网站内容;设置网站地图连接,方便引导蜘蛛爬取页面。
![8ebc0fc83e3e82673f75a1338955ea27.png](https://i-blog.csdnimg.cn/blog_migrate/3dbfd7d696e1cdd89596e8f6cf7a202f.jpeg)
因为默认scrapy遵守robots.txt中的协议,所以会先请求这个文件查看自己的权限,而我们现在访问这个robots.txt得到:
User-agent: * Disallow: /
意思是不允许任何的爬虫抓取任何的页面,于是scrapy框架就停止了后续的url请求和页面解析。
这也就解释了为何用php写的代码抓取起来就非常的正常,因为php并没有去预先请求robots.txt。
![cc221a43ed13a921edcc109ebd2e1a3b.png](https://i-blog.csdnimg.cn/blog_migrate/34c8e9319dc77babc3c396e421a72cb1.jpeg)
问题解决
知道了问题的原理,解决起来就很顺手了:只要让scrapy框架不去请求robots.txt就可以了。
翻了翻scrapy的官方文档,很容易就找到了解决办法:
settings.py中把ROBOTSTXT_OBEY从True改成False就可以了。 撒花。
![cb62ec4f356c93c7c0381346134dd8c1.png](https://i-blog.csdnimg.cn/blog_migrate/4ab99f219eeb2bb54a13b828904a9b5a.jpeg)
![a31efa1d47f7cf74b011ecfef3b93e8c.png](https://i-blog.csdnimg.cn/blog_migrate/5e3471876a68842e859039e45cfe4627.jpeg)
总结与收获
遇到问题一定要仔细看日志!多看多想。另外,如果有时间,多翻翻官方文档也是很不错的。