爬虫遇到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:设置用户代理

reference