Proxy cu urllib2 (Programare, Python, Proxy, Urllib2)

Chris Stryker a intrebat.

Deschid urile cu:

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

Și ceea ce vreau să fac este să mă conectez în același mod cu un proxyAm primit undeva care îmi spune:

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

dar nici asta nu a funcționat.

Știu că urllib2 are ceva de genul unui proxy handler, dar nu-mi amintesc acea funcție.

7 răspunsuri
ZelluX
proxy = urllib2.ProxyHandler({'http': '127.0.0.1'})
opener = urllib2.build_opener(proxy)
urllib2.install_opener(opener)
urllib2.urlopen('http://www.google.com')

Comentarii

  • Bună, @ZelluX, vreau ca setarea proxies să fie activată doar pe anumite funcții, asta înseamnă că trebuie să instalez și să dezinstalez deschizătorul pentru fiecare invocare a funcției? –  > Por satoru.
  • @Satoru.Logic Poate poți scrie un decorator pentru a simplifica procesul de instalare/dezinstalare? –  > Por ZelluX.
  • Se pare că nu există uninstall metodă în urllib2, , dar putem face setări proxy unice; în loc de installing deschizătorul, creăm un request și folosim un deschizător pentru a open acesta. –  > Por satoru.
  • @Satoru.Logic: Cred că abordarea tradițională este de a configura o variabilă de mediu precum HTTP_PROXY și apoi să verificați în codul dvs. dacă este definită folosind os.environ["HTTP_PROXY"]. –  > Por ccpizza.
  • nu uitați numărul portului, de exemplu 3128 proxy = urllib2.ProxyHandler({‘http’: ‘127.0.0.1:3128’}) – –  > Por J’e.
dcrosta

Trebuie să instalați un ProxyHandler

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

Comentarii

  • Primesc Fișier „D:/Desktop/Desktop/mygoogl”, linia 64, site = url.urlopen(‘google.com) Fișier „C:Python26liburllib2.py”, linia 124, in urlopen return _opener.open(url, data, timeout) AttributeError: Instanța ProxyHandler nu are atributul ‘open’ –  > Por Chris Stryker.
  • Am ratat un apel la urllib2.build_opener() –  > Por dcrosta.
cașmir

Puteți seta proxy-uri folosind variabile de mediu.

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

urllib2 va adăuga automat gestionari de proxy-uri în acest mod. Trebuie să setați proxy-uri pentru diferite protocoale separat, altfel acestea vor eșua (în sensul că nu vor trece prin proxy), a se vedea mai jos.

De exemplu:

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

În loc de

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

Comentarii

  • Nu ar fi trebuit să folosiți, de exemplu, os.environ[‘http_proxy’] în cele două seturi de exemple de mai jos? –  > Por Jonathan Benn.
blueyed

Pentru a utiliza proxy-urile implicite ale sistemului (de exemplu, din variabila de mediu http_support), următoarele funcționează pentru cererea curentă (fără a le instala în urllib2 la nivel global):

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

HCC

În plus față de răspunsul acceptat: Scipt-ul meu mi-a dat o eroare

File "c:Python23liburllib2.py", line 580, in proxy_open
    if '@' in host:
TypeError: iterable argument required

Soluția a fost să adaug http:// în fața șirului proxy:

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

Waqar Detho

Se pot folosi și cereri dacă dorim să accesăm o pagină web folosind proxy-uri. Cod Python 3:

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

De asemenea, se pot adăuga mai multe proxy-uri.

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

Comentarii

  • Bună ziua @WaqarDetho Cum se va ști ce adrese proxy să se folosească? Sunt doar niște adrese ip aleatorii? –  > Por Aman Singh.
  • Bună @AmanSingh Am făcut acest lucru cu mult timp în urmă. Dar, din câte îmi amintesc, găsesc aceste adrese proxy de pe internet. Le-am injectat manual în cod. –  > Por Waqar Detho.
pensebien

În plus, setați proxy-ul pentru sesiunea liniei de comandăDeschideți o linie de comandă în care ați putea dori să rulați scriptul dvs.

netsh winhttp set proxy YourProxySERVER:yourProxyPORT

rulați scriptul dvs. în acel terminal.