为什么OpenURI会从原始来源返回不同的HTML内容?

and*_*sky 0 html ruby open-uri nokogiri css-parsing

我正在尝试使用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)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

Ama*_*dan 5

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")
Run Code Online (Sandbox Code Playgroud)