【问题标题】:CuRL not grabbing contents of this XML url?CurRL 没有抓取这个 XML url 的内容?
【发布时间】:2010-01-07 20:11:52
【问题描述】:
<?
$request_url = 'http://www.betjamaica.com/livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME';
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$data = curl_exec($ch);
curl_close($ch);
print "<textarea rows='10' cols='80'>";
print htmlentities($data);
print "</textarea>";
exit();
?>

这不会在 textarea 中产生结果,但应该有。其他提要工作正常。

【问题讨论】:

  • 您甚至没有检查返回码是否有错误。那将是一个很好的起点;)

标签: php xml curl


【解决方案1】:

你有一个错字。试试看

print htmlentities($data);

而不是

print htmlentities($date);

此外,如果您尝试使用不存在的变量,建议将 error_reporting 设置为通知您的级别。您可以使用:

error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

E_NOTICE 错误报告级别会给你一个使用未初始化变量的警告。

【讨论】:

  • 是的,不敢相信我打错了“错字”:)
  • 已修复但仍未检索到任何内容
  • 当其他提要显然不能 b/c 你输出错误的变量时,你怎么能说其他提要工作正常?
【解决方案2】:

这是我如何使用 cURL 调试页面抓取问题的演练:

  1. 在浏览器中尝试 URL(使用 LiveHTTPHeaders),并在 cURL 中使用 CURLOPT_VERBOSE 已启用。这有两个目的:揭示正在运行的 HTTP 标头,并用作对 URL 本身的简单测试。
  2. 如果它在浏览器中有效,但在 cURL 中无效,请使用 cURL,直到 cURL 发出的 HTTP 标头与浏览器匹配。

让我们用你的例子试试这个。

您提供的网址可以在浏览器中使用,但是...

打开 CURLOPT_VERBOSE 会显示以下内容:

* About to connect() to www.betjamaica.com port 80
*   Trying 72.52.5.34... * connected
* Connected to www.betjamaica.com (72.52.5.34) port 80
> GET /livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME HTTP/1.1
Host: www.betjamaica.com
Accept: */*

* Empty reply from server
* Connection #0 to host www.betjamaica.com left intact
* Closing connection #0

服务器没有回复。浏览器请求和 cURL 请求之间的唯一区别是浏览器发送更多标头。因此,要做的是尝试添加浏览器标题,直到它开始工作。如果您复制浏览器发送的所有标头,则请求应该是相同的,因此可以正常运行。

在这里,我只是将我的 Firefox 请求标头复制并粘贴到 PHP 中:

$request_url =
'http://www.betjamaica.com/livelines2008/lines.asmx/Load_Latest_Lines?SportType=Football&SportSubType=NFL&GameType=GAME';
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $request_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_VERBOSE, true);
$headers = array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16) Gecko/2009120208 Firefox/3.0.16',
'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language: en-us,en;q=0.5',
'Accept-Encoding: gzip,deflate',
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7',
'Keep-Alive: 300',
'Connection: keep-alive',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$data = curl_exec($ch);
curl_close($ch);
var_dump($data);

而且它有效。多一点实验表明,除了 User-Agent 之外的所有标头都可以删除:

$headers = array(
'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.16)',
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

你就是这样:显然,这个 IIS 服务器拒绝在没有用户代理的情况下为任何请求提供服务。添加一个,您就可以开始了。

【讨论】:

    猜你喜欢
    • 2022-07-11
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多