CuRL没有抓取这个XML网址的内容?

时间:2010-01-07 20:11:53

标签: php xml curl

<?
$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中没有产生任何结果,但应该有。其他饲料工作正常。

2 个答案:

答案 0 :(得分:3)

你有一个错字。试试

print htmlentities($data);

而不是

print htmlentities($date);

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

来做到这一点
error_reporting(E_ERROR | E_WARNING | E_PARSE | E_NOTICE);

E_NOTICE错误报告级别会为您提供使用未初始化变量的警告。

答案 1 :(得分:0)

以下是我使用cURL调试页面抓取问题的演练:

  1. 在浏览器中尝试使用该网址 LiveHTTPHeaders),和cURL一起使用 已启用CURLOPT_VERBOSE。这有两个目的:在游戏中显示HTTP标头,它可以作为URL本身的简单测试。
  2. 如果它在浏览器中有效,但在cURL中无效,请使用cURL,直到HTTP标头cURL与浏览器匹配为止。
  3. 让我们试试这个例子。

    您提供的网址在浏览器中有效,但是......

    启用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服务器拒绝在没有User-Agent的情况下提供任何请求。添加一个,你很高兴。