创建网络爬虫程序时需要考虑什么?

问题描述:

我刚开始考虑今天创建/定制网络爬虫,并且对网络爬虫/机器人礼仪知之甚少。我发现的大部分礼仪文章看起来都很老旧,很尴尬,所以我想从网络开发者社区获得一些当前(和实用)的见解。创建网络爬虫程序时需要考虑什么?

我想使用爬虫遍历“网络”以实现超级简单的目的 - “网站XYZ的标记是否满足条件ABC?”。

这引发了很多问题要问我,但我想我需要走出的第一方式的两个主要问题是:

  • 感觉有点“玄乎”从一开始走 - 这种事情是可以接受的吗?
  • 抓取工具应该具体考虑哪些因素,以免让人不安?

服从robots.txt(并不像过去那么激进)已经说过了。

您可能想要考虑一下您的用户代理字符串 - 它们是预先知道您正在做什么以及如何与您联系的好地方。

+1

在用户代理中添加联系信息是一种将蜘蛛介绍给网站管理员的好方法,并通过输入联系信息使其显而易见,您是友善的人。如果他们碰到他们的网站时遇到问题,您可能有机会与他们合作以获取Feed或API,前提是他们可以与您联系。混淆信息或未能提供信息,他们会立即伸手斧头,并通过禁止域名来切断您的访问权限。 – 2013-01-20 22:40:31

我想说,考虑您造成多少负载是非常重要的。例如,如果您的搜寻器一次或多或少地请求单个站点的每个对象,则可能会导致该特定站点的负载问题。

换句话说,请确保您的抓取工具不太过分。

完全可以接受 - 只要确保每次会话只访问一次每页。当你在技术上创建一个searchbot时,你必须遵守robots.txt和no-cache规则。如果需要阻止IP,人们仍然可以专门阻止您的机器人。

你只是在寻找源代码,据我所知,所以你想要建立一些东西,遵循<link> s样式表和<script src="..."></script>为JavaScripts。

负荷是一个很大的考虑因素。限制您抓取特定网站的频率以及完成目标所需的最基本信息。如果你正在寻找文字,不要下载所有的图像,像这样的东西。

当然要服从robots.txt,但也要确保您的用户代理字符串包含准确的联系信息,并且可能指向描述您在做什么以及如何执行操作的网页的链接。如果一个网络管理员看到很多你的请求,并且很好奇,你可以通过一个信息丰富的网页回答很多问题。

除了WillDean和Einar的很好的答案之外,我真的建议你花一些时间阅读HTTP响应代码的含义,以及爬虫在遇到每个响应代码时应该做些什么,因为它会在很大程度上改变你的表现,无论你是否被某些网站禁止。

一些有用的链接:

HTTP/1.1: Status Code Definitions

Aggregator client HTTP tests

Wikipedia

请务必在您的用户代理字符串的URL解释谁/为什么你的机器人是什么/爬行。

另外别忘了遵守机器人meta标签:http://www.w3.org/TR/html4/appendix/notes.html#h-B.4.1.2

另一件事想 - 当蜘蛛网页,不要太草率决定的事情不存在或有错误。某些页面由于维护工作或在短时间内得到纠正的错误而处于脱机状态。

+1

如果我怀疑某个页面应该存在,因为它是由其他页面指向的,那么我会将代码插入到我的“重试”队列中,以便稍后再尝试。如果再次失败,计数器会增加,直到计数器超出我的重试限制,或者页面恢复在线。 – 2013-01-20 22:44:42

所有优点,在这里提出的。您还必须处理动态生成的Java和JavaScript链接,参数和会话ID,转义单引号和双引号,相对链接失败尝试(使用../../越过根目录),区分大小写,帧,重定向,饼干....

我可以继续几天,有点。我有一个覆盖大部分这个的Robots Checklist,我很高兴回答我可以。

您还应该考虑使用开放源码机器人爬虫代码,因为它可以让您在所有这些问题上大显身手。我也有一个页面:open source robot code。希望有所帮助!

您需要添加一些功能来黑名单站点/域或其他东西(IP范围,ASN等),以避免您的蜘蛛陷入垃圾邮件网站。

您需要拥有一个HTTP实现,对超时和行为有很多控制权。期望很多网站发送无效回复,巨大响应,垃圾头,或者只是让连接无限期地打开而没有响应等。

也不要相信200状态来表示“页面存在”。根据我的经验(与一个大的HTML文档一起),相当大比例的网站发回200个“找不到”或其他错误。

+1

你会得到'200'来定制错误页面,这些页面被困在他们的站点内部,并在内部重定向到“嘿,这个页面不存在,但我们通过告诉你是有帮助的。”页面,这对蜘蛛的作者根本没有帮助。 – 2013-01-20 22:42:25