您的位置 首页 php

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

大家好,今天小编又和大家见面了,我是团队中的 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://www.zhihuclub.com/151706.shtml

关于作者: 智云科技

热门文章

网站地图