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

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

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

f304ed4791b5eafc971ded3197322c4c.png

问题描述

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

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

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

72903970ea314d2c9a8d037a820f91d9.png

问题定位

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

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

3a066d5a10499727ca0afc30b0d7bba2.png

问题原理

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

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

07b5329c1cd0de987c4f2f166c5070b5.png

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

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

8ebc0fc83e3e82673f75a1338955ea27.png

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

User-agent: * Disallow: /

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

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

cc221a43ed13a921edcc109ebd2e1a3b.png

问题解决

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

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

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

cb62ec4f356c93c7c0381346134dd8c1.png
a31efa1d47f7cf74b011ecfef3b93e8c.png

总结与收获

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值