2015-12-21 19 views
0

J'essaye d'obtenir le contenu de style de la source HTML en utilisant OpenUri et Nokogiri.Pourquoi OpenURI renvoie-t-il du contenu HTML différent de la source d'origine?

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) 

Cela renvoie nil, mais le code HTML de la page Google contient id="gstyle". Voici une image du résultat de sortie:

enter image description here

  1. Pourquoi la page Google HTML, dans cet exemple, différent de celui qui retourne openURI?
  2. Comment puis-je trouver cette étiquette style#gstyle?
  3. Pourquoi Firebug voit-il le bon document HTML et pas OpenUri?
+3

En 3, comment savez-vous que la page de Firebug est la bonne et la page d'open-uri est pas? – sawa

+0

En négligeant une telle asymétrie vue en 3, quelle est la différence entre les questions 1 et 3? – sawa

+0

Ne faites pas confiance aux outils basés sur le navigateur pour afficher le code HTML avec précision. Si vous voulez savoir à quoi ressemble vraiment la page, allez directement à la source en utilisant 'curl' ou' wget' ou OpenURI et regardez ce qui revient. Les navigateurs sont comme des chiots et essaient de nous faire plaisir en rendant quelque chose, même si cela veut dire changer le HTML. Tout ce qui utilise le HTML rendu par le navigateur sera erroné à ce moment-là, y compris Firebug. Et, BTW, vous pouvez utiliser 'nokogiri some_url' à la ligne de commande si vous voulez voir la vraie source aussi. –

Répondre

5

Google affiche sa page différemment pour différents clients, en fonction de la chaîne de l'agent, et la chaîne d'agent est le seul indice dont dispose le serveur pour savoir quel type de client accède à la page. Par défaut, open-uri se déclare être "Ruby". Si vous visitez un script clairement automatisé, vous n'obtiendrez pas la même page que si vous visitiez avec un navigateur.

Essayez ceci:

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") 
+0

Brillant! Merci beaucoup! – andgursky

+0

De l'expérience passée, dans une vie antérieure, nous avons constaté que Google semble également changer de rendu en fonction d'un caprice aléatoire et fantaisie que nous avons interprété comme une tentative de décourager le raclage et spidering de leurs pages. –

+1

@theTinMan: Cela aussi. Je devrais probablement ajouter que je répondais à la question littérale (pourquoi 'open'! = Firebug); Je ne sais pas si le cas d'utilisation d'OP est une chose ponctuelle ou si l'on veut gratter, mais si ce dernier, vous ne devriez pas utiliser 'open' sur Google à des fins de grattage, utilisez plutôt l'API Google si vous ne le faites pas. Je veux gagner une interdiction de propriété intellectuelle. – Amadan