Proxy dengan modul 'Permintaan' Python

159

Hanya yang singkat, sederhana tentang modul Permintaan yang luar biasa untuk Python.

Saya tidak bisa menemukan dalam dokumentasi apa isi 'proxy' seharusnya. Ketika saya mengirimkannya sebuah dict dengan nilai "IP: PORT" standar, ia menolaknya dan meminta 2 nilai. Jadi, saya kira (karena ini sepertinya tidak tercakup dalam dokumen) bahwa nilai pertama adalah ip dan port kedua?

Dokumen hanya menyebutkan ini:

proxy - (opsional) Protokol pemetaan kamus ke URL proxy.

Jadi saya mencoba ini ... apa yang harus saya lakukan?

proxy = { ip: port}

dan haruskah saya mengonversikannya ke beberapa jenis sebelum meletakkannya di dikt?

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

Jawaban:

281

The proxies'sintaks dict adalah {"protocol":"ip:port", ...}. Dengannya, Anda dapat menentukan proksi yang berbeda (atau sama) untuk permintaan menggunakan protokol http , https , dan ftp :

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)

Disimpulkan dari requestsdokumentasi :

Parameter:
method - metode untuk objek Permintaan baru.
url- URL untuk objek Permintaan baru.
...
proxies- (opsional) Protokol pemetaan kamus ke URL proksi . ...


Pada linux Anda juga dapat melakukan ini melalui HTTP_PROXY, HTTPS_PROXYdan FTP_PROXYlingkungan variabel:

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

Di 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

Terima kasih, Jay untuk menunjukkan ini:
Sintaks berubah dengan permintaan 2.0.0 .
Anda harus menambahkan skema ke url: https://2.python-requests.org/en/latest/user/advanced/#proxies

dikunyah
sumber
@cigar Saya tahu karena urllib2 menggunakan format yang sama persis untuk dict proxy mereka, dan ketika saya melihat docs.python-requests.org/en/latest/api/#module-requests mengatakan "proxy - (opsional) protokol pemetaan kamus ke URL proksi. ", Saya langsung tahu.
chown
1
ahhh saya mengerti, tidak pernah menggunakan proksi dengan urllib2 karena saran untuk menghilangkannya diperoleh dari sini, diganti 2 halaman kode dengan 8 baris: / re: shoulder :))) senang tinggal di sini, Anda sudah menyelamatkan saya berjam-jam di total! Jika Anda membutuhkan bantuan dengan musik, beri saya teriakan, bahwa saya dapat memberikan saran, jika tidak, tidak bisa memikirkan cara untuk membayar selain terima kasih besar atau secangkir teh!
Tampaknya permintaan dan urllib3 apalagi tidak dapat melakukan CONNECT saat menggunakan proxy :(
dzen
@dzen saya belum digunakan urllib3jadi saya harus melihat ke dalamnya . Terimakasih atas peringatannya.
chown
3
@chown sintaks berubah dengan permintaan 2.0.0. Anda harus menambahkan skema ke url: docs.python-requests.org/en/latest/user/advanced/#proxies Alangkah baiknya jika Anda dapat menambahkan ini ke jawaban Anda di sini
Jay
28

Saya telah menemukan bahwa urllib memiliki beberapa kode yang sangat bagus untuk mengambil pengaturan proxy sistem dan mereka berada dalam bentuk yang benar untuk digunakan secara langsung. Anda bisa menggunakan ini seperti:

import urllib

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

Ini berfungsi dengan sangat baik dan urllib tahu tentang mendapatkan pengaturan Mac OS X dan Windows juga.

Ben Golding
sumber
Apakah itu berfungsi tanpa proxy? Beberapa pengguna kami tidak memiliki proxy dan beberapa memiliki.
jonasl
1
Apakah ini termasuk no_proxy dan apakah permintaan menghargai no_proxy? Nevermind, sepertinya ada solusi: github.com/kennethreitz/requests/issues/879
jrwren
4
semakin keliru:module 'urllib' has no attribute 'getproxies'
Zahra
4
Kehijauan: urllib.request.getproxies ()
oliche
1
@Zahra coba urllib2.getproxies ()
rleelr
25

Anda dapat merujuk ke dokumentasi proxy di sini .

Jika Anda perlu menggunakan proxy, Anda dapat mengonfigurasi permintaan individu dengan argumen proxy ke metode permintaan apa pun:

import requests

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

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

Untuk menggunakan HTTP Basic Auth dengan proxy Anda, gunakan http: // pengguna: [email protected]/ sintaks:

proxies = {
    "http": "http://user:[email protected]:3128/"
}
Zhifeng Hu
sumber
17

Jawaban yang diterima adalah awal yang baik bagi saya, tetapi saya terus mendapatkan kesalahan berikut:

AssertionError: Not supported proxy scheme None

Cara mengatasinya adalah dengan menentukan http: // di url proxy sebagai berikut:

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
            }

Saya tertarik mengapa karya asli untuk beberapa orang tetapi tidak untuk saya.

Sunting: Saya melihat jawaban utama sekarang diperbarui untuk mencerminkan ini :)

Owen B
sumber
4
diubah dengan 2.0.0: URL proxy sekarang harus memiliki skema eksplisit. Pengecualian MissingSchema akan dimunculkan jika tidak.
Jay
4

Jika Anda ingin tetap menggunakan cookie dan data sesi, sebaiknya lakukan seperti ini:

import requests

proxies = {
    'http': 'http://user:[email protected]:3128',
    'https': 'https://user:[email protected]: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/')
Pengguna
sumber
2

8 tahun terlambat. Tapi saya suka:

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
qräbnö
sumber
1

di sini adalah kelas dasar saya di python untuk modul permintaan dengan beberapa konfigurasi proxy dan stopwatch!

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()
mtt2p
sumber
1

saya baru saja membuat proxy graber dan juga dapat terhubung dengan proxy yang sama tanpa input apa pun di sini adalah:

#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
Rae mh
sumber
0

Ini agak terlambat tetapi di sini ada kelas pembungkus yang menyederhanakan proksi pengikisan dan kemudian membuat http POST atau GET:

Pertanyaan Proxy

https://github.com/rootVIII/proxy_requests

sumber
0

Saya membagikan beberapa kode cara mengambil proksi dari situs "https://free-proxy-list.net" dan menyimpan data ke file yang kompatibel dengan alat-alat seperti "Elite Proxy Switcher" (format IP: PORT):

## PROXY_UPDATER - dapatkan proxy gratis dari https://free-proxy-list.net/

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")
Lambov
sumber