Como usar solicitações Python para falsificar uma visita ao navegador?

126

Quero obter o conteúdo do site abaixo. Se eu usar um navegador como o Firefox ou o Chrome, poderia obter a página do site real desejada, mas se eu usar o pacote de solicitações (ou wgetcomando) do Python para obtê-lo, ele retornará uma página HTML totalmente diferente. Eu pensei que o desenvolvedor do site tivesse feito alguns bloqueios para isso, então a questão é:

Como falsifico uma visita ao navegador usando solicitações python ou comando wget?

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

user1726366
fonte

Respostas:

281

Forneça um User-Agentcabeçalho :

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)

FYI, aqui está uma lista de cadeias de User-Agent para diferentes navegadores:


Como uma observação lateral, há um pacote de terceiros bastante útil chamado fake-useragent que fornece uma boa camada de abstração sobre os agentes do usuário:

fake-useragent

Atualizado simples agente de acesso falso com banco de dados do mundo real

Demo:

>>> 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'
alecxe
fonte
1
obrigado pela resposta, tentei com os cabeçalhos em minhas solicitações, mas ainda não consegui obter o conteúdo real da página. Existe uma sequência de caracteres 'Seu navegador da web deve ter o JavaScript ativado para que o aplicativo seja exibido corretamente'. na página html retornada, devo adicionar suporte a scripts java nas solicitações? Se sim, como eu faria isso?
user1726366
8
@ user1726366: Você não pode simplesmente adicionar suporte a JavaScript - é necessário um intérprete de JavaScript para isso. A abordagem mais simples é usar o intérprete JavaScript de um navegador da Web real, mas você pode automatizar isso a partir do Python usando o Selenium .
PM 2Ring
1
@ alecxe, @ sputnick: Tentei capturar os pacotes com o wireshark para comparar a diferença de usar solicitações e navegador python, parece que o URL do site não é estático. Preciso aguardar a renderização da página para concluir, o Selenium soa as ferramentas certas para mim. Obrigado por sua amável ajuda. :)
user1726366
4
@ user1726366 Sim, se o uso de um navegador real + selênio atender às suas necessidades, essa é a abordagem mais simples. Observe que você pode usar o PhantomJSnavegador sem cabeça com selênio. Obrigado. (não se esqueça de aceitar a resposta se ele foi útil)
alecxe
30

se esta pergunta ainda é válida

Eu usei UserAgent falso

Como usar:

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)

resultado:

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]>
Umesh Kaushik
fonte
ainda está recebendo o erro 404
Maksim Kniazev
1
404 é um erro diferente. Tem certeza de que consegue navegar na página usando um navegador?
Umesh Kaushik
Absolutamente. Sinto que o site que estou tentando usar bloqueou todos os IPs do Amazon EC2.
Maksim Kniazev 16/05/19
Poderia fazer o ping no link aqui? Eu posso tentar no meu fim. Além disso, se o IP estiver bloqueado, o código de erro deve ser 403 (proibido) ou 401 (não autorizado). Existem sites que não permitem a raspagem. Muitos sites usam o cloudflare para evitar que os bots acessem o site.
Umesh Kaushik
Aqui está o meu link regalbloodline.com/music/eminem . Funcionou bem antes. Parou de trabalhar no python 2. Trabalhou no python 3 na máquina local. Mover para o AWS EC2 não funcionou lá. Continuou recebendo o Erro 404. Em seguida, parou de funcionar também na máquina local. O uso da emulação de navegador funcionou na máquina local, mas não no EC2. No final, desisti e encontrei um site alternativo para raspar. A propósito, cloudfire poderia ser evitado?
Maksim Kniazev
7

Tente fazer isso, usando o firefox como agente de usuário falso (além disso, é um bom script de inicialização para raspagem na web com o 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"
Gilles Quenot
fonte
3

A raiz da resposta é que a pessoa que faz a pergunta precisa ter um intérprete de JavaScript para obter o que quer. O que eu descobri é que posso obter todas as informações que eu queria em um site em json antes de serem interpretadas por JavaScript. Isso me salvou uma tonelada de tempo no que seria analisar html, esperando que cada página da Web esteja no mesmo formato.

Portanto, quando você obtém uma resposta de um site usando solicitações, observe realmente o html / text, pois você pode encontrar os javascripts JSON no rodapé prontos para serem analisados.

Daniel Butler
fonte