2011-11-27 25 views
83

Python için mükemmel Requests modülü hakkında sadece kısa, basit bir.Python 'İstekler' modülü ile Proxy'ler

"Proxy'ler" değişkeninin içermesi gereken belgelerde bulamıyorum. Standart bir "IP: PORT" değeri olan bir dict gönderdiğimde, 2 değer isteyerek reddetti. Yani, sanırım (çünkü bu, dokümanlar içinde ele alınmamış gibi görünüyor) ilk değerin ip ve ikincisi de liman olduğunu mu?

dokümanlar bu sadece söz:

proxies – (optional) Dictionary mapping protocol to the URL of the proxy.

Yani Ben ne yaptığımı edilmelidir ... Bu çalıştı?

proxy = { ip: port} 

ve bunları bir türe dönüştürmeden önce bunları bir türe dönüştürmeliyim?

r = requests.get(url,headers=headers,proxies=proxy) 
+0

teşekkür ederim :) yansıtacak şekilde güncellenir görüyoruz. –

+3

ve inanılmaz derecede hızlı! yığın taşmadan önce neredeydim? :) –

cevap

148

proxies 'dict sözdizimi {"protocol":"ip:port", ...} olduğunu. requests documentation çıkarılabilir

http_proxy = "http://10.10.1.10:3128" 
https_proxy = "https://10.10.1.11:1080" 
ftp_proxy = "ftp://10.10.1.10:3128" 

proxyDict = { 
       "http" : http_proxy, 
       "https" : https_proxy, 
       "ftp" : ftp_proxy 
      } 

r = requests.get(url, headers=headers, proxies=proxyDict) 

:

Parameters:
method – method for the new Request object.
url – URL for the new Request object.
...
proxies – (optional) Dictionary mappingprotocol to the URL of the proxy.
...

Ile http, https ve ftp protokollerini kullanarak istekleri için farklı (veya aynı) proxie (ler) belirtebilirsiniz

Linux'da bunu HTTP_PROXY, HTTPS_PROXY ve FTP_PROXY ortamı aracılığıyla yapabilirsiniz riables: Windows'ta

export HTTP_PROXY=10.10.1.10:3128 
export HTTPS_PROXY=10.10.1.11:1080 
export FTP_PROXY=10.10.1.10:3128 

:

set http_proxy=10.10.1.10:3128 
set https_proxy=10.10.1.11:1080 
set ftp_proxy=10.10.1.10:3128 

sayesinde Jay bu işaret için:
sözdizimi istekleri 2.0.0 ile değişti.
Sen url bir şema eklemeniz gerekir: http://docs.python-requests.org/en/latest/user/advanced/#proxies burada

+9

onun tekrar !!!! elması sen söyle, tekrar teşekkürler! omzumda yaşamak ister misin : D btw - bunu nasıl biliyordun? –

+9

@Cigar StackOverflow senin omzunsa, o zaman zaten yaptım;) – chown

+0

@cigar Biliyorum çünkü urllib2 proxy'leri için tam olarak aynı formatı kullanıyor ve http://docs.python-requests.org/en/ son/api/# modül istekleri "proxy'leri - (isteğe bağlı) proxy'nin URL'sine sözlük eşleme protokolü" diyor. ", hemen biliyordum. – chown

2

benim temel sınıf vekil yapılandırmaları ve kronometre bazılarıyla istekleri modülü için piton var!

import requests 
import time 
class BaseCheck(): 
    def __init__(self, url): 
     self.http_proxy = "http://user:[email protected]:8080" 
     self.https_proxy = "http://user:[email protected]:8080" 
     self.ftp_proxy = "http://user:[email protected]:8080" 
     self.proxyDict = { 
         "http" : self.http_proxy, 
         "https" : self.https_proxy, 
         "ftp" : self.ftp_proxy 
        } 
     self.url = url 
     def makearr(tsteps): 
      global stemps 
      global steps 
      stemps = {} 
      for step in tsteps: 
       stemps[step] = { 'start': 0, 'end': 0 } 
      steps = tsteps 
     makearr(['init','check']) 
     def starttime(typ = ""): 
      for stemp in stemps: 
       if typ == "": 
        stemps[stemp]['start'] = time.time() 
       else: 
        stemps[stemp][typ] = time.time() 
     starttime() 
    def __str__(self): 
     return str(self.url) 
    def getrequests(self): 
     g=requests.get(self.url,proxies=self.proxyDict) 
     print g.status_code 
     print g.content 
     print self.url 
     stemps['init']['end'] = time.time() 
     #print stemps['init']['end'] - stemps['init']['start'] 
     x= stemps['init']['end'] - stemps['init']['start'] 
     print x 


test=BaseCheck(url='http://google.com') 
test.getrequests() 
13

proxy documentation here. Eğer bir proxy kullanmanız gerekiyorsa

, herhangi istek yöntemine vekiller argümanı ile bireysel istekleri yapılandırabilirsiniz:

:

import requests 

proxies = { 
    "http": "10.10.1.10:3128", 
    "https": "10.10.1.10:1080", 
} 

requests.get("http://example.org", proxies=proxies) 

kullanmak için HTTP Basic Auth proxy'nizle, http://user:[email protected]/ sözdizimini kullanın

proxies = { 
    "http": "http://user:[email protected]:3128/" 
} 
20

urllib'in, sistemin proxy ayarlarını alması için gerçekten iyi bir koda sahip olduğunu ve doğrudan kullanmak için doğru formda olduklarını buldum.Bunu aşağıdaki gibi kullanabilirsiniz:

import urllib 

... 
r = requests.get('http://example.org', proxies=urllib.getproxies()) 

Gerçekten iyi çalışıyor ve urllib, Mac OS X ve Windows ayarlarını da almayı biliyor. Buna

AssertionError: Not supported proxy scheme None 

Fix http belirtmek için oldu:

+0

bizim bazı kullanıcılar hiçbir vekil vardır ve bazılarına sahiptir proxy olmadan çalışmak – jonasl

+0

@jonasl Evet mu sist olmadığında bile işe yarıyor em proxy tanımlandı. Bu durumda, sadece boş bir 'dict'. –

+0

no_proxy içerir ve no_proxy'ye saygı duyar mı? Nevermind, çözümleri var gibi görünüyor: https://github.com/kennethreitz/requests/issues/879 – jrwren

15

kabul yanıt benim için iyi bir başlangıç ​​oldu, ama aşağıdaki hatayı alıyorum tuttu // böylece vekil url:

http_proxy = "http://194.62.145.248:8080" 
https_proxy = "https://194.62.145.248:8080" 
ftp_proxy = "10.10.1.10:3128" 

proxyDict = { 
       "http" : http_proxy, 
       "https" : https_proxy, 
       "ftp" : ftp_proxy 
      } 

Bazı insanlar için orijinal çalışmaların neden bana ilgi duyduğunu merak ediyorum.

Düzenleme: Ben ana cevabı şimdi bu güzel görünüyorsun verme

+0

Ben de aynı problemi yaşadım ve cevabınız düzeltildi. Garip görünüyor. – stackunderflow

+3

, 2.0.0 ile değiştirildi: Proxy URL'lerinin artık açık bir şeması olması gerekiyor. Onlar yoksa bir MissingSchema istisnası yükseltilecektir. – Jannis

İlgili konular