我正在尝试使用 Perl Mechanize 从站点中搜索和查找内容。经过几次执行后,它在开始时运行良好,我得到403 Forbidden而不是搜索结果,
$m = WWW::Mechanize->new();
$url="http://site.com/search?q=$keyword";
$m->get($url);
$c = $m->content;
print "$c";`
如何解决这个问题。请给我一些建议。
我正在尝试使用 Perl Mechanize 从站点中搜索和查找内容。经过几次执行后,它在开始时运行良好,我得到403 Forbidden而不是搜索结果,
$m = WWW::Mechanize->new();
$url="http://site.com/search?q=$keyword";
$m->get($url);
$c = $m->content;
print "$c";`
如何解决这个问题。请给我一些建议。
在开始抓取网站之前,您应该确保您有权这样做。大多数网站都有服务条款 (TOS),其中列出了您可以如何使用该网站。大多数网站不允许自动访问,并对知识产权施加严格的限制。
站点可以在三个级别上防御不需要的访问:
约定:几乎/robots.txt
每个站点都应该受到您的程序的尊重。不要假设您正在使用的库会解决这个问题;尊重 robots.txt 是您的责任。这是stackoverflowrobots.txt
的摘录:
User-Agent: *
Disallow: /ask/
Disallow: /questions/ask/
Disallow: /search/
所以看起来 SO 不喜欢机器人提问或使用网站搜索。谁会猜到?
还预计开发人员将使用 API 和类似服务来访问内容。例如,Stackoverflow 有非常可定制的 RSS 提要,已经发布了数据库的快照,甚至有一个用于 DB 查询的在线界面,以及一个您可以使用的API 。
法律:(IANAL!)在访问网站之前,除了您的个人即时消费之外,您应该阅读 TOS 或其他任何名称。他们说明您是否以及如何访问该网站并重复使用内容。请注意,所有内容都有一定的版权。版权系统实际上是全球性的,因此您不能仅仅因为在网站所有者之外的另一个国家/地区而免除 TOS。
您通过使用网站(以任何方式)隐含接受 TOS。
一些网站将其内容许可给所有人。很好的例子是 Wikipedia 和 Stackoverflow,它们根据 CC-BY-SA 许可用户提交(或者更确切地说,提交用户根据此许可将其内容许可到站点)。它们不能限制内容的重用,但可以限制对该内容的访问。例如,Wikipedia TOS 包含这一节避免某些活动:
从事破坏性和非法滥用设施[…]
- 参与滥用或破坏服务的网站的自动使用 [...]
- […] 对项目网站或与项目网站连接的网络或服务器造成过度负担;
- […] 表明无意将项目网站用于其既定目的的流量;
- 在未经授权的情况下故意访问、[...] 或使用我们计算机系统中的任何非公共区域 [...]
当然,这只是为了禁止 DDOS,但是虽然 Bots 是 Wikipedia 的重要组成部分,但其他网站确实倾向于对它们不屑一顾。
技术措施: ……比如让来自侵权 IP 的连接超时,或者发送403 错误(非常礼貌)。其中一些措施可能是自动化的(例如,由用户代理字符串、奇怪的引荐来源网址、URL 黑客攻击、快速请求触发)或由警惕tail
的系统管理员记录日志。
如果 TOS 等没有明确说明您可以在网站上使用机器人,您可以随时向网站所有者请求这样做的书面许可。
如果您认为存在误解,并且尽管经常使用网站但仍被阻止,您可以随时联系所有者/管理员/网站管理员并要求他们重新打开您的访问权限。