【发布时间】:2019-01-28 00:09:13
【问题描述】:
我有一个包含 500 多个 URL 的列表,我必须抓取,因为我的分销商不提供 api 或 csv。该列表实际上是一个数组,其中包含我要跟踪的那些产品的 id:
$arr = [1,2,3,...,564];
url是一样的,你只改变它末尾的id:
$url = 'https://shop.com/products.php?id='
现在,在localhost 上,我使用foreach loop 抓取每个网址:
foreach($arr as $id){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url . $id);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_MAXREDIRS, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
//preg_meth_all - get the data that i'm looking for
//put that data into an array
curl_close($ch);
}
但问题在于,首先,我认为这根本不明智 - 我知道这是一个事实,因为当我(意外)运行脚本(在本地主机上)时,我的访问被禁止/阻止了shop.com - 收到消息:Too many requests...429:D。
我试图 sleep 使用 10 作为 modulus 的每个 10 循环进行 foreach
$x = 0;
foreach($arr as $id){
//ch request - get data and add it into an array
$x++;
if($x % 10 == 0){
sleep(2);
}
}
但这需要永远执行。
即使我能够连接并从每个单独的产品中获取我需要的日期,我也想使用curl(因为没有 api 或 csv)找到一个解决方案,该解决方案将立即运行该脚本,但在安全的情况下/明智的方式。
有类似的吗?如果是的话,你能帮我理解一下吗?
谢谢!
【问题讨论】:
-
在供应商阻止您之前,您是否询问过您可以提出多少请求。你能把它调到略低于他们的极限吗?
-
嘿@NigelRen,我没有问他们,我不小心运行了脚本,但这帮助我理解它太多了:D - 是的,我可以一次只运行 10 个每 1-2 分钟通过一次 cronjob,但我认为这个选项在未来不会太聪明和/或可扩展......
-
可能他们允许每秒 100 个请求或 20 个请求。如果是 100 个,您可以分几批大批量完成,如果他们每秒只允许 20 个请求,那么您可能不得不忍受从长远来看。
-
@NigelRen,但没有其他方法吗?我正在考虑一次运行 10 个请求,但这意味着每秒至少有 8.3(3) 个请求以将其保持在 1 小时内(在我的场景中 - 500 个 url 和 1 小时) - 我不明白他们为什么不提供给我使用 api :( 我讨厌他们 :D
-
嘿,艾玛,有什么更新吗?我也只是认为您可以简单地使用
page = file_get_contents("example.com?id=".$id)而不是您的卷曲业务;)
标签: php curl optimization