Python 请求与 robots.txt

Posted

技术标签:

【中文标题】Python 请求与 robots.txt【英文标题】:Python requests vs. robots.txt 【发布时间】:2013-11-22 08:59:42 【问题描述】:

我有一个供个人使用的脚本,它会抓取一些网站以获取信息,直到最近它运行良好,但似乎其中一个网站增强了它的安全性,我无法再访问它的内容。

我正在使用带有请求的 python 和 BeautifulSoup 来抓取数据,但是当我尝试通过请求抓取网站的内容时,我遇到了以下问题:

'<html><head><META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"></head><iframe src="/_Incapsula_Resource?CWUDNSAI=9_4E402615&incident_id=133000790078576866-343390778581910775&edet=12&cinfo=4bb304cac75381e904000000" frameborder=0 width="100%" height="100%" marginheight="0px" marginwidth="0px">Request unsuccessful. Incapsula incident ID: 133000790078576866-343390778581910775</iframe></html>'

我做了一些研究,看起来这就是阻止我的原因:http://www.robotstxt.org/meta.html

有什么方法可以让网站相信我不是恶意机器人?这是我每天在单个源上运行约 1 次的脚本,因此无论如何我都不会成为他们服务器的负担。只是一个有脚本的人让事情变得更容易:)

编辑:尝试切换到机械化并以这种方式忽略 robots.txt,但我没有收到 403 Forbidden 响应。我想他们已经改变了对抓取的立场,还没有更新他们的 TOS。是时候执行 B 计划了,除非有人有其他想法,否则不再使用该网站。

【问题讨论】:

你可以尝试在你的请求头中插入普通浏览器的用户代理 添加有效的推荐人也可能有所帮助。 也许是时候查看网站的服务条款,看看那里是否有更改 - 您确定您的网站抓取是网站所有者想要允许的吗? TOS 不仅仅是你是否给服务器带来了负担。 是的,我确实检查了 TOS。他们不允许任何比人类在网络浏览器中产生的访问速度更快的访问:You agree not to use or launch any automated system, including without limitation, "robots," "spiders," "offline readers," etc. , that accesses the Service in a manner that sends more request messages to the Company servers than a human can reasonably produce in the same period of time by using a conventional on-line web browser 我每天发送一个请求,所以我认为我属于法律可接受的范围。 如果您尝试使用浏览器访问该站点,您是否会收到相同的消息?另外,robots.txt 文件是怎么说的?在任何情况下,robots.txt 和 robots 元标记都无法阻止您的机器人下载。 【参考方案1】:

最有可能发生的是服务器正在检查user-agent 并拒绝访问机器人使用的默认user-agent

例如requestsuser-agent 设置为python-requests/2.9.1 之类的东西

您可以自己指定标题。

url = "https://google.com"
UAS = ("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/20100101 Firefox/40.1", 
       "Mozilla/5.0 (Windows NT 6.3; rv:36.0) Gecko/20100101 Firefox/36.0",
       "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10; rv:33.0) Gecko/20100101 Firefox/33.0",
       "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36",
       "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36",
       "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.0 Safari/537.36",
       )

ua = UAS[random.randrange(len(UAS))]

headers = 'user-agent': ua
r = requests.get(url, headers=headers)

【讨论】:

以上是关于Python 请求与 robots.txt的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫编程思想:客户端请求与服务端响应

Python 将 Ajax 请求与正常页面视图分开

Python 请求与 PyCurl 性能

Python 请求与 robots.txt

Python爬虫编程思想(125):抓取移动App数据--使用mitmweb监听请求与响应

Python 请求 - 线程/进程与 IO