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?


la source

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).

Paolo Bergantino
la source
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')
Jason Coon
la source
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()
Paolo
la source
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)
Jay Dave
la source
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')
fijiaaron
la source
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')
CONvid19
la source
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)
OH2GBA
la source
2
J'obtiens
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
akash karothiya
la source
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.

Twitu
la source