【问题标题】:Why does OpenURI return different HTML content from the original source?为什么 OpenURI 从原始源返回不同的 HTML 内容?
【发布时间】:2016-03-27 01:51:03
【问题描述】:

我正在尝试使用 OpenUri 和 Nokogiri 从 HTML 源中获取样式内容。

require 'open-uri'
require 'nokogiri'
require 'css_parser'

url  = open('https://google.com')
html = Nokogiri::HTML(url)
css  = CssParser::Parser.new
css.add_block!(html.search('style#gstyle').text)

这将返回 nil,但 Google 页面的 HTML 包含 id="gstyle"。这是输出结果的图像:

  1. 为什么在此示例中的 Google HTML 页面与 OpenUri 返回的页面不同?
  2. 如何找到这个标签style#gstyle
  3. 为什么 Firebug 能看到正确的 HTML 文档而 OpenUri 却没有?

【问题讨论】:

  • 3、怎么知道firebug的页面是正确的而open-uri的页面不是?
  • 忽略3中看到的这种不对称性,问题1和问题3有什么区别?
  • 不要相信基于浏览器的工具可以准确地显示 HTML。如果您想知道页面真正是什么样子,请使用curlwget 或OpenURI 直接访问源并查看返回的内容。浏览器就像小狗一样,试图通过渲染一些东西来取悦我们,即使这意味着改变 HTML。任何使用浏览器呈现的 HTML 的东西都会出错,包括 Firebug。而且,顺便说一句,如果您还想查看真正的源代码,可以在命令行中使用 nokogiri some_url
  • 好的,我试试。谢谢。

标签: html ruby nokogiri open-uri css-parsing


【解决方案1】:

Google 会根据代理字符串为不同的客户端呈现不同的页面,而代理字符串是服务器关于哪种客户端正在访问该页面的唯一线索。 open-uri 默认声明自己是“Ruby”。如果您使用明显自动化的脚本进行访问,您将不会获得与使用浏览器访问相同的页面。

试试这个:

url = open('https://google.com', "User-Agent" => "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36")

【讨论】:

  • 太棒了!非常感谢!
  • 根据过去的经验,在前世,我们发现 Google 似乎也根据随机的突发奇想和幻想来改变渲染,我们将其解释为试图阻止抓取和抓取他们的页面。
  • @theTinMan:也是。我可能应该补充说我正在回答字面问题(为什么open!= Firebug);我不知道 OP 的用例是一次性的还是他们要进行抓取,但如果是后者,您不应该在 Google 上使用 open 进行抓取,如果不使用,请使用 Google API'不想获得 IP 禁令。
猜你喜欢
  • 2021-02-24
  • 2019-10-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 2012-04-02
  • 2018-01-24
  • 1970-01-01
  • 2023-02-10
相关资源
最近更新 更多