Почему OpenURI возвращает другой HTML-контент из исходного источника?

Я пытаюсь получить содержимое стиля из исходного кода HTML, используя OpenUri и Nokogiri.

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, но HTML-код страницы Google содержит id="gstyle", Вот изображение выходного результата:

  1. Почему HTML-страница Google в этом примере отличается от той, которую возвращает OpenUri?
  2. Как я могу найти этот тег style#gstyle?
  3. Почему Firebug видит правильный HTML-документ, а OpenUri - нет?

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")
Другие вопросы по тегам