Proxy mit urllib2


76

Ich öffne URLs mit:

site = urllib2.urlopen('http://google.com')

Und was ich tun möchte, ist auf die gleiche Weise mit einem Proxy zu verbinden, den ich irgendwo bekommen habe und der mir sagt:

site = urllib2.urlopen('http://google.com', proxies={'http':'127.0.0.1'})

aber das hat auch nicht funktioniert.

Ich weiß, dass urllib2 so etwas wie einen Proxy-Handler hat, aber ich kann mich nicht an diese Funktion erinnern.

Antworten:


142
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

1
Hallo, @ZelluX, ich möchte nur, dass die Proxy-Einstellung für eine Funktion aktiviert wird. Bedeutet das, dass ich den Opener für jeden Aufruf der Funktion installieren und deinstallieren muss?
Satoru

@ Satoru.Logic Vielleicht können Sie einen Dekorateur schreiben, um den Installations- / Deinstallationsprozess zu vereinfachen?
ZelluX

2
Es scheint, dass es keine uninstallMethode gibt urllib2, aber wir können einmalige Proxy-Einstellungen vornehmen. Anstelle des installingÖffners erstellen wir ein requestObjekt und verwenden einen Öffner opendafür.
Satoru

3
@ Satoru.Logic: Ich denke, der traditionelle Ansatz besteht darin, eine Umgebungsvariable wie zu konfigurieren HTTP_PROXYund dann Ihren Code einzuchecken, wenn er mit definiert ist os.environ["HTTP_PROXY"].
ccpizza

Vergessen Sie nicht die Portnummer, zB 3128 proxy = urllib2.ProxyHandler ({'http': '127.0.0.1:3128'})
J'e

18

Sie müssen einen ProxyHandler installieren

urllib2.install_opener(
    urllib2.build_opener(
        urllib2.ProxyHandler({'http': '127.0.0.1'})
    )
)
urllib2.urlopen('http://www.google.com')

Ich erhalte die Datei "D: / Desktop / Desktop / mygoogl", Zeile 64, site = url.urlopen ('google.com) Datei "C: \ Python26 \ lib \ urllib2.py", Zeile 124, in urlopen return _opener. open (URL, Daten, Zeitüberschreitung) AttributeError: Die ProxyHandler-Instanz hat kein Attribut 'open'
Chris Stryker

Ich habe einen Anruf bei urllib2.build_opener ()
dcrosta

12

Sie können Proxys mithilfe von Umgebungsvariablen festlegen.

import os
os.environ['http_proxy'] = '127.0.0.1'
os.environ['https_proxy'] = '127.0.0.1'

urllib2fügt auf diese Weise automatisch Proxy-Handler hinzu. Sie müssen Proxys für verschiedene Protokolle separat festlegen, da sie sonst fehlschlagen (wenn Sie den Proxy nicht durchlaufen) (siehe unten).

Zum Beispiel:

proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')
# next line will fail (will not go through the proxy) (https)
urllib2.urlopen('https://www.google.com')

Stattdessen

proxy = urllib2.ProxyHandler({
    'http': '127.0.0.1',
    'https': '127.0.0.1'
})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
# this way both http and https requests go through the proxy
urllib2.urlopen('http://www.google.com')
urllib2.urlopen('https://www.google.com')

Sollten Sie in Ihren beiden unteren Beispielsätzen nicht zB os.environ ['http_proxy'] verwendet haben?
Jonathan Benn

7

Um die Standardsystem-Proxys zu verwenden (z. B. aus der Umgebungsvariablen http_support), funktioniert Folgendes für die aktuelle Anforderung (ohne sie global in urllib2 zu installieren):

url = 'http://www.example.com/'
proxy = urllib2.ProxyHandler()
opener = urllib2.build_opener(proxy)
in_ = opener.open(url)
in_.read()

3

Zusätzlich zur akzeptierten Antwort: Mein Scipt hat mir einen Fehler gegeben

File "c:\Python23\lib\urllib2.py", line 580, in proxy_open
    if '@' in host:
TypeError: iterable argument required

Die Lösung bestand darin, http: // vor der Proxy-Zeichenfolge hinzuzufügen:

proxy = urllib2.ProxyHandler({'http': 'http://proxy.xy.z:8080'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

2

Man kann auch Anfragen verwenden, wenn wir über Proxys auf eine Webseite zugreifen möchten. Python 3-Code:

>>> import requests
>>> url = 'http://www.google.com'
>>> proxy = '169.50.87.252:80'
>>> requests.get(url, proxies={"http":proxy})
<Response [200]>

Es können auch mehrere Proxys hinzugefügt werden.

>>> proxy1 = '169.50.87.252:80'
>>> proxy2 = '89.34.97.132:8080'
>>> requests.get(url, proxies={"http":proxy1,"http":proxy2})
<Response [200]>

Hi @WaqarDetho Woher weiß man, welche Proxy-Adressen zu verwenden sind? Sind es nur zufällige IP-Adressen?
Aman Singh

Hi @AmanSingh, das habe ich vor langer Zeit gemacht. Aber soweit ich mich erinnere, finde ich diese Proxy-Adressen aus dem Internet. Ich habe sie manuell in den Code eingefügt.
Waqar Detho

0

Legen Sie außerdem den Proxy für die Befehlszeilensitzung fest. Öffnen Sie eine Befehlszeile, in der Sie möglicherweise Ihr Skript ausführen möchten

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

Führen Sie Ihr Skript in diesem Terminal aus.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.