2011-11-27 26 views
83

Krótko mówiąc, prosty o doskonałym module Requests dla Pythona.Serwery proxy z modułem "Żądania" w języku Python

Nie mogę znaleźć w dokumentacji, co powinna zawierać zmienna "proxy". Kiedy wysyłam mu dyktando ze standardową wartością "IP: PORT", odrzucił on prośbę o 2 wartości. Tak, myślę (ponieważ to nie wydaje się być objęte w dokumentach), że pierwszą wartością jest ip, a drugi port?

Docs wspomnieć o tym tylko:

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

Więc próbowałem to ... co mam robić?

proxy = { ip: port} 

i czy powinienem je przekonwertować na jakiś typ przed umieszczeniem ich w dyktafonie?

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

Dziękuję za sprawienie, że będzie ładniej wyglądać. –

+3

i zadziwiająco szybko! gdzie byłeś przed przelewem stosu? :) –

Odpowiedz

148

Składnia proxies 'DICT jest {"protocol":"ip:port", ...}. Dzięki niemu można określić inny (lub ten sam) proxie (-ów) dla żądań korzystających http, https i ftp protokoły:

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) 

Odliczono z requests documentation:

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


W systemie Linux można to zrobić także za pomocą środowiska HTTP_PROXY, HTTPS_PROXY i FTP_PROXY riables:

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

W systemie Windows:

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

Dzięki, Jay za wskazanie na to uwagę:
Składnia zmieniło wniosków 2.0.0.
Musisz dodać do schematu URL: http://docs.python-requests.org/en/latest/user/advanced/#proxies

+9

to znowu ty !! wymawiasz diament, wielkie dzięki jeszcze raz! chcesz żyć na moim ramieniu? : D btw - skąd o tym wiesz? –

+9

@ cigar, jeśli StackOverflow jest twoim ramieniem, to już robię;) – chown

+0

@ cigar Wiedziałem, ponieważ urllib2 używa dokładnie tego samego formatu dla ich dyktujących serwerów proxy, i kiedy zobaczyłem http://docs.python-requests.org/en/ najnowsze/api/# żądania modułów mówią "proxy - (opcjonalnie) protokół mapowania słownika na adres URL proxy.", wiedziałem od razu. – chown

2

tutaj jest moje podstawowe klasy w Pythonie dla modułu wnioski z niektórych configs proxy i stopera!

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

Możesz zapoznać się z proxy documentation here.

Jeśli musisz korzystać z serwera proxy, można skonfigurować poszczególne wnioski z prokurentów argument do dowolnej metody żądania:

import requests 

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

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

Aby wykorzystać HTTP Podstawowe Auth z serwera proxy, należy użyć składni http://user:[email protected]/:

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

Zauważyłem, że urllib ma naprawdę dobry kod do pobrania ustawień proxy systemu i są one w poprawnej formie do użycia bezpośrednio.Możesz użyć tego:

import urllib 

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

Działa bardzo dobrze i urllib wie również o uzyskiwaniu ustawień Mac OS X i Windows.

+0

Czy działa bez serwera proxy? Niektórzy nasi użytkownicy nie mają proxy, a niektórzy z nich mają – jonasl

+0

@jonasl Tak działa nawet wtedy, gdy nie ma syst zdefiniowano em proxy. W takim przypadku jest to po prostu pusty "dyktando". –

+0

Czy zawiera on no_proxy i czy prośby respektują no_proxy? Nieważne, wydaje się, że istnieją rozwiązania: https://github.com/kennethreitz/requests/issues/879 – jrwren

15

Zaakceptowanych odpowiedź był dobry początek dla mnie, ale ciągle otrzymuję następujący błąd:

AssertionError: Not supported proxy scheme None 

Fix to było określić http: // w adresie URL proxy tak:

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 
      } 

Byłbym zainteresowany, dlaczego oryginał działa dla niektórych osób, ale nie dla mnie.

Edytuj: Widzę, że główna odpowiedź została teraz zaktualizowana, aby to odzwierciedlić :)

+0

Miałem ten sam problem i twoja odpowiedź to naprawiła. Wydaje się dziwne. – stackunderflow

+3

zmieniono z 2.0.0: Proxy URL musi teraz mieć jawny schemat. Wyjątek MissingSchema zostanie zgłoszony, jeśli tego nie zrobi. – Jannis