为什么cURL下载的内容与浏览器的查看源不同?

时间:2012-01-03 22:35:15

标签: curl web-scraping

我已经通过cURL下载了this page,并且页面上的价格($ 118.09)没有通过cURL显示在源代码中。当我使用浏览器(Chrome)在同一页面上查看来源时,价格就在那里。所有其他产品属性都在cURL源中(部件号,描述,案例数量等)。

有关正在发生的事情的任何想法?

以下是我的cURL设置:

$options = array(
    CURLOPT_RETURNTRANSFER  => true,
    CURLOPT_HEADER          => false,
    CURLOPT_FOLLOWLOCATION  => true,
    CURLOPT_ENCODING        => "",
    CURLOPT_AUTOREFERER     => true,
    CURLOPT_CONNECTTIMEOUT  => 10,
    CURLOPT_TIMEOUT         => 5,
    CURLOPT_MAXREDIRS       => 5,
    CURLOPT_USERAGENT       => "http://www.industrycortex.com/crawler.php"
);

备注:

有人指出,在用户访问/ home之前,此网站不会显示价格(请参阅下面的屏幕截图)。我测试了这个,这是正确的。该网站生成一个我没有通过cURL传递的cookie。此外,网络服务器跟踪用户的会话ID是否已访问/家庭,并且仅显示该会话ID具有的价格。访问/ home生成的cookie与任何其他页面生成的cookie相同。


enter image description here

4 个答案:

答案 0 :(得分:2)

我试图在The Art Of Scripting HTTP Requests Using Curl文档的第14部分中稍微讨论这个问题。与您使用浏览器相比,网站可以执行各种检查和逻辑,与“普通”卷曲使用情况不同。

然后,您的工作是记录浏览器会话(使用类似LiveHTTPHeadersFirebug的内容),然后尽可能地使您的curl用法和命令行模仿浏览器会话的外观。这包括用户代理,推荐人以及可能最重要的cookie。

答案 1 :(得分:2)

在您访问/home(未登录)并返回后,价格似乎显示出来。这是一种奇怪的保护机制,但它很容易被规避。您只需要在cURL会话中完成这一切:

  1. CURLOPT_COOKIEFILECURLOPT_COOKIEJAR设置为同一个文件(我可能错误地认为它是必需的,但它肯定不会有害)。
  2. 将网址设置为http://www.quickscrews.com/home并执行curl_exec()
  3. 继续刮痧。
  4. 价格现在应该显示,除非使用JS设置cookie。在这种情况下,您必须从浏览器中读取Cookie并将其写入CURLOPT_COOKIE

    P.S。我猜这个cookie是sawRegPg=sawit;。您可以尝试将CURLOPT_COOKIE设置为该值,然后查看会发生什么。

答案 2 :(得分:0)

某些网站针对浏览器和抓取工具呈现不同的网页。您是否尝试在cURL中设置其他用户代理?

修改 我看不到页面上的价格。可能是您已登录并因此可以看到价格而且cURL(和我)未登录。

答案 3 :(得分:0)

我遇到了他们用gzip编码发送内容的网站,cURL没有自动解码。另一件可以帮助的事情是通过访问http://www.whatsmyuseragent.com/然后将其作为命令的一部分来获取浏览器的用户代理。

curl -A“USER_AGENT”“URL_YOU_NEED_TO_GET”| gzip -d> out.html

我理解特定情况下的问题是使用cookie,可能不是命令行卷曲,但是当我试图弄清楚我认为是同样的事情并添加gzip -d时,我遇到了这个问题为我修好了。