查看"页面来源"显示与cURL不同的HTML

时间:2014-08-15 19:59:39

标签: html google-chrome curl

首先,我的问题与此不同:Difference between cURL and web browser?

我使用Chrome浏览器访问:http://www.walmart.com/search/browse-ng.do?cat_id=1115193_1071967然后,我查看页面来源,以便:

<a class="js-product-title" href="/ip/Tide-Simply-Clean-Fresh-Refreshing-Breeze-Liquid-Laundry-Detergent-138-fl-oz/33963161">

但是,我没有从命令行找到这种信息:

curl "http://www.walmart.com/search/browse-ng.do?cat_id=1115193_1071967">local.html

有谁知道为什么会造成这种差异?我正在使用Python scrapy选择器来解析网页。

3 个答案:

答案 0 :(得分:6)

您的浏览器可以执行JavaScript,而JavaScript又可以更改文档。 Curl只会为您提供简单的原始输出,而不是其他内容。

如果您在浏览器中关闭JavaScript并刷新页面,您会看到它的外观不同。

答案 1 :(得分:4)

除了按照另一个答案中的说明执行JS之外,您的浏览器还可以从您正在忽略的服务器上获取该页面,并且服务器可能会根据此做出反应。

  • 打开Chrome,按F12,转到&#34;网络&#34;标签。
  • 加载您想要的页面。
  • 寻找被请求的第一件事(它应该是一个文档图标,下面是url,你也可以通过&#39; Timeline&#39;来查找它)
  • 右键点击该项目,然后选择&#39;复制为cURL&#39;

将其粘贴到记事本中并查看您的浏览器发送的内容,以及您执行的简单curl命令。

curl "http://stackoverflow.com/questions/25333342/viewing-page-source-shows-different-html-than-curl" -H "Accept-Encoding: gzip,deflate,sdch" -H "Accept-Language: en-US,en;q=0.8" -H "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36" -H "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8" -H "Referer: http://stackoverflow.com/questions?page=2&sort=newest" -H "Cookie: <cookies redacted because lulz>" -H "Connection: keep-alive" -H "Cache-Control: max-age=0" --compressed

发送的语言标题和用户代理(或多或少是您所使用的浏览器和操作系统)之类的东西,即使在某些情况下,如果请求压缩,也会导致服务器以不同方式生成页面。这可能只是正常的反应(比如只向浏览器提供浏览器特定的html,咳嗽*和歌剧*)或者是对新设计或功能进行更高级别A / B测试的一部分。有可能,在URL上看到的内容可能与其他人不同,甚至可能与使用其他浏览器或工具的内容不同。

我还必须指出,您在页面上看到的内容不是查看源代码的内容。源是发送到您的浏览器进行渲染的内容。您在页面上实际看到的内容是渲染和Javascript执行后的内容。大多数浏览器支持某种&#34; Inspect&#34;右键菜单上的功能,我建议你看看那些页面,并与视图源中显示的内容进行比较,它将改变你对网络运作方式的看法。

答案 2 :(得分:1)

不知道你是否找到了答案。我有一个解决方案。这可能是由于服务器抛出301等等。代码是直接的C,所以要适应自己。

curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // To see what's happening
curl_easy_setopt(curl, CURLOPT_USERAGENT, curlversion); // variable
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); // Optional/toggle

最后一个选项需要使用/不进行测试,以查看浏览器输出和curl的准确性。

另外,通过发出直接Shell命令

来查看详细信息
:~$ curl -v http://myurl > page.html

看到差异。它应该有所帮助。