大家好,今天小编又和大家见面了,我是团队中的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就可以了。 撒花。
遇到问题一定要仔细看日志!多看多想。另外,如果有时间,多翻翻官方文档也是很不错的。
评论留言