Benutzeragent auf urllib2.urlopen ändern

99

Wie kann ich eine Webseite mit einem anderen als dem Standard-Benutzeragenten auf urllib2.urlopen herunterladen?


quelle

Antworten:

61

Einstellen des User-Agent von jedem Lieblings- Tauchgang in Python .

Die Kurzgeschichte: Sie können Request.add_header verwenden verwenden.

Sie können die Header auch als Wörterbuch übergeben, wenn Sie die Anforderung selbst erstellen, wie in den Dokumenten angegeben :

Header sollten ein Wörterbuch sein und werden so behandelt, als ob add_header()sie mit jedem Schlüssel und Wert als Argumente aufgerufen würden. Dies wird häufig verwendet, um den User-AgentHeader zu "fälschen" , der von einem Browser verwendet wird, um sich selbst zu identifizieren. Einige HTTP-Server erlauben nur Anforderungen von gängigen Browsern im Gegensatz zu Skripten. Beispielsweise kann sich Mozilla Firefox als identifizieren "Mozilla/5.0 (X11; U; Linux i686) Gecko/20071127 Firefox/2.0.0.11", während urllib2die Standardzeichenfolge für Benutzeragenten "Python-urllib/2.6"(unter Python 2.6) lautet .

Paolo Bergantino
quelle
117

Ich habe eine ähnliche Frage beantwortet ein paar Wochen .

Diese Frage enthält Beispielcode, aber im Grunde können Sie Folgendes tun: (Beachten Sie die Großschreibung User-Agentab RFC 2616 , Abschnitt 14.43.)

opener = urllib2.build_opener()
opener.addheaders = [('User-Agent', 'Mozilla/5.0')]
response = opener.open('http://www.stackoverflow.com')
Jason Coon
quelle
8
Diese Methode funktioniert für andere Header, aber nicht für User-Agent - zumindest nicht in meiner 2.6.2-Installation. User-Agent wird aus irgendeinem Grund ignoriert.
Nathan
3
Ich glaube, User-agentsollte in der Tat sein User-Agent(Das A ist groß geschrieben) Scheint für mich zu arbeiten, wenn dies getan wird.
KriiV
1
Bei Headernamen wird die Groß- und Kleinschreibung nicht berücksichtigt.
Nicolás
100
headers = { 'User-Agent' : 'Mozilla/5.0' }
req = urllib2.Request('www.example.com', None, headers)
html = urllib2.urlopen(req).read()

Oder etwas kürzer:

req = urllib2.Request('www.example.com', headers={ 'User-Agent': 'Mozilla/5.0' })
html = urllib2.urlopen(req).read()
Paolo
quelle
4
Mit benannten Parametern können Sie dies in zwei Zeilen tun. Entfernen Sie die erste Zeile und ersetzen Sie die zweite durch : req = urllib2.Request('www.example.com', headers={'User-Agent': 'Mozilla/5.0'}). Ich bevorzuge dieses Formular, um nur eine einzige Anfrage zu stellen.
Iain Samuel McLean Elder
Oder noch kürzer, in einer Zeile:html = urlopen(Request('http://www.example.com', headers={'User-Agent': 'Mozilla/5.0'})).read()
Benutzer
13

Für Python 3 ist urllib in 3 Module aufgeteilt ...

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
quelle
Das hat wunderbar geholfen. Ich verstehe nicht, warum ich request.Request benötige und dann urllib.request.urlopen wiederhole, wo die alte Version nur urllib.urlopen (req) in Ordnung bringen würde, aber so oder so funktioniert dies und ich weiß, wie man es jetzt in Python 3 verwendet .
Jamescampbell
Ich
bekomme
Ich habe den verwirrenden data=b'None'Parameter aus der Antwort entfernt. Die Beispielanforderung wurde in POST mit ungültigen Daten umgewandelt. Wahrscheinlich der Grund für den Fehler in Ihrem Fall, @Maksim
Benutzer
9

All dies sollte theoretisch funktionieren, aber (zumindest mit Python 2.7.2 unter Windows) jedes Mal, wenn Sie einen benutzerdefinierten User-Agent-Header senden, sendet urllib2 diesen Header nicht. Wenn Sie nicht versuchen, einen User-Agent-Header zu senden, wird der Standardwert Python / urllib2 gesendet

Keine dieser Methoden scheint für das Hinzufügen von User-Agent zu funktionieren, aber sie funktionieren für andere Header:

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')
Fidschiaaron
quelle
2
opener.addheaderssollte wohl sein [('User-agent', 'Custom user agent')]. Andernfalls sollten alle diese Methoden funktionieren (ich habe unter Python 2.7.3 (Linux) getestet). In Ihrem Fall kann es zu einem Fehler kommen, weil Sie das Proxy-Argument falsch verwenden.
JFS
Für mich kehrt der Aufruf build_opener mit einem Standard-User-Agent zurück, der bereits in den Headern definiert ist. Durch das Anhängen wird lediglich ein weiterer User-Agent-Header erstellt, der als zweiter ignoriert wird. Deshalb funktioniert @ jcoons Sol.
Vajk Hermecz
6

Für urllibSie können verwenden:

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
quelle
5

Eine andere Lösung in urllib2und Python 2.7:

req = urllib2.Request('http://www.example.com/')
req.add_unredirected_header('User-Agent', 'Custom User-Agent')
urllib2.urlopen(req)
OH2GBA
quelle
2
Ich erhalte einen Fehler 404 für eine Seite, die existiert, wenn die URL über meinen Browser
eingegeben wurde
2

Versuche dies :

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
quelle
1
Die Frage diskutiert explizit urllib2und nicht andere Module.
Ron Klein
2

Es gibt zwei Eigenschaften, urllib.URLopener()nämlich:
addheaders = [('User-Agent', 'Python-urllib/1.17'), ('Accept', '*/*')]und
version = 'Python-urllib/1.17'.
Um die Website zu täuschen, müssen Sie beide Werte in einen akzeptierten User-Agent ändern. für zB
Chrome Browser: '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'
so

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

Das Ändern nur einer Eigenschaft funktioniert nicht, da die Website sie als verdächtige Anfrage markiert.

twitu
quelle