首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

怪不得你的爬虫一页数据都抓不到,原来是忽视了这一点

大家好,今天小编又和大家见面了,我是团队中的python高级研发工程师,日常工作是开发python代码;偶尔还要来平台写写文章;最近老板又给我安排一个活:帮助粉丝解决各种技术问题。

是的,朋友们如果在做项目或者写代码的过程中遇到了问题,欢迎私信小编,小编每天都会抽出一定的时间来帮忙解决粉丝朋友们的问题。此外,朋友们还可以私信来索取精美简历模板哦

问题描述

今天这位朋友的问题是,他在window7下面,使用python3.7和scrapy框架抓取百度图片。由于使用了框架,所以程序很快就开发好了,但是启动爬虫之后,发现连第一页数据都抓取不到,爬虫就退出了。

由于scrapy框架打印了近百行的错误输出,所以很难定位问题。这位朋友反复检查了几次代码,又在chrome浏览器里面重新抓包,都找不出来问题的原因所在。

甚至他还用php代码模拟了scrapy中类似的抓取功能,发现抓取百度图片的功能代码运行起来非常的正常。从直觉出发,看来问题还是出在scrapy框架里面。

问题定位

小编向这位朋友索要了代码,然后在自己的开发机里面尝试运行了一下,也是同样的结果,抓第一页数据的时候,爬虫就出错退出了。

通过仔细观察日志,小编在近百行的出错日志里面很敏捷地就发现了几个关键词: Forbidden by robots.txt,翻译成中文,就是“robots.txt禁止爬虫抓取”。

问题原理

小编又仔细地观察了一下爬虫的debug日志,发现一个规律:爬虫在请求我们设定的url之前,它会先向服务器根目录请求一个txt文件,也就是robots.txt。

robots.txt文件是一个文本文件,使用任何一个常见的文本编辑器,比如Windows系统自带的记事本,就可以创建和编辑它,它是搜索引擎访问网站的时候要查看的第一个文件,它会告诉蜘蛛程序在服务器上什么文件是可以被查看的、什么文件是不允许被查看(抓取)的。

当一个搜索蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围;如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被口令保护的页面。

Robots协议用来告知搜索引擎哪些页面能被抓取,哪些页面不能被抓取;可以用来屏蔽一些网站中比较大的文件,如:图片,音乐,视频等,节省服务器带宽;或者屏蔽站点的一些死链接。也可以方便搜索引擎抓取网站内容;设置网站地图连接,方便引导蜘蛛爬取页面。

因为默认scrapy遵守robots.txt中的协议,所以会先请求这个文件查看自己的权限,而我们现在访问这个robots.txt得到:

User-agent: * Disallow: /

意思是不允许任何的爬虫抓取任何的页面,于是scrapy框架就停止了后续的url请求和页面解析。

这也就解释了为何用php写的代码抓取起来就非常的正常,因为php并没有去预先请求robots.txt。

问题解决

知道了问题的原理,解决起来就很顺手了:只要让scrapy框架不去请求robots.txt就可以了。

翻了翻scrapy的官方文档,很容易就找到了解决办法:

settings.py中把ROBOTSTXT_OBEY从True改成False就可以了。 撒花。

总结与收获

遇到问题一定要仔细看日志!多看多想。另外,如果有时间,多翻翻官方文档也是很不错的。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200204A0NM0X00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券