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?
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 importUserAgent>>> 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'
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)
from fake_useragent importUserAgentimport 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;IntelMac OS X 10_8_2)AppleWebKit/537.17(KHTML, like Gecko)Chrome/24.0.1309.0Safari/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]>
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=4import 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)
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.
PhantomJS
navegador sem cabeça com selênio. Obrigado. (não se esqueça de aceitar a resposta se ele foi útil)se esta pergunta ainda é válida
Eu usei UserAgent falso
Como usar:
resultado:
fonte
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):
USO:
fonte
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.
fonte