Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/silverlight/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何防止蜘蛛和爬虫使用昂贵的API?_Php - Fatal编程技术网

Php 如何防止蜘蛛和爬虫使用昂贵的API?

Php 如何防止蜘蛛和爬虫使用昂贵的API?,php,Php,我使用的API非常昂贵。每次通话费用约为1美分。我注意到来自爬行器和爬虫程序的访问生成了数千个对该API的调用,我为此而付费。有没有一种方法可以阻止网页中显示该API生成的内容的部分,只有实际的访问者才能看到它,并且在对网页进行爬网时不会生成API调用 您可以在前端执行API调用,而不是在服务器端执行。例如,在页面加载期间,对服务器执行AJAX请求,该请求将调用API并返回数据 据推测,spider和crawler只解析源代码,不执行JS,因此它们不会执行AJAX请求,也不会向您收费。但是,如果

我使用的API非常昂贵。每次通话费用约为1美分。我注意到来自爬行器和爬虫程序的访问生成了数千个对该API的调用,我为此而付费。有没有一种方法可以阻止网页中显示该API生成的内容的部分,只有实际的访问者才能看到它,并且在对网页进行爬网时不会生成API调用

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

据推测,spider和crawler只解析源代码,不执行JS,因此它们不会执行AJAX请求,也不会向您收费。但是,如果您的一些访问者没有启用JS,您应该为他们提供一种获得结果的方法


除此之外,如果您想要降低成本,您可以做的是实现一个缓存系统,这样您就不会连续多次调用API。您可以根据新数据的重要性定义缓存时间。

有许多方法可以防止爬虫对您的站点/特定页面进行爬网。问题是,您需要定义要阻止哪种爬虫,因为它们有多种类型。首先,Google和Bing不尊重robots.txt的爬网延迟设置(您可以通过在仪表板中手动更改这些设置来更改爬网速度)


正如您提到的,您使用的是PHP,如果您使用的是Apache,那么您可以尝试使用Apache访问日志—它注册Apache接收的所有请求—分析日志文件,并可以确定哪些爬虫正在生成您所谈论的所有流量(当你知道哪些爬虫会造成高流量时,你就知道可以通过使用.htaccess文件阻止它们来杀死哪一个爬虫-你可以将来自特定IP地址或用户代理的web请求重定向到403 http错误或任何所需的重定向输出)

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

<?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");
}
?>


您能否提供更多有关用户如何使用API的信息?手机、javascript网站等?API调用是否针对每个访问者?如果不是,请实施缓存,以便您每周/每天/小时只运行一个请求(以适合数据集的为准)并重新使用每个访问者的数据。如果他们是访问者专用的,那么您是否能够锁定仅针对经过身份验证的用户的api调用?api调用是由用户在试图通过桌面或移动设备在我的网站上搜索内容时提供的搜索关键字生成的。搜索结果页面不会被robots.txt阻止,我也不会ant这样做。问题是我在Google上有200万页索引,这就是API被使用的原因。我可以阻止Google的一部分页面,但还有其他爬行器和爬虫。好的,机器人可能只搜索随机文本字符串,所以缓存几乎是不可能的。可能为未经验证的users或其他一些避免“垃圾”的检测方法搜索问题是我不想阻止爬虫。我只想在访问来自爬虫时避免API调用,但仍保留网页上的其余内容以供爬虫。@Zetal,我认为你没有以正确的方式实现你正在尝试的操作。如果你有一个网页,你希望被爬虫,但这s的网页也使用了一个API,你唯一能做的就是使用缓存系统或限制每个访问者的请求数。通常,你不能用一堆API调用自由地抓取网页。AJAX请求听起来不错。我该如何实现它?假设我想包括/不包括某个php文件,这取决于isit来自人类或爬虫。@Zetal,如果您想在Ajax中检查访问者是爬虫还是人类,您可以在访问者的用户代理上使用正则表达式。