【问题标题】:Php curl is returning incomplete dataphp curl返回不完整的数据
【发布时间】:2012-11-02 06:50:49
【问题描述】:

我正在尝试使用 php curl 使用用户名和密码登录网站。

<?php
$url = 'http://XXXXX.com/login';
$ch = curl_init();
$formFields = array('username' => 'XXXX', 'password' => 'WAO', 'button' => 'Login');
$cookiefile = 'C:/wamp/www/tests/cookies.txt';

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_HEADER, TRUE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $formFields);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile);

echo $response = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

但我没有在 $response 中获得完整的 html。意味着如果在浏览器中我在 html 中得到 1000 行。在 curl 中,我得到了大约 350 行 html。

它之前可以工作,但突然停止工作。

有什么帮助吗?

【问题讨论】:

  • 我怀疑这是与网络连接相关的问题。
  • 为了更清晰的理解,请将echo line替换为$response = curl_exec($ch); echo '
    ',htmlentities($response),'
    ';
  • 我有过几次使用代理的经验,代理会返回不完整的响应,http状态为200!

标签: php curl


【解决方案1】:

服务器可能会响应元刷新或某种错误。检查响应标头...这是一个很好的起点

$response = curl_exec($ch);
print_r(curl_getinfo($ch));

您还应该使用 http_build_query() 将您的帖子字段作为字符串而不是数组发送

$formFields = http_build_query( array('username' => 'XXXX', 'password' => 'WAO', 'button' => 'Login'));

【讨论】:

  • 服务器可以通过多种方式请求浏览器刷新...通过 302 状态代码或元刷新标记。我不认为 curl 会跟随元刷新
【解决方案2】:

如果您正在加载的页面是通过 Ajax 将内容加载到页面上,那么您显然会得到不同的结果。而且,您提到的网站似乎确实通过 ajax 请求加载内容。

cURL 不能/不能解析 javascript,因此不能通过 ajax 加载内容。因此,您无法获得与从普通浏览器获得的完全相同的内容。

您可以通过比较 cURL 的输出和 browser-with-javascript-disabled 的输出并发现它们相同来验证上述说法。

【讨论】:

猜你喜欢
  • 2012-12-16
  • 1970-01-01
  • 2013-01-07
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2013-07-03
相关资源
最近更新 更多