爬虫遇到robot.txt
在做大作业的时候需要爬微博的热搜,用scrapy框架,按照quick start操作,但是示例网址可以爬取,我想要爬取微博的热搜却不可以,在检索问题的时候,看到用python直接爬取却可以。然后仔细查看运行日志,发现了以下两行:
[scrapy.core.engine] DEBUG: Crawled (200) <GET https://weibo.com/robots.txt> (referer: None)
[scrapy.downloadermiddlewares.robotstxt] DEBUG: Forbidden by robots.txt: <GET https://weibo.com/ajax/side/hotSearch>
然后意识到可能是因为这个robot.txt导致的,但是robot.txt到底是什么呢?
1. 简述
robot.txt文件是搜索引擎和网站之间做的一个非强制执行的访问限制。robot.txt对按照一定的语法规范,对每个搜索引擎能(例如谷歌、百度等),访问到的内容进行规定。但这种并不是一种强制要求,各种巨头搜索引擎会按照robot.txt文件中的要求访问网站,但是对于个人或者某些组织来讲,可以不遵守robot.txt文件继续访问。
2. robot.txt简要介绍
以微博为例:
Sitemap: http://weibo.com/sitemap.xml
User-Agent: Baiduspider
Disallow:
User-agent: 360Spider
Disallow:
User-agent: Googlebot
Disallow:
User-agent: *
Allow: /ads.txt
User-agent: Sogou web spider
Disallow:
User-agent: bingbot
Disallow:
User-agent: smspider
Disallow:
User-agent: HaosouSpider
Disallow:
User-agent: YisouSpider
Disallow:
User-agent: *
Disallow: /
2.1
Sitemap
是站点地图,网站通过它向搜索引擎说明网站的重要页面,是由Sitemap:
+url
组成,一般是有多个,但是微博只列举了一个。
2.2
User-agent
是用户代理,对于正常用户来说,这个包括這包括浏览器类型、系统版本等信息,但是对于爬虫来说,如果是单独写的爬虫,那么一般会提前设定好head
(请求头)中的user-agent
属性,伪装成一个正常的用户;不过对流搜索引擎爬虫来说,会在这里注明自己的“身份”,例如常见的搜索引擎爬虫代理名称:
Google:
Googlebot
Googlebot-Image(用於影像)
Googlebot-News(用於新聞)
Googlebot-Video(用於影片)
Bing
Bingbot
MSNBot-Media(用於影像和影片)
百度
Baiduspider
当然,如果是User-agent : *
,表示所有的代理用户都可以访问。
因为爬虫读取是按照顺序读取,对于scapy来说,前几个允许的搜索引擎爬虫不包括自己,所以选择遵守最后一个,就是
User-agent: *
Disallow: /
因此就“被屏蔽”掉了。
2.3
Disallow
对爬虫机器人声明后面的内容是不允许访问的。
例如Disallow: /example/bots/
表示网站根目录下的example/bots/页面(也就是'https://websiteRoot/example/bots/)不允许访问;
也可以禁止访问一个目录,例如Disallow: /example/
,表示网站目录example(https://websiteRoot/example/)下的所有页面都不允许爬虫访问;
如果只是一个Disallow: /
,那么表示该对机器人隐藏整个网站;
如果为空,Disallow:
,表示爬虫机器人可以访问储存网站内的所有内容。
不过以上都只是对于善意的爬虫机器人,如果爬虫不遵守这个规则,那么就相当于没有。
2.4
Allow
就是你所想的那个样子,告诉爬虫允许访问的页面。
2.5 还有什么?
Crawl-delay
:crawl delay 命令旨在阻止搜索引擎蜘蛛爬虫使使服务器负担过重。它让爬虫管理指定每个爬虫访问的时间间隔(以毫秒为单位)。例如:Crawl-delay: 8
PS. 还注意到微博的文件中由一个ads.txt文件,可以从名字看出该文件和广告业务相关,简而言之,它可以避免广告欺诈行为,让网站所有者可以决定其他哪些公司可以在其的网站上进行广告。【reference】
3. 解决方法
在scrapy项目中的setting.py
文件中找到# Obey robots.txt rules
下方的设置项修改为False
即可。同时也可以在setting文件中的# Override the default request headers:
设置默认请求头;可以在Crawl responsibly by identifying yourself (and your website) on the user-agent:
设置用户代理