2016-10-23 49 views
2

我使用的API非常昂贵。每通电话费用约1美分。我注意到来自蜘蛛和爬虫的访问会产生数千个对该API的调用,并且我正在为他们收费。有没有办法阻止显示由该API生成的内容的网页部分,只有实际访问者才能看到它,并且在抓取网页时不会生成API调用?如何防止蜘蛛和爬虫使用昂贵的API?

+0

能ÿ ou提供有关API如何被用户使用的更多信息?手机,JavaScript网站等? – motanelu

+0

每个访问者的API调用都是特定的吗?如果没有,则实施缓存,以便每周/每天/每小时运行一次请求(以数据集合为准),并为每位访问者重新使用数据。如果他们是访问者spesific,那么你是否能够锁定只有经过身份验证的用户的API调用? – JimL

+0

当用户尝试通过桌面或移动设备在我的网站上搜索某些内容时,会通过用户提供的搜索关键字生成API调用。搜索结果页面没有被robots.txt阻止,我不想这样做。问题是我在Google上索引了200万个网页,这就是为什么API正在被使用。我可以阻止来自Google的页面的一部分,但也有其他的蜘蛛和爬虫。 – Zetal

回答

0

您可以在前端执行API调用,而不是在服务器端执行。例如,在页面加载期间,向您的服务器发出一个AJAX请求,该请求将调用API并返回数据。

推测蜘蛛和爬虫只是解析源代码,不执行JS,因此他们不会执行AJAX请求,您将不会被收费。但是,如果某些访问者没有启用JS,则应该为他们提供一种获得结果的方法。

除此之外,如果您想降低成本,您可以做的是实现一个缓存系统,以便您不必多次连续对API执行相同的调用。您可以根据新数据的关键性来定义缓存时间。

+0

AJAX请求听起来不错。我如何实现它?假设我想包含/不包含某个PHP文件,具体取决于访问是来自人还是来自爬虫。 – Zetal

+0

@ Zetal,如果你想检查Ajax,如果访问者是一个爬虫或一个人,你可以通过在访问者的用户代理上使用正则表达式来完成。 –

0

有许多方法可以防止抓取工具抓取您的站点/特定页面。问题是你需要定义你想要阻止的爬虫类型,因为它们有很多类型。作为一个起点,Google不会遵守抓取延迟的robots.txt设置(您可以通过在他们的仪表板中手动更改这些设置来更改抓取延迟的抓取速度)。

如上所述,您正在使用PHP,如果您使用的是Apache,那么您可以尝试Apache访问日志 - 它会注册Apache收到的所有请求 - 分析日志文件,并且您可以检测哪些爬虫正在进行所有流量你正在谈论(当你知道哪些抓取工具造成了大量的流量时,你知道哪些可以通过使用.htaccess文件阻止它们来杀死 - 你可以将来自特定IP地址或用户代理的Web请求重定向到403 http错误或任何需要的重定向输出)

+0

问题是我不想阻止抓取工具。我只是想在访问来自爬行器时避开API调用,但仍然可以保持网页上的其他内容可以被抓取。 – Zetal

+0

@ Zetal,我认为你没有以正确的方式实现你正在尝试做的事情。如果您有要抓取的网页,但此网页还使用了API,但您只能使用缓存系统或限制每位访问者的请求数量。通常情况下,您将无法使用一堆API调用来自由地抓取网页。 –

0

我想通了这一点,但仍然在寻找更好的想法:

<?php 
if (preg_match('/slurp|inktomisearch|[Gg]rub|[Bb]ot|archiver|[Ss]qworm/', $_SERVER['HTTP_USER_AGENT'])) { 
include("no-api-call.php"); 
} else { 
include("yes-api-call.php"); 
} 
?>