Estoy agarrando una Wikia página usando Python solicitudes. Hay un problema, sin embargo: las solicitudes solicitud de no me daría el mismo HTML como mi navegador es la misma página.

Para la comparación, aquí está la página de Firefox me pone, y aquí está la página de solicitudes de recupera (descargar ver – lo siento, no existe una forma fácil para solo visualmente el anfitrión de un poco de HTML desde otro sitio).

Usted nota algunas diferencias (super hostil diff). Hay algunas pequeñas cosas, como atributos beinig ordenadas de forma diferente y tal, pero también hay algunos muy, muy grandes cosas. Más importante es el falta de los últimos seis <img>s, y la totalidad de la navegación y pie de página de las secciones. Incluso en el raw HTML se parece a la página de cortar abruptamente.

¿Por qué sucede esto, y hay una manera de solucionarlo? He pensado un montón de cosas que ya se, ninguno de los cuales ha sido fructífera:

  • Encabezados de solicitud de interferencia? Nope, he intentado copiar los encabezados de mi navegador envía, User-Agent y todos, de 1:1 en las solicitudes de petición, pero nada cambió.
  • JavaScript se carga el contenido después de que el HTML está cargado? Nah. Incluso con JS desactivado, Firefox me da la «buena» de la página.
  • Uh… bien… ¿qué otra cosa podría ser?

Sería sorprendente si usted sabe de una manera en que esto podría suceder y una forma de solucionarlo. Gracias!

Los servidores son libres para servir lo que quieras, basado en el estado de ánimo, las fases de la luna, y la mayoría de todos, lo que los encabezados de su solicitud incluye. Firefox envía diferentes encabezados de requests.
También, los agentes de usuario, las cosas se carga a través de JavaScript, etc.
Esto no es, sin embargo, requests culpa. Este es el servidor de elección. Usted puede experimentar y copia a través de los encabezados de Firefox a su request código; culpables de costumbre son las cookies, el encabezado de Agente de Usuario y el Aceptar* de la familia de los encabezados.
Luego está el navegador de la misma; se analiza HTML recibe y ejecuta el código JavaScript si es que hay alguno. El análisis de HTML significa la inserción de perder implícita elementos (tales como <tbody> en las tablas) y la reparación de algo que está roto. La presentación la ha analizado HTML de vuelta a usted fácilmente puede conducir a la orden de los atributos cambiando también.
Como se ha mencionado, he copiado los encabezados de Firefox usa y los usaron para el requests.get() (Agente de Usuario incluido), y no dice. Ese no es el problema. Además, estoy completamente seguro de Wikia no excluye seis imágenes y la navegación por ciertas IPs / proxies sólo. Descargar los archivos HTML y mirar en su navegador – usted verá que algunas bastante obvias, extraño diferencias.

OriginalEl autor obskyr | 2015-04-21

5 Comentarios

  1. 5

    Tuve un problema similar:

    • Idénticos encabezados con Python y a través del navegador
    • JavaScript definitivamente descartado como causa

    Para resolver el problema, terminé cambiando el solicitudes biblioteca para urllib.solicitud de.

    Básicamente, he sustituido:

    import requests
    
    session = requests.Session()
    r = session.get(URL)

    con:

    import urllib.request
    
    r = urllib.request.urlopen(URL)

    y luego se trabajó.

    Tal vez una de esas bibliotecas está haciendo algo extraño detrás de las escenas? No estoy seguro si esa es una opción para usted o no.

    Tengo un problema similar. Cuando yo uso «de la solicitud.get(URL)» para acceder a la página web, el extremo remoto se cierra la conexión. Pero cuando uso «urllib.solicitud.urlopen(URL)» y «read()» para obtener la misma página web, todo está bien. No sé por qué está pasando esto, pero muchas gracias @rnhuneau.
    Es posible que el servidor está enviando un contenido diferente al que utilizan estas bibliotecas en lugar de normalmente navega por la web?

    OriginalEl autor rnhuneau

  2. 2

    Sugiero que no estás enviando el adecuado encabezado (o el envío de mal) con su solicitud. Es por eso que usted está recibiendo un contenido diferente. Aquí está un ejemplo de una petición HTTP con el encabezado:

    url = 'https://www.google.co.il/search?q=eminem+twitter'
    user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36'
    
    # header variable
    headers = { 'User-Agent' : user_agent }
    
    # creating request
    req = urllib2.Request(url, None, headers)
    
    # getting html
    html = urllib2.urlopen(req).read()

    Si está seguro de que usted está enviando a la derecha del encabezado, pero todavía está recibiendo html diferente. Puedes probar a utilizar el selenio. Se le permite trabajar con el navegador directamente (o con phantomjs si su máquina no tiene GUI). Con selenio usted será capaz de simplemente agarrar html directamente desde el navegador.

    Como se ha mencionado, no es de las cabeceras. Yo he probado ambos, dejándolos solos y el uso de los Firefox envía. No quiere usar Selenio para la web simple raspado, bien, pero gracias.

    OriginalEl autor Alon Zilberman

  3. 0

    Muchas de las diferencias que veo me está mostrando que el contenido sigue ahí, es sólo representa en un orden diferente, a veces con un espaciado diferente.

    Usted podría estar recibiendo diferentes de contenido basado en varias cosas diferentes:

    • Su encabezados
    • Que el agente de usuario
    • El tiempo!
    • El fin de que la aplicación web decide representar los elementos en la página, sometidos al azar orden de atributos como el elemento que pueden extraerse de un sin clasificar fuente de datos.

    Si se puede incluir todos los encabezados en la parte superior de ese Diff, entonces podemos ser capaces de hacer más sentido.

    Sospecho que la aplicación no escogió para representar ciertas imágenes no están optimizados para lo que cree que es algún tipo de robot/dispositivo móvil (Python Solicitudes)

    En una mirada más cercana en el diff, parece que todo fue cargado en ambas solicitudes, sólo que con un formato diferente.

    No, como se ha mencionado, no todo fue cargado en ambas solicitudes. Compruebe los archivos reales en tu navegador, verás que la parte inferior de navegación (que es la parte más importante para mí ahora) y los últimos seis imágenes que faltan. Además de esto, como he mencionado, me hizo tratar de copiar los encabezados (lo que significa que el User-Agent seguido), y no es bueno que salió de ella. El tiempo y el orden de procesamiento definitivamente no son factores bien, no hay duda al respecto.

    OriginalEl autor Vasili Syrakis

  4. 0

    Me enfrentaba problema similar al solicitar una página. Entonces me di cuenta de que la URL que yo estaba usando necesario ‘http’ se antepone a la URL, pero yo estaba anteponiendo ‘https’. Mi URL de la petición parecía https://example.com. Así que la URL aspecto http://example.com. Espero que se solucione el problema.

    Aunque esto puede ser útil en algún lugar, no veo cómo se responde a las preguntas OP preguntar. Esto haría un mejor comentario, tal vez.

    OriginalEl autor Ranger

  5. 0

    Tal vez las Peticiones de los Navegadores y el uso de diferentes formas de representar los datos en bruto del servidor WEB, y el diff en el ejemplo anterior son sólo con el renderizado de html.

    He encontrado que cuando html está roto, los diferentes navegadores, por ejemplo, Chrome y Safari, de diferentes maneras para arreglar el análisis. Así que tal vez es la misma idea con las Solicitudes y Firefox.

    De ambas Solicitudes y Firefox me sugieren para diff de los datos en bruto, es decir, la secuencia de bytes en el zócalo. Las solicitudes pueden utilizar .raw propiedad de objeto de respuesta para obtener los datos en bruto en el zócalo. (http://docs.python-requests.org/en/master/user/quickstart/) Si los datos brutos de ambos lados son iguales y hay algunos roto los códigos en HTML, tal vez es debido a los diferentes auto-fijación de políticas de la Solicitud y el navegador al analizar html roto.

    OriginalEl autor Tony Li

Dejar respuesta

Please enter your comment!
Please enter your name here