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

PHP中cURL抓取HTTP站点遇空DOM问题求助

问题排查与解决指南

1. 先修复代码里的低级拼写错误

你代码里有个致命笔误:url_setopt($ch, CURLOPT_POST, 1); 应该写成 curl_setopt,少了curl_前缀,这直接导致POST请求没被正确开启,服务器自然返回空内容。

2. ASP.NET页面必须携带ViewState等隐藏字段

目标站点是ASP.NET构建的,这类页面处理POST请求时,必须带上页面内置的__VIEWSTATE、__VIEWSTATEGENERATOR、__EVENTVALIDATION隐藏字段——直接POST自定义参数的话,服务器会拒绝处理。

解决思路是先GET一次目标页面,抓取这些隐藏字段的值,再和业务参数一起提交POST请求:

修改后的完整代码示例

require_once('simple_html_dom.php');

// 第一步:GET页面获取必要的隐藏字段
$url = 'http://www.lesco.gov.pk/Customer_Reg/AccountStatus.aspx';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
// 模拟浏览器UA,避免被站点拦截
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');

$getResp = curl_exec($ch);
if (curl_errno($ch)) {
    die('GET请求出错:' . curl_error($ch));
}

// 解析页面中的隐藏字段
$html = str_get_html($getResp);
$viewState = $html->find('input[name=__VIEWSTATE]', 0)->value;
$viewStateGen = $html->find('input[name=__VIEWSTATEGENERATOR]', 0)->value;
$eventVal = $html->find('input[name=__EVENTVALIDATION]', 0)->value;

// 第二步:准备POST数据(务必给$refno赋值!原代码未定义该变量)
$refno = '你的参考号'; // 替换为实际的refno值
$nBatchNo = substr($refno, 0, 2);
$nSubDiv = substr($refno, 2, 5);
$nRefNo = substr($refno, 7, 7);
$strRU = 'U';

$postData = array(
    '__VIEWSTATE' => $viewState,
    '__VIEWSTATEGENERATOR' => $viewStateGen,
    '__EVENTVALIDATION' => $eventVal,
    'nBatchNo' => $nBatchNo,
    'nSubDiv' => $nSubDiv,
    'nRefNo' => $nRefNo,
    'strRU' => $strRU,
    'btnSubmit' => 'Submit' // 需匹配页面提交按钮的name属性,可查看页面源码确认
);

// 切换为POST模式并提交数据
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData));

$postResp = curl_exec($ch);
if (curl_errno($ch)) {
    die('POST请求出错:' . curl_error($ch));
}

curl_close($ch);

// 解析并输出结果
$dom = str_get_html($postResp);
echo $dom;

3. 其他关键注意事项

  • 原代码中$refno变量未定义,会导致所有业务参数为空,服务器返回无效内容,必须给该变量赋值。
  • 目标站点是HTTP协议,你设置的CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST完全无效,可直接删除,这些选项仅对HTTPS请求生效。
  • 检查服务器权限:可通过phpinfo()查看cURL模块是否启用、allow_url_fopen是否为开启状态;若使用虚拟主机,可能存在出站请求限制,需联系主机商确认。

关于HTTP站点的服务器配置

抓取HTTP站点无需特殊配置,只要服务器允许PHP发起对外请求(默认允许,除非被刻意限制)。若使用VPS/云主机,只需确认防火墙放行80端口的出站请求即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:04:57