Comment utiliser les requêtes Python pour simuler une visite du navigateur?

127

Je souhaite obtenir le contenu du site Web ci-dessous. Si j'utilise un navigateur comme Firefox ou Chrome, je pourrais obtenir la vraie page de site Web que je veux, mais si j'utilise le package de requêtes Python (ou la wgetcommande) pour l'obtenir, il renvoie une page HTML totalement différente. Je pensais que le développeur du site Web avait fait des blocages pour cela, donc la question est:

Comment simuler une visite du navigateur en utilisant des requêtes python ou la commande wget?

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

user1726366
la source

Réponses:

283

Fournissez un en- User-Agenttête :

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)

Pour info, voici une liste de chaînes User-Agent pour différents navigateurs:


En remarque, il existe un package tiers très utile appelé fake-useragent qui fournit une belle couche d'abstraction sur les agents utilisateurs:

faux-useragent

Faker simple useragent à jour avec base de données réelle

Démo:

>>> 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
la source
1
merci pour votre réponse, j'ai essayé avec les en-têtes dans mes demandes mais je n'ai toujours pas pu obtenir le contenu réel de la page, il y a une chaîne "Votre navigateur Web doit avoir JavaScript activé pour que cette application s'affiche correctement." dans la page html renvoyée, dois-je ajouter la prise en charge des scripts java dans les requêtes? Si oui, comment ferais-je cela?
user1726366
8
@ user1726366: Vous ne pouvez pas simplement ajouter le support JavaScript - vous avez besoin d'un interpréteur JavaScript pour cela. L'approche la plus simple consiste à utiliser l'interpréteur JavaScript d'un vrai navigateur Web, mais vous pouvez automatiser cela à partir de Python en utilisant Selenium .
PM 2 Ring
1
@ alecxe, @ sputnick: J'ai essayé de capturer les paquets avec WireShark pour comparer la différence par rapport à l'utilisation des requêtes python et du navigateur, il semble que l'URL du site Web n'est pas statique, je dois attendre que le rendu de la page se termine, donc Selenium sonne les bons outils pour moi. Merci pour ton aide. :)
user1726366
4
@ user1726366 yup, si l'utilisation d'un vrai navigateur + sélénium répond à vos besoins, alors c'est l'approche la plus indolore. Notez que vous pouvez utiliser un PhantomJSnavigateur sans tête avec du sélénium. Merci. (n'oubliez pas d'accepter la réponse si cela vous a été utile)
alecxe
Il s'avère que certains moteurs de recherche en filtrent certains UserAgent. Quelqu'un sait pourquoi? Quelqu'un pourrait-il fournir une liste de UserAgents acceptables ?
dallonsi
30

si cette question est toujours valable

J'ai utilisé un faux UserAgent

Comment utiliser:

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)

production:

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
la source
obtient toujours l'erreur 404
Maksim Kniazev
1
404 est une erreur différente, êtes-vous sûr de pouvoir parcourir la page à l'aide d'un navigateur?
Umesh Kaushik
Absolument. J'ai l'impression que le site Web que j'essaie d'utiliser a bloqué toutes les adresses IP Amazon EC2.
Maksim Kniazev
Pourriez-vous s'il vous plaît cingler le lien ici? Je peux essayer de mon côté. De plus, si IP est bloqué, le code d'erreur doit être 403 (interdit) ou 401 (non autorisé). Il existe des sites Web qui ne permettent pas du tout le grattage. De plus, de nombreux sites Web utilisent cloudflare pour éviter aux robots d'accéder au site Web.
Umesh Kaushik
Voici mon lien regalbloodline.com/music/eminem . Cela fonctionnait bien avant. A arrêté de travailler sur python 2. J'ai travaillé sur python 3 sur une machine locale. Le passage à AWS EC2 ne fonctionnait pas là-bas. J'ai continué à obtenir l'erreur 404. Puis a également cessé de travailler sur la machine locale. L'utilisation de l'émulation de navigateur fonctionnait sur la machine locale mais pas sur EC2. En fin de compte, j'ai abandonné et j'ai trouvé un site Web alternatif à gratter. Au fait, Cloudfire pourrait-il être évité?
Maksim Kniazev
7

Essayez de faire cela, en utilisant Firefox comme faux agent utilisateur (de plus, c'est un bon script de démarrage pour le scraping Web avec l'utilisation 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)

USAGE:

python script.py "http://www.ichangtou.com/#company:data_000008.html"
Gilles Quenot
la source
3

La racine de la réponse est que la personne qui pose la question doit avoir un interpréteur JavaScript pour obtenir ce qu'elle cherche. Ce que j'ai trouvé, c'est que je suis capable d'obtenir toutes les informations que je voulais sur un site Web en json avant qu'elles ne soient interprétées par JavaScript. Cela m'a fait gagner beaucoup de temps dans ce que serait l'analyse HTML en espérant que chaque page Web soit dans le même format.

Ainsi, lorsque vous obtenez une réponse d'un site Web utilisant des requêtes, regardez vraiment le html / texte car vous pourriez trouver le javascripts JSON dans le pied de page prêt à être analysé.

Daniel Butler
la source