Proxy với mô-đun 'Yêu cầu' của Python


159

Chỉ cần một đoạn ngắn, đơn giản về mô-đun Yêu cầu tuyệt vời cho Python.

Tôi dường như không thể tìm thấy trong tài liệu những gì các biến 'proxy' nên chứa. Khi tôi gửi cho nó một lệnh với giá trị "IP: PORT" tiêu chuẩn, nó đã từ chối nó yêu cầu 2 giá trị. Vì vậy, tôi đoán (bởi vì điều này dường như không được đề cập trong các tài liệu) rằng giá trị đầu tiên là ip và cổng thứ hai?

Các tài liệu chỉ đề cập đến điều này:

proxy - (tùy chọn) Giao thức ánh xạ từ điển tới URL của proxy.

Vì vậy, tôi đã thử điều này ... tôi nên làm gì?

proxy = { ip: port}

và tôi có nên chuyển đổi chúng thành một số loại trước khi đưa chúng vào lệnh không?

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

Câu trả lời:


279

Các proxies'cú pháp dict là {"protocol":"ip:port", ...}. Với nó, bạn có thể chỉ định (hoặc) cùng một proxie (s) cho các yêu cầu sử dụng giao thức http , httpsftp :

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)

Trích từ requeststài liệu :

Tham số:
method - phương thức cho đối tượng Yêu cầu mới.
url- URL cho đối tượng Yêu cầu mới.
...
proxies- (tùy chọn) Giao thức ánh xạ từ điển tới URL của proxy . ...


Trên Linux, bạn cũng có thể làm được điều này thông qua HTTP_PROXY, HTTPS_PROXYFTP_PROXYcác biến môi trường:

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

Trên 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

Cảm ơn, Jay đã chỉ ra điều này:
Cú pháp đã thay đổi với các yêu cầu 2.0.0 .
Bạn sẽ cần thêm một lược đồ vào url: https://2.python-requests.org/en/latest/user/advified/#proxies


@cigar Tôi biết vì urllib2 sử dụng cùng một định dạng chính xác cho lệnh ủy nhiệm của họ và khi tôi thấy docs.python-requests.org/en/latest/api/#module-requests nói "proxy - (tùy chọn) giao thức ánh xạ từ điển cho" URL của proxy. ", Tôi biết ngay lập tức.
chown

1
ahhh tôi hiểu, không bao giờ sử dụng proxy với urllib2 vì lời khuyên để loại bỏ nó thu được từ đây, thay thế 2 trang mã bằng 8 dòng: / re: Shoulder :))) tuyệt vời ở đây, bạn đã tiết kiệm cho tôi hàng giờ toàn bộ! nếu bạn cần bất kỳ sự giúp đỡ nào với âm nhạc, tôi có thể đưa ra lời khuyên, nếu không thì không thể nghĩ ra cách nào để trả ơn ngoài lời cảm ơn hay tách trà lớn!

Dường như các yêu cầu và hơn nữa urllib3 không thể thực hiện KẾT NỐI khi sử dụng proxy :(
dzen

@dzen Tôi chưa sử dụng urllib3nên tôi sẽ xem xét điều đó. Cảm ơn cho những người đứng đầu lên.
chown

3
@chown cú pháp thay đổi với yêu cầu 2.0.0. Bạn sẽ cần thêm một lược đồ vào url: docs.python-requests.org/en/latest/user/advified/#proxies Thật tuyệt nếu bạn có thể thêm câu hỏi này vào câu trả lời của mình tại đây
Jay

28

Tôi đã thấy rằng urllib có một số mã thực sự tốt để nhận các cài đặt proxy của hệ thống và chúng tình cờ ở dạng chính xác để sử dụng trực tiếp. Bạn có thể sử dụng như thế này:

import urllib

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

Nó hoạt động rất tốt và urllib cũng biết về việc cài đặt Mac OS X và Windows.


Nó hoạt động mà không có proxy? Một số người dùng của chúng tôi không có proxy và một số thì có.
jonasl

1
Nó có bao gồm no_proxy và các yêu cầu có tôn trọng no_proxy không? Không bao giờ, có vẻ như có giải pháp: github.com/kennethreitz/requests/issues/879
jrwren

4
nhận được lỗi:module 'urllib' has no attribute 'getproxies'
Zahra

4
Màu xanh lá cây: urllib.request.getproxies ()
oliche

1
@Zahra thử urllib2.getproxies ()
rleelr

25

Bạn có thể tham khảo tài liệu proxy tại đây .

Nếu bạn cần sử dụng proxy, bạn có thể định cấu hình các yêu cầu riêng lẻ với đối số proxy cho bất kỳ phương thức yêu cầu nào:

import requests

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

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

Để sử dụng HTTP Basic Auth với proxy của bạn, hãy sử dụng cú pháp http: // user: password@host.com/ :

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

17

Câu trả lời được chấp nhận là một khởi đầu tốt cho tôi, nhưng tôi vẫn nhận được lỗi sau:

AssertionError: Not supported proxy scheme None

Khắc phục sự cố này là chỉ định http: // trong url proxy:

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
            }

Tôi sẽ quan tâm đến lý do tại sao bản gốc hoạt động cho một số người mà không phải cho tôi.

Chỉnh sửa: Tôi thấy câu trả lời chính hiện đang được cập nhật để phản ánh điều này :)


4
đã thay đổi với 2.0.0: URL proxy bây giờ phải có sơ đồ rõ ràng. Một ngoại lệ MissingSchema sẽ được nêu ra nếu họ không.
Jay

4

Nếu bạn muốn thuyết phục cookie và dữ liệu phiên, tốt nhất bạn nên làm như thế này:

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

Chậm 8 năm. Nhưng tôi thích:

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

đây là lớp cơ bản của tôi trong python cho mô-đun yêu cầu với một số cấu hình proxy và đồng hồ bấm giờ!

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

tôi vừa tạo một proxy graber và cũng có thể kết nối với proxy đã lấy mà không cần bất kỳ đầu vào nào ở đây là:

#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

Hơi muộn một chút nhưng đây là lớp trình bao bọc giúp đơn giản hóa các proxy và sau đó thực hiện http POST hoặc GET:

ProxyRequests

https://github.com/rootVIII/proxy_requests

0

Tôi chia sẻ một số mã cách tìm nạp proxy từ trang web "https://free-proxy-list.net" và lưu trữ dữ liệu vào một tệp tương thích với các công cụ như "Elite Proxy Switcher" (định dạng IP: PORT):

## PROXY_UPDATER - nhận proxy miễn phí từ 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")
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.