如何设置Robots.txt或Apache只在特定时间允许抓取工具?

时间:2011-01-18 23:51:41

标签: apache web-crawler robots.txt iptables

由于流量在24小时内分布不均匀,我想在偷看期间禁止爬行,并在非繁忙时段允许它们。

有没有办法实现这个目标?

编辑: 感谢所有好的建议。

这是我们找到的另一种解决方案。

2bits.com有一篇关于设置IPTables防火墙的文章,以限制来自某些IP地址的连接数。

the article

IPTables的设置:

  • 使用connlimit

在较新的Linux内核中,有一个用于iptables的connlimit模块。它可以像这样使用:

iptables -I INPUT -p tcp -m connlimit --connlimit-above 5 -j REJECT

这限制了从每个IP地址到不超过5个同时连接的连接。这种“口粮”连接,并防止爬虫同时点击该网站。 *

6 个答案:

答案 0 :(得分:6)

您无法确定抓取工具的工作时间,但使用Crawl-delay时,您可以降低抓取工具请求网页的频率。这可以防止他们快速请求页面。

例如:

User-agent: *
Crawl-delay: 5

答案 1 :(得分:3)

您无法在robots.txt文件中控制它。有些爬虫可能会支持类似的东西,但没有一个大爬虫(据我所知)。

在这种情况下,动态更改robots.txt文件也是一个坏主意。大多数抓取工具会将robots.txt文件缓存一段时间,并继续使用它直到刷新缓存。如果他们在“正确”的时间缓存它们,它们可能会整天爬行。如果他们在“错误”时间缓存它们,它们将完全停止爬行(甚至可能从索引中删除索引的URL)。例如,Google通常会caches the robots.txt file for a day,这意味着Googlebot无法看到一天中发生的变化。

如果抓取导致服务器负载过大,您有时可以调整各个抓取工具的抓取速度。例如,对于Googlebot,您可以在Google Webmaster Tools中执行此操作。

此外,当抓取工具在高负载期间尝试抓取时,您始终可以只为503 HTTP result code提供服务。这告诉爬虫在稍后的某个时间进行检查(如果你知道什么时候应该回来,你也可以指定一个重试后的HTTP头)。虽然我会尽量避免在一天中的时间内严格执行此操作(这可能会阻止许多其他功能,例如站点地图,内容相关广告或网站验证,并且可能会降低一般的抓取速度),在特殊情况下可能会这样做是有意义的。从长远来看,我强烈建议只在服务器负载太高而无法成功将内容返回给抓取工具时执行此操作。

答案 2 :(得分:2)

使用某些robots.txt语法 - 功能simply isn't there

是不可能的

可能能够通过实际根据一天中的时间更改robots.txt文件来影响抓取工具。我希望Google会在抓取之前立即检查该文件。但很明显,存在巨大的危险,即以这种方式吓跑爬行者 - 这种风险可能比你现在获得的任何负担都更有问题。

答案 3 :(得分:0)

我认为你不能预约搜索引擎蜘蛛。

答案 4 :(得分:0)

首先要明确:

  

块引用

动态更改robots.txt 文件在这种情况下也是一个坏主意。大多数抓取工具会将robots.txt文件缓存一段时间,并继续使用它直到刷新缓存。如果他们在“正确”的时间缓存它们,它们可能会整天爬行。如果他们在“错误”时间缓存它们,它们将完全停止爬行(甚至可能从索引中删除索引的URL)。例如,Google通常会将robots.txt文件缓存一天,这意味着Googlebot无法看到一天中的更改。回答于2011年1月22日14:25 John Mueller

我尝试在一周内重命名robot.txt文件。像开关一样。它工作说每个星期一在午夜它将“robot.txt”重命名为“def-robot.txt”,现在它不会阻止爬虫。我允许两到三天,然后我有另一个计划chron作业将其重命名为“robot.txt”为“def-robot.txt”,现在它开始阻止任何爬虫访问我的网站。所以他们这样做还有很长的路要走,但首先提到的就是发生在我身上的事情。

由于GoogleBot无法验证链接是否仍然正确,因此我的索引链接已经大幅下降,因为“robot.txt阻止Google半周访问我的网站。简单.Cron的作业调度更改你想要的自定义文件可以工作一些。这是我发现在预定的时间基础上定制robot.txt的唯一方法。

答案 5 :(得分:0)

我使用 cron 修改了 apache 配置文件。

您可以在 httpd.conf 中的 指令(例如包含 bot_block.conf)中添加一个包含文件,该文件具有蜘蛛的过滤器。我没有在 .htaccess 中尝试过这个。

我使用 setenvif 设置了一个变量,然后拒绝,以便您可以选择 IP 地址或用户代理等...进行匹配。 例如。

SetEnvIf Remote_Addr ^192.168.53.2$ timed_bot SetEnvIfNoCase 用户代理“badbadbot.com” timed_bot 拒绝来自 env=timed_bot

当你想阻止蜘蛛时使用cron作业将过滤器复制到文件中 然后优雅地重启apache

当你想允许爬虫的时候,使用cron作业用空白覆盖文件,然后优雅地重启apache

我已经实现了这个方法并且它有效。 它并不完美,因为当阻止时间过去时,它不会停止已经有待处理请求的机器人。但过一会他们应该安静下来。