为什么使用curl无法获取网页内容?

3

我正在使用一个curl脚本访问链接并获取内容以进行后续操作。下面是链接和curl脚本:

<?php 
$url = 'http://criminaljustice.state.ny.us/cgi/internet/nsor/fortecgi?serviceName=WebNSOR&amp;templateName=detail.htm&amp;requestingHandler=WebNSORDetailHandler&amp;ID=368343543';

//curl script to get content of given url

$ch = curl_init();

// set the target url

curl_setopt($ch, CURLOPT_URL,$url);

// request as if Firefox

curl_setopt($ch, CURLOPT_HTTPHEADER, Array("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15") ); 
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result= curl_exec ($ch);
curl_close ($ch);
echo $result;
?>

但是,网站不接受通过脚本提交的内容,结果会给出用户异常,但如果我们在浏览器中正常地粘贴URL,页面将完美地打开。

请帮忙看看,我做错了什么。

谢谢和问候


1
这不是[tag:data-mining]。这只是[tag:web-scraping]。请使用更合适的标签以获得更好的答案。 - Has QUIT--Anony-Mousse
4个回答

6

我运行了以下程序/脚本,页面成功下载。这很可能意味着你运行脚本的服务器无法访问“criminaljustice.state.ny.us”服务器。这可能是因为你的服务器配置错误,或者他们的服务器明确地阻止了你,这是激进屏幕抓取的常见结果。

<?php
$url = 'http://criminaljustice.state.ny.us/cgi/internet/nsor/fortecgi?serviceName=WebNSOR&templateName=detail.htm&requestingHandler=WebNSORDetailHandler&ID=368343543';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15") ); 
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result= curl_exec ($ch);
curl_close ($ch);
echo $result;

额外的故障排除提示--如果您可以访问运行PHP脚本的机器的shell,请运行以下命令

curl -I 'http://criminaljustice.state.ny.us/cgi/internet/nsor/fortecgi?serviceName=WebNSOR&templateName=detail.htm&requestingHandler=WebNSORDetailHandler&ID=368343543'

这将输出响应头,其中可能包含一些有关请求失败原因的线索。

2

对于用户代理,我认为您想使用CURLOPT_USERAGENT常量

curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");

2

我曾经遇到过同样的问题,最终发现是因为没有设置followlocation选项。我原以为curl默认会将其设置为true,但看来并不是这样!一旦我设置了它,就可以轻松地获取整个网站。


1

用户代理是否应该像那样放在数组中?我以前没有见过这样做。

尝试只使用普通字符串,即

curl_setopt($ch, CURLOPT_HTTPHEADER, 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.15) Gecko/20080623 Firefox/2.0.0.15'); 

我按照您的建议进行了更改,但是出现了以下错误:警告:curl_setopt() [function.curl-setopt]:在C:\ xampplite \ htdocs \ curl \ extract.php的第9行中,您必须传递CURLOPT_HTTPHEADER、CURLOPT_QUOTE、CURLOPT_HTTP200ALIASES和CURLOPT_POSTQUOTE参数中的对象或数组。 - chinmay upadhyaya
嗨,Alex, 我知道我的脚本出了什么问题了,它的网址实际上是使用了"&amo;"而不是"&"符号,因此它本身的网址是错误的。无论如何感谢你的帮助。 - chinmay upadhyaya
啊,是的,抱歉,我忽略了CURLOPT_标志。通常我会和CURLOPT_USERAGENT一起使用它。嗯,你是从XHTML文件中复制链接吗?因为验证页面必须将“&”编码为“&”。 - alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接