Come utilizzare le richieste Python per simulare una visita al browser?


127

Voglio ottenere il contenuto dal sito Web sottostante. Se utilizzo un browser come Firefox o Chrome potrei ottenere la pagina del sito web reale che desidero, ma se utilizzo il pacchetto di richieste Python (owget comando) di per ottenerlo, restituisce una pagina HTML completamente diversa. Pensavo che lo sviluppatore del sito web avesse creato alcuni blocchi per questo, quindi la domanda è:

Come posso simulare una visita al browser utilizzando richieste python o il comando wget?

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

Risposte:


283

Fornisci User-Agentun'intestazione :

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)

Cordiali saluti, ecco un elenco di stringhe agente utente per diversi browser:


Come nota a margine , c'è un pacchetto di terze parti piuttosto utile chiamato fake-useragent che fornisce un bel livello di astrazione sugli interpreti :

fake-useragent

Aggiornato semplice falsario agente utente con database del mondo reale

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'

1
grazie per la tua risposta, ho provato con le intestazioni nelle mie richieste ma non sono ancora riuscito a ottenere il contenuto reale della pagina, c'è una stringa "Il tuo browser web deve avere JavaScript abilitato affinché questa applicazione venga visualizzata correttamente." nella pagina html restituita, dovrei aggiungere il supporto per java script nelle richieste? In tal caso, come potrei farlo?
user1726366

8
@ user1726366: Non puoi semplicemente aggiungere il supporto JavaScript - hai bisogno di un interprete JavaScript per questo. L'approccio più semplice è usare l'interprete JavaScript di un vero browser Web, ma puoi automatizzarlo da Python usando Selenium .
PM 2 Ring,

1
@ alecxe, @ sputnick: ho provato a catturare i pacchetti con WireShark per confrontare la differenza rispetto all'utilizzo di richieste Python e browser, sembra che l'URL del sito web non sia statico devo aspettare che il rendering della pagina venga completato, quindi il selenio suona gli strumenti giusti per me. Grazie per il tuo gentile aiuto. :)
user1726366

4
@ user1726366 yup, se l'utilizzo di un browser reale + selenio soddisfa le tue esigenze, questo è l'approccio più indolore. Nota che puoi usare il PhantomJSbrowser headless con selenio. Grazie. (non dimenticare di accettare la risposta se è stata utile)
alecxe

Si scopre che alcuni motori di ricerca ne filtrano alcuni UserAgent. Qualcuno sa perché? Qualcuno potrebbe fornire un elenco di accettabili UserAgent?
dallonsi

30

se questa domanda è ancora valida

Ho usato un falso UserAgent

Come usare:

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)

produzione:

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]>


1
404 è un errore diverso, sei sicuro di essere in grado di navigare nella pagina utilizzando un browser?
Umesh Kaushik

Assolutamente. Mi sembra che il sito Web che sto cercando di utilizzare abbia bloccato tutti gli IP di Amazon EC2.
Maksim Kniazev

Potresti eseguire il ping del link qui? Posso provare alla mia fine. Inoltre, se l'IP è bloccato, il codice di errore dovrebbe essere 403 (vietato) o 401 (non autorizzato). Ci sono siti web che non consentono affatto lo scraping. Inoltre molti siti Web utilizzano cloudflare per evitare che i bot accedano al sito Web.
Umesh Kaushik

Ecco il mio link regalbloodline.com/music/eminem . Prima ha funzionato bene. Ha smesso di lavorare su python 2. Ha lavorato su python 3 sulla macchina locale. Il passaggio ad AWS EC2 non ha funzionato lì. Continuato a ricevere l'errore 404. Quindi ha smesso di funzionare anche sulla macchina locale. L'utilizzo dell'emulazione del browser ha funzionato sulla macchina locale ma non su EC2. Alla fine ho rinunciato e ho trovato un sito web alternativo da raschiare. A proposito, il cloudfire potrebbe essere evitato?
Maksim Kniazev

7

Prova a farlo, usando firefox come falso user agent (inoltre, è un buon script di avvio per il web scraping con l'utilizzo di cookie):

#!/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 radice della risposta è che la persona che pone la domanda deve avere un interprete JavaScript per ottenere ciò che sta cercando. Quello che ho trovato è che sono in grado di ottenere tutte le informazioni che volevo su un sito Web in json prima che fosse interpretato da JavaScript. Questo mi ha fatto risparmiare un sacco di tempo in quello che sarebbe stato analizzare html sperando che ogni pagina web sia nello stesso formato.

Quindi, quando ricevi una risposta da un sito Web utilizzando le richieste, guarda davvero html / text perché potresti trovare il javascript JSON nel piè di pagina pronto per essere analizzato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.