You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现PHP cURL延迟数秒执行 正确获取必应搜索结果数

问题核心

你在cURL执行前加sleep()的操作完全无法实现预期效果,本质原因是:

  • PHP cURL是基础HTTP客户端,仅能获取服务器首次返回的静态HTML,不会执行页面JavaScript,也不会处理异步加载的内容
  • 你Python代码里的browser是带浏览器内核的自动化工具,会完整渲染页面、执行JS脚本,time.sleep(1)是等待JS把异步加载的搜索结果插入DOM后再读取源码,二者运行逻辑有本质区别,不是靠给cURL加延迟就能对齐效果的
  • 你拿到的头尾骨架页,本质是必应对无正常浏览器标识的cURL请求做了反爬拦截,不是内容加载慢需要等待

可行解决方案

方案1:补全cURL请求头模拟真实浏览器(轻量无依赖方案)

补全和真实浏览器一致的请求标识,绕过必应基础反爬校验,多数场景下首次请求就能直接拿到包含搜索结果计数的完整HTML,无需额外加延迟:

$url = "https://www.bing.com/search?q=site:mysite.com";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// 配置真实浏览器请求头
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36',
    'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Language: zh-CN,zh;q=0.9,en;q=0.8',
    'Referer: https://www.bing.com/',
    'Connection: keep-alive'
]);
// 开启cookie存储模拟真实用户会话
$cookiePath = tempnam(sys_get_temp_dir(), 'bing_cookie');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath);
// 关闭SSL校验(本地环境证书异常时可开启,生产环境建议移除)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);

$response = curl_exec($ch);
curl_close($ch);

// 匹配结果计数节点
if (preg_match('/<span class="sb_count"[^>]*>(.*?)<\/span>/i', $response, $matches)) {
    echo "搜索结果计数:" . $matches[1];
} else {
    echo "未匹配到结果,返回内容长度:" . strlen($response);
}

方案2:对齐Python浏览器逻辑,使用PHP无头浏览器实现

如果补全请求头后仍被反爬拦截,可以直接使用和Python浏览器自动化逻辑一致的PHP无头浏览器方案,完整渲染页面后等待JS加载完成再取源码,以Symfony Panther为例:

  1. 先安装依赖:执行命令composer require symfony/panther
  2. 实现代码:
require __DIR__.'/vendor/autoload.php';
use Symfony\Component\Panther\Client;

// 启动无头Chrome浏览器
$client = Client::createChromeClient();
$client->request('GET', 'https://www.bing.com/search?q=site:mysite.com');
// 和Python逻辑一致,等待1秒待JS渲染完成
$client->wait(1);
$pageContent = $client->getPageSource();

// 提取结果计数
if (preg_match('/<span class="sb_count"[^>]*>(.*?)<\/span>/i', $pageContent, $matches)) {
    echo "搜索结果计数:" . $matches[1];
}

注意事项

不要在cURL流程中添加无意义的sleep:

  • 请求前加sleep只会延后程序发起请求的时间,不会改变服务器返回的内容
  • 请求后加sleep也没有作用,cURL拿到响应后连接已经关闭,后续等待不会让服务器推送额外内容

内容的提问来源于stack exchange,提问作者user19153785

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 22:21:57