2012-09-17 21 views
12

estoy tratando de buscar a la siguiente página web:¿Por qué urllib.urlopen.read() no se corresponde con el código fuente?

import urllib 
urllib.urlopen("http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1").read() 

El resultado no se corresponde con lo que veo al inspeccionar el código fuente de la página web a través de Google Chrome, por ejemplo.

¿Podría decirme por qué sucede esto y cómo podría mejorar mi código para solucionar el problema?

Gracias por su ayuda.

+1

¿Cuáles son las diferencias? –

+0

Hola, urllib.urlopen.read() me da por ejemplo en el cuerpo: ' \ n

\ n' que es información demasiado pequeña con respecto a lo que está en la página. –

+0

Ver la respuesta de Srikar.La página se genera dinámicamente con javascript. La clave está en "Album1.EcritElement (0)". –

Respuesta

10

Lo que obtienes de urlopen es la página web sin formato, lo que significa que no se ejecuta javascript css no se utiliza; donde lo que obtienes de Chrome (u otros navegadores) es una página web final que incluye JavaScript ejecutable (que puede alterar el HTML), css, etc. todo lo cual no ocurre en urlopen ...

De ahí la diferencia, Espero que esto sea claro

+0

¿La vista * source * de Chrome cambia cuando se manipula el DOM? El de Firefox no. – delnan

+2

@delnan el OP no dice explícitamente que está usando Ver origen (que no cambia) en lugar de Inspeccionar elemento (que sí lo hace). –

+0

@SrikarThanks ¿qué debería usar en lugar de urlopen para analizar la página web final? –

3

Además, algunos sitios web tienen un conmutador del navegador que puede dar lugar a diferentes fuentes que se muestran al utilizar diferentes navegadores (por ejemplo, mostrar una versión ligera para navegadores móviles).

Tenga una mirada en http://www.diveintopython.net/http_web_services/user_agent.html sobre cómo cambiar el User-Agent a algo así como "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1" (que en realidad es mi User-Agent).

9

puede usar python Selenium para resolver su problema. Aquí hay un código de ejemplo eche un vistazo.

from selenium import webdriverr 
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1" 
browser = webdriver.Firefox() 
browser.get(url) 
sleep(10) 
all_body_id_html = browser.find_element_by_id('body') # you can also get all html 

Luego, debido a su resto de trabajo de acuerdo a su elección algún ejemplo más con instancia del navegador

def login(user='ssdf', password="cisin123"): 
content = browser.find_element_by_id('content') 
content.find_element_by_xpath('.//tbody/tr[2]//input[contains(@class,"textbox")]').send_keys(user) 
content.find_element_by_xpath('.//tbody/tr[3]//input[contains(@class,"textbox")]').send_keys(password) 
content.find_element_by_css_selector(".button").click() 
+1

aunque el otro comentario responde a la pregunta básica "¿por qué?", ​​Solo esta respuesta te dice cómo resolver el problema real. – rbp

6

Usted puede utilizar selenio con Firefox para resolver el problema, pero puede no ser adecuado en muchos casos como el navegador aparece cada vez que ejecuta el código. Otra idea es usar una herramienta sin cabeza como PhantomJS.

La mejor manera de hacerlo es utilizar la biblioteca mecanizar. Instalar mecanizar a través de pip.

pip install mechanize 

continuación, puede utilizar el siguiente código:

import mechanize 

mb = mechanize.Browser() 
mb.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
mb.set_handle_robots(False) 
url = "http://www.gallimard-jeunesse.fr/searchjeunesse/advanced/(order)/author?catalog[0]=1&SearchAction=1" 
response = mb.open(url).read() 
print response 

También ofrece la opción de secuencias de comandos del sueño y ejecución. Puede leerlos en el documentation.

Cuestiones relacionadas