Comment puis-je télécharger une page Web avec un agent utilisateur autre que celui par défaut sur urllib2.urlopen?
Comment puis-je télécharger une page Web avec un agent utilisateur autre que celui par défaut sur urllib2.urlopen?
Réponses:
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-Agent
tê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 queurllib2
la chaîne par défaut de l'agent utilisateur est"Python-urllib/2.6"
(sur Python 2.6).
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-Agent
de la RFC 2616 , section 14.43.)
opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
User-agent
devrait en fait être User-Agent
(Le A est en majuscule) Semble fonctionner pour moi une fois fait.
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()
req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'})
. Je préfère ce formulaire pour faire une seule demande.
html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).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)
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
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')
opener.addheaders
devrait 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.
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')
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
urllib2
et non d'autres modules.
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.