¿Cómo utilizar las solicitudes de Python para falsificar una visita al navegador?


127

Quiero obtener el contenido del siguiente sitio web. Si utilizo un navegador como Firefox o Chrome, podría obtener la página del sitio web real que quiero, pero si uso el paquete de solicitudes de Python (o wgetcomando) para obtenerla, devuelve una página HTML totalmente diferente. Pensé que el desarrollador del sitio web había hecho algunos bloqueos para esto, así que la pregunta es:

¿Cómo falsifico una visita al navegador usando solicitudes de Python o el comando wget?

http://www.ichangtou.com/#company:data_000008.html

Respuestas:


283

Proporcione un User-Agentencabezado :

import requests

url = 'http://www.ichangtou.com/#company:data_000008.html'
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

response = requests.get(url, headers=headers)
print(response.content)

Para su información, aquí hay una lista de cadenas de agente de usuario para diferentes navegadores:


Como nota al margen, hay un paquete de terceros bastante útil llamado fake-useragent que proporciona una buena capa de abstracción sobre los agentes de usuario:

agente falso

Faker simple de useragent actualizado con base de datos del mundo real

Manifestación:

>>> from fake_useragent import UserAgent
>>> ua = UserAgent()
>>> ua.chrome
u'Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36'
>>> ua.random
u'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.67 Safari/537.36'

1
gracias por su respuesta, intenté con los encabezados en mis solicitudes pero aún no pude obtener el contenido real de la página, hay una cadena 'Su navegador web debe tener JavaScript habilitado para que esta aplicación se muestre correctamente'. en la página html devuelta, ¿debo agregar compatibilidad con scripts java en las solicitudes? Si es así, ¿cómo haría eso?
user1726366

8
@ user1726366: No puede simplemente agregar compatibilidad con JavaScript; necesita un intérprete de JavaScript para eso. El enfoque más simple es usar el intérprete de JavaScript de un navegador web real, pero puede automatizarlo desde Python usando Selenium .
PM 2 Ring

1
@ alecxe, @ sputnick: Traté de capturar los paquetes con wirehark para comparar la diferencia con el uso de solicitudes de Python y el navegador, parece que la URL del sitio web no es estática, tengo que esperar a que se complete el procesamiento de la página, así que suena Selenium las herramientas adecuadas para mí. Gracias por su amable ayuda. :)
user1726366

4
@ user1726366 Sí, si el uso de un navegador real + selenio se adapta a sus necesidades, este es el enfoque más sencillo. Tenga en cuenta que puede utilizar un PhantomJSnavegador sin cabeza con selenio. Gracias. (no olvide aceptar la respuesta si fue útil)
alecxe

Resulta que algunos motores de búsqueda filtran algunos UserAgent. ¿Alguien sabe por qué? ¿Alguien podría proporcionar una lista de mensajes aceptables UserAgent?
dallonsi hace

30

si esta pregunta sigue siendo válida

He usado el agente de usuario falso

Cómo utilizar:

from fake_useragent import UserAgent
import requests


ua = UserAgent()
print(ua.chrome)
header = {'User-Agent':str(ua.chrome)}
print(header)
url = "https://www.hybrid-analysis.com/recent-submissions?filter=file&sort=^timestamp"
htmlContent = requests.get(url, headers=header)
print(htmlContent)

salida:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1309.0 Safari/537.17
{'User-Agent': 'Mozilla/5.0 (X11; OpenBSD i386) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36'}
<Response [200]>

sigue recibiendo el Error 404
Maksim Kniazev

1
404 es un error diferente, ¿está seguro de que puede navegar por la página con un navegador?
Umesh Kaushik

Absolutamente. Siento que el sitio web que intento utilizar bloqueó todas las direcciones IP de Amazon EC2.
Maksim Kniazev

¿Podría hacer ping al enlace aquí? Puedo intentarlo al final. Además, si la IP está bloqueada, el código de error debe ser 403 (prohibido) o 401 (no autorizado). Hay sitios web que no permiten raspar en absoluto. Además, muchos sitios web utilizan cloudflare para evitar que los bots accedan al sitio web.
Umesh Kaushik

Aquí está mi enlace regalbloodline.com/music/eminem . Funcionó bien antes. Dejó de trabajar en Python 2. Trabajó en Python 3 en la máquina local. Pasar a AWS EC2 no funcionó allí. Seguí recibiendo el error 404. Luego dejó de funcionar en la máquina local también. El uso de la emulación del navegador funcionó en la máquina local pero no en EC2. Al final me di por vencido y encontré un sitio web alternativo para raspar. Por cierto, ¿se podría evitar el fuego de nubes?
Maksim Kniazev

7

Intente hacer esto, usando Firefox como agente de usuario falso (además, es un buen script de inicio para raspado web con el uso de cookies):

#!/usr/bin/env python2
# -*- coding: utf8 -*-
# vim:ts=4:sw=4


import cookielib, urllib2, sys

def doIt(uri):
    cj = cookielib.CookieJar()
    opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
    page = opener.open(uri)
    page.addheaders = [('User-agent', 'Mozilla/5.0')]
    print page.read()

for i in sys.argv[1:]:
    doIt(i)

USO:

python script.py "http://www.ichangtou.com/#company:data_000008.html"

3

La raíz de la respuesta es que la persona que hace la pregunta necesita tener un intérprete de JavaScript para obtener lo que busca. Lo que encontré es que puedo obtener toda la información que quería en un sitio web en json antes de que fuera interpretada por JavaScript. Esto me ha ahorrado un montón de tiempo en lo que sería analizar html con la esperanza de que cada página web tenga el mismo formato.

Entonces, cuando obtenga una respuesta de un sitio web que usa solicitudes, realmente mire el html / text porque puede encontrar los javascripts JSON en el pie de página listos para ser analizados.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.