这是我如何使用 cURL 调试页面抓取问题的演练:
- 在浏览器中尝试 URL(使用
LiveHTTPHeaders),并在 cURL 中使用
CURLOPT_VERBOSE 已启用。这有两个目的:揭示正在运行的 HTTP 标头,并用作对 URL 本身的简单测试。
- 如果它在浏览器中有效,但在 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 服务器拒绝在没有用户代理的情况下为任何请求提供服务。添加一个,您就可以开始了。