Python 'Requests' modüllü vekiller


159

Python için mükemmel İstekler modülü hakkında kısa, basit bir tane .

Belgelerde değişken 'vekillerin' neleri içermesi gerektiğini bulamıyorum. Standart bir "IP: PORT" değeri ile bir diksiyon gönderdiğimde, 2 değer istemeyi reddetti. Yani, sanırım (çünkü bu dokümanlar kapsamında görünmüyor) ilk değer ip ve ikincisi port mu?

Dokümanlar sadece bundan bahsediyor:

proxy'ler - (isteğe bağlı) Proxy URL'si ile sözlük eşleme protokolü.

Bu yüzden denedim ... ne yapmalıyım?

proxy = { ip: port}

ve bunları dikteye koymadan önce bir türe dönüştürmeli miyim?

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

Yanıtlar:


281

proxies'Dict sözdizimi {"protocol":"ip:port", ...}. Bununla , http , https ve ftp protokollerini kullanan istekler için farklı (veya aynı) proxy'ler belirtebilirsiniz :

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)

requestsBelgelerden düşülmüştür :

Parametreler:
method - yeni Request nesnesi yöntemi.
url- Yeni İstek nesnesi için URL.
...
proxies- (opsiyonel) Sözlük haritalama protokolü için proxy URL'ye .
...


Linux bünyesinde ayrıca aracılığıyla bunu yapabilirsiniz HTTP_PROXY, HTTPS_PROXYve FTP_PROXYortam değişkenleri:

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

Windows'ta:

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

Teşekkürler, Jay bunu işaret ettiği için:
Sözdizimi 2.0.0 istekleriyle değişti .
URL'ye bir şema eklemeniz gerekir: https://2.python-requests.org/en/latest/user/advanced/#proxies


@cigar biliyordum çünkü urllib2, vekil dict için tam olarak aynı formatı kullanıyor ve docs.python-requests.org/tr/latest/api/#module-requests "vekiller - (isteğe bağlı) Sözlük eşleme protokolünü Proxy URL'si. ", Hemen biliyordum.
chown

1
Ahhh görüyorum, urllib2 ile vekilleri hiç kullanmadım, çünkü buradan elde edilenlerden kurtulma tavsiyesi nedeniyle, kodun 2 sayfasını 8 satırla değiştirdi: / re: omuz :))) harika kal burada, zaten beni saatlerce kurtardın Toplam! müzikle ilgili herhangi bir yardıma ihtiyacınız varsa, bana bir not ver, bana tavsiyede bulunabilirsiniz, aksi takdirde büyük teşekkürler veya çay bardaklarından geri ödeme yapmanın yolunu düşünemiyorum!

Görünüşe göre istek ve urllib3 proxy kullanırken bir CONNECT
yapamıyor

@dzen Henüz kullanmadım, urllib3bu yüzden ona bakmam gerekecek. Söylediğin için teşekkürler.
11'te chown

3
@ sözdizimi 2.0.0 istekleriyle değiştirildi. URL'ye bir şema eklemeniz gerekecek: docs.python-requests.org/en/latest/user/advanced/#proxies Cevabınızı buraya ekleyebilmeniz iyi olur
Jay

28

Urllib'in sistemin proxy ayarlarını almak için gerçekten iyi bir kodu olduğunu ve doğrudan kullanmak için doğru formda olduklarını gördüm. Bunu aşağıdaki gibi kullanabilirsiniz:

import urllib

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

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


Proxy olmadan çalışıyor mu? Bazı kullanıcılarımızda vekil sunucu, bazılarında ise vekil sunucu yok.
jonasl

1
No_proxy içeriyor mu ve istekler no_proxy'ye uygun mu? Boşver
jrwren

4
hata alıyorum:module 'urllib' has no attribute 'getproxies'
Zahra

4
Yeşilimsi: urllib.request.getproxies ()
oliche

1
@Zahra try urllib2.getproxies ()
rleelr

25

Proxy belgelerine buradan başvurabilirsiniz .

Proxy kullanmanız gerekiyorsa, herhangi bir istek yönteminin proxy bağımsız değişkeni ile tek tek istekleri yapılandırabilirsiniz:

import requests

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

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

HTTP Temel Kimlik Doğrulamasını proxy'nizle kullanmak için http: // user: password@host.com/ sözdizimini kullanın:

proxies = {
    "http": "http://user:pass@10.10.1.10:3128/"
}

17

Kabul edilen cevap benim için iyi bir başlangıçtı, ancak aşağıdaki hatayı almaya devam ettim:

AssertionError: Not supported proxy scheme None

Buna düzeltme, proxy URL'sinde http: // belirtmekti:

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
            }

Orijinalin neden bazı insanlar için işe yaradığını merak ediyorum ama ben değil.

Düzenleme: Ana cevabı şimdi bunu yansıtacak şekilde güncellendiğini görüyorum :)


4
2.0.0 ile değiştirildi: Proxy URL'lerinin artık açık bir şeması olmalıdır. Yapmazlarsa bir MissingSchema istisnası ortaya çıkar.
Jay

4

Çerezlere ve oturum verilerine devam etmek istiyorsanız, bunu en iyi şu şekilde yapabilirsiniz:

import requests

proxies = {
    'http': 'http://user:pass@10.10.1.0:3128',
    'https': 'https://user:pass@10.10.1.0:3128',
}

# Create the session and set the proxies.
s = requests.Session()
s.proxies = proxies

# Make the HTTP request through the session.
r = s.get('http://www.showmemyip.com/')

2

8 yıl geç kaldı. Ama seviyorum:

import os
import requests

os.environ['HTTP_PROXY'] = os.environ['http_proxy'] = 'http://http-connect-proxy:3128/'
os.environ['HTTPS_PROXY'] = os.environ['https_proxy'] = 'http://http-connect-proxy:3128/'
os.environ['NO_PROXY'] = os.environ['no_proxy'] = '127.0.0.1,localhost,.local'

r = requests.get('https://example.com')  # , verify=False

1

İşte bazı proxy yapılandırmalar ve kronometre ile istek modülü için python benim temel sınıf!

import requests
import time
class BaseCheck():
    def __init__(self, url):
        self.http_proxy  = "http://user:pw@proxy:8080"
        self.https_proxy = "http://user:pw@proxy:8080"
        self.ftp_proxy   = "http://user:pw@proxy: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()

1

Ben sadece bir proxy graber yaptı ve ayrıca burada herhangi bir girdi olmadan aynı grabed proxy ile bağlayabilirsiniz:

#Import Modules

from termcolor import colored
from selenium import webdriver
import requests
import os
import sys
import time

#Proxy Grab

options = webdriver.ChromeOptions()
options.add_argument('headless')
driver = webdriver.Chrome(chrome_options=options)
driver.get("https://www.sslproxies.org/")
tbody = driver.find_element_by_tag_name("tbody")
cell = tbody.find_elements_by_tag_name("tr")
for column in cell:

        column = column.text.split(" ")
        print(colored(column[0]+":"+column[1],'yellow'))
driver.quit()
print("")

os.system('clear')
os.system('cls')

#Proxy Connection

print(colored('Getting Proxies from graber...','green'))
time.sleep(2)
os.system('clear')
os.system('cls')
proxy = {"http": "http://"+ column[0]+":"+column[1]}
url = 'https://mobile.facebook.com/login'
r = requests.get(url,  proxies=proxy)
print("")
print(colored('Connecting using proxy' ,'green'))
print("")
sts = r.status_code

0

Biraz geç oldu ama burada kazıma proxy'lerini basitleştiren ve daha sonra bir http POST veya GET yapma:

ProxyRequests

https://github.com/rootVIII/proxy_requests

0

"Https://free-proxy-list.net" sitesinden proxy'leri nasıl alacağımı ve "Elite Proxy Switcher" (biçim IP: PORT) gibi araçlarla uyumlu bir dosyaya veri depolayabileceğim bazı kodları paylaşıyorum:

## PROXY_UPDATER - https://free-proxy-list.net/ adresinden ücretsiz proxy'ler alın

from lxml.html import fromstring
import requests
from itertools import cycle
import traceback
import re

######################FIND PROXIES#########################################
def get_proxies():
    url = 'https://free-proxy-list.net/'
    response = requests.get(url)
    parser = fromstring(response.text)
    proxies = set()
    for i in parser.xpath('//tbody/tr')[:299]:   #299 proxies max
        proxy = ":".join([i.xpath('.//td[1]/text()') 
        [0],i.xpath('.//td[2]/text()')[0]])
        proxies.add(proxy)
    return proxies



######################write to file in format   IP:PORT######################
try:
    proxies = get_proxies()
    f=open('proxy_list.txt','w')
    for proxy in proxies:
        f.write(proxy+'\n')
    f.close()
    print ("DONE")
except:
    print ("MAJOR ERROR")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.