Modification de l'agent utilisateur sur urllib2.urlopen


99

Comment puis-je télécharger une page Web avec un agent utilisateur autre que celui par défaut sur urllib2.urlopen?

Réponses:


61

Configuration de l'agent utilisateur à partir de la plongée préférée de tout le monde dans Python .

La petite histoire: vous pouvez utiliser Request.add_header pour ce faire.

Vous pouvez également transmettre les en-têtes en tant que dictionnaire lors de la création de la requête elle-même, comme le note la documentation :

les en-têtes doivent être un dictionnaire et seront traités comme s'ils add_header()étaient appelés avec chaque clé et valeur comme arguments. Ceci est souvent utilisé pour «usurper» l'en- User-Agenttête, qui est utilisé par un navigateur pour s'identifier - certains serveurs HTTP n'autorisent que les requêtes provenant de navigateurs courants par opposition aux scripts. Par exemple, Mozilla Firefox peut s'identifier comme "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", tandis que urllib2la chaîne par défaut de l'agent utilisateur est "Python-urllib/2.6"(sur Python 2.6).


117

J'ai répondu à une question similaire il y a quelques semaines.

Il y a un exemple de code dans cette question, mais en gros, vous pouvez faire quelque chose comme ceci: (Notez la mise en majuscule User-Agentde la RFC 2616 , section 14.43.)

opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')

8
Cette méthode fonctionne pour d'autres en-têtes, mais pas pour User-Agent - du moins pas dans mon installation 2.6.2. L'agent utilisateur est ignoré pour une raison quelconque.
Nathan

3
Je crois que User-agentdevrait en fait être User-Agent(Le A est en majuscule) Semble fonctionner pour moi une fois fait.
KriiV

1
Les noms d'en-tête sont insensibles à la casse.
Nicolás

100
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()

Ou, un peu plus court:

req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' })
html = urllib2.urlopen(req).read()

4
Avec des paramètres nommés, vous pouvez le faire en deux lignes. Retirez la première ligne et remplacer le deuxième par ceci: req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'}). Je préfère ce formulaire pour faire une seule demande.
Iain Samuel McLean Elder

Ou encore plus court, sur une seule ligne:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
utilisateur

13

Pour python 3, urllib est divisé en 3 modules ...

import urllib.request
req = urllib.request.Request(url="http://localhost/", headers={'User-Agent':' Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/12.0'})
handler = urllib.request.urlopen(req)

Cela a aidé à merveille. Je ne comprends pas pourquoi j'ai besoin de request.Request et puis répétez urllib.request.urlopen où l'ancienne version ferait juste urllib.urlopen (req) bien mais de toute façon, cela fonctionne et je sais comment l'utiliser dans python 3 maintenant .
jamescampbell

Je reçois toujours l'erreur 404 :(
Maksim Kniazev

J'ai supprimé le data=b'None'paramètre déroutant de la réponse. Il a transformé l'exemple de demande en POST avec des données non valides. Probablement la raison de l'échec dans votre cas, @Maksim
utilisateur

9

Tout cela devrait fonctionner en théorie, mais (avec Python 2.7.2 sous Windows au moins) chaque fois que vous envoyez un en-tête User-agent personnalisé, urllib2 n'envoie pas cet en-tête. Si vous n'essayez pas d'envoyer un en-tête User-agent, il envoie le Python / urllib2 par défaut

Aucune de ces méthodes ne semble fonctionner pour l'ajout de User-agent, mais elles fonctionnent pour d'autres en-têtes:

opener = urllib2.build_opener(proxy)
opener.addheaders = {'User-agent':'Custom user agent'}
urllib2.install_opener(opener)

request = urllib2.Request(url, headers={'User-agent':'Custom user agent'})

request.headers['User-agent'] = 'Custom user agent'

request.add_header('User-agent', 'Custom user agent')

2
opener.addheadersdevrait probablement l'être [('User-agent', 'Custom user agent')]. Sinon, toutes ces méthodes devraient fonctionner (j'ai testé sur Python 2.7.3 (Linux)). Dans votre cas, cela peut casser parce que vous utilisez l'argument proxy de manière incorrecte.
jfs

Pour moi, l'appel build_opener revient avec un User-Agent par défaut déjà défini dans les en-têtes. Ainsi, l'ajout créera simplement un autre en-tête User-Agent, qui en tant que 2nd sera ignoré. C'est pourquoi le sol de @ jcoon fonctionne.
Vajk Hermecz du

6

Pour urllibvous pouvez utiliser:

from urllib import FancyURLopener

class MyOpener(FancyURLopener, object):
    version = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; it; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11'

myopener = MyOpener()
myopener.retrieve('https://www.google.com/search?q=test', 'useragent.html')

5

Une autre solution dans urllib2et Python 2.7:

req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)


2

Essaye ça :

html_source_code = requests.get("http://www.example.com/",
                   headers={'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.107 Safari/537.36',
                            'Upgrade-Insecure-Requests': '1',
                            'x-runtime': '148ms'}, 
                   allow_redirects=True).content

1
La question traite explicitement urllib2et non d'autres modules.
Ron Klein

2

il existe deux propriétés de à urllib.URLopener()savoir:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]et
version = 'Python-urllib/1.17'.
Pour tromper le site Web, vous devez modifier ces deux valeurs en un agent utilisateur accepté. par exemple pour le
navigateur Chrome: 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.149 Safari/537.36'
Google bot: 'Googlebot/2.1'
comme ça

import urllib
page_extractor=urllib.URLopener()  
page_extractor.addheaders = [('User-Agent', 'Googlebot/2.1'), ('Accept', '*/*')]  
page_extractor.version = 'Googlebot/2.1'
page_extractor.retrieve(<url>, <file_path>)

la modification d'une seule propriété ne fonctionne pas car le site Web la marque comme une demande suspecte.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.