Modification de l'agent utilisateur sur urllib2.urlopen
-
03-07-2019 - |
Question
Comment puis-je télécharger une page Web avec un agent utilisateur autre que celui par défaut sur urllib2.urlopen?
La solution
Définition de l'agent utilisateur dans le favori de tous Plongez au coeur de Python .
La nouvelle: vous pouvez utiliser Request.add_header . faire ceci.
Vous pouvez également passer les en-têtes en tant que dictionnaire lors de la création de la demande elle-même, as la note de la documentation :
Lesen-têtes doivent être un dictionnaire et seront traités comme si
add_header ()
était appelé avec chaque clé et valeur en tant qu'argument. Ceci est souvent utilisé pour & # 8220; usurper & # 8221; l'en-têteUser-Agent
, qui permet au navigateur de s'identifier & # 8211; certains serveurs HTTP n'autorisent que les requêtes provenant de navigateurs courants, par opposition aux scripts. Par exemple, Mozilla Firefox peut s’identifier en tant que"Mozilla / 5.0 (X11; U; Linux i686) Gecko / 20071127 Firefox / 2.0.0.11"
, tandis queurllib2
& La chaîne d'agent utilisateur par défaut de # 8216; est"Python-urllib / 2.6"
(sur Python 2.6).
Autres conseils
J'ai répondu à un question similaire quelques semaines auparavant.
Il y a un exemple de code dans cette question, mais vous pouvez faire quelque chose comme ceci: (notez la capitalisation de User-Agent
à partir de RFC 2616 , section 14.43.)
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
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()
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)
Tout cela devrait fonctionner en théorie, mais (avec Python 2.7.2 au moins sous Windows), 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 enverra le fichier Python / urllib2 par défaut
Aucune de ces méthodes ne semble fonctionner pour ajouter un agent utilisateur, mais elle fonctionne 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')
Pour urllib
, vous 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')
Une autre solution dans urllib2
et Python 2.7:
req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)
Essayez ceci:
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
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 User-Agent accepté. par exemple
Navigateur Chrome: 'Mozilla / 5.0 (X11; Linux x86_64) AppleWebKit / 537.36 (KHTML, comme 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>)
modifier une seule propriété ne fonctionne pas car le site Web la marque comme une requête suspecte.