cURL 和 Web 浏览器之间的区别


Difference between cURL and web browser?

我正在尝试从以下网址检索网页:

http://www.medicare.gov/find-a-doctor/provider-results.aspx?searchtype=OHP&specgrpids=922&loc=43615&pref=No&gender=Unknown&dist=25&lat=41.65603&lng=-83.66676

当我将其粘贴到浏览器中时,它可以工作,但是当我通过cURL运行它时,我收到一个页面,其中包含以下错误:"请求的url的一个或多个查询字符串参数无效或具有意外值,请更正并重试。

如果我提供不同的用户代理或推荐人,似乎没有区别。有一个重定向,所以我使用CURLOPT_FOLLOWLOCATION。

这是我的代码:

$ch = curl_init($page);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.1; rv:12.0) Gecko/20100101 Firefox/12.0');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$html = curl_exec($ch);
curl_close($ch);
echo $html;

关于为什么这样的请求可以在浏览器中而不是在 cURL 中工作的任何想法?

您的浏览器正在发送 cURL 未发送的 cookie。 使用浏览器工具或 Fidler 检查您发送到网站的 cookie - 您需要传递相同的cookie。

问题出在饼干上。这个特定的网站需要一个ASP.NET_SessionId cookie集才能做出响应。我在 cURL 请求中添加了以下内容:

curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIE, 'ASP.NET_SessionId=ho1pqwa0nb3ys3441alenm45; path=/; domain=www.medicare.gov');

我不知道是否有任何会话 ID 会起作用,但它尝试了几个随机的会话 ID,它们都有效。