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
相关产品推荐
相关产品推荐

