พร็อกซี่พร้อมโมดูล Python 'Request'


159

สั้น ๆ ง่ายๆเกี่ยวกับโมดูลคำขอยอดเยี่ยมสำหรับ Python

ฉันดูเหมือนจะไม่พบในเอกสารประกอบสิ่งที่ตัวแปร 'พร็อกซี' ควรมี เมื่อฉันส่ง dict ด้วยค่า "IP: PORT" มาตรฐานก็จะปฏิเสธมันเพื่อขอ 2 ค่า ดังนั้นฉันเดา (เพราะดูเหมือนจะไม่ครอบคลุมในเอกสาร) ว่าค่าแรกคือ ip และพอร์ตที่สอง?

เอกสารพูดถึงสิ่งนี้เท่านั้น:

พร็อกซี่ - (เป็นทางเลือก) โปรโตคอลการแมปพจนานุกรมเป็น URL ของพรอกซี

ดังนั้นฉันจึงลองทำเช่นนี้ ... ฉันควรทำยังไงดี?

proxy = { ip: port}

และฉันควรแปลงเหล่านี้เป็นประเภทก่อนที่จะวางลงใน dict?

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

คำตอบ:


281

proxies'ไวยากรณ์ Dict {"protocol":"ip:port", ...}คือ ด้วยคุณสามารถระบุ proxie (หรือเดียวกัน) ที่แตกต่างกันสำหรับคำขอโดยใช้โปรโตคอลhttp , httpsและ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)

หักจากrequestsเอกสาร :

พารามิเตอร์:
method - วิธีการสำหรับวัตถุคำขอใหม่
url- URL สำหรับวัตถุคำขอใหม่
...
proxies- (อุปกรณ์เสริม) พจนานุกรมการทำแผนที่ โปรโตคอลกับURL ของพร็อกซี่
...


บน Linux คุณยังสามารถทำเช่นนี้ผ่านทางHTTP_PROXY, HTTPS_PROXYและFTP_PROXYตัวแปรสภาพแวดล้อม:

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:

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

ขอขอบคุณสำหรับการชี้เจย์นี้ออก:
ไวยากรณ์การเปลี่ยนแปลงกับการร้องขอ 2.0.0
คุณจะต้องเพิ่มสคีมาลงใน url: https://2.python-requests.org/en/latest/user/advanced/#proxies


@ ซิการ์ฉันรู้ว่าเพราะ urllib2 ใช้รูปแบบเดียวกันแน่นอนสำหรับพร็อกซีพร็อกซี่ของพวกเขาและเมื่อฉันเห็นdocs.python-requests.org/en/latest/api/#module-requestsพูดว่า "พร็อกซี - (ไม่จำเป็น) โปรโตคอลการทำแผนที่พจนานุกรมไปยัง URL ของพรอกซี "ฉันรู้ทันที
chown

1
อ่าฉันเห็นไม่เคยใช้พร็อกซี่กับ urllib2 เพราะคำแนะนำในการกำจัดมันที่ได้รับจากที่นี่แทนที่โค้ด 2 หน้าด้วย 8 บรรทัด: / re: ไหล่ :))) การพักที่นี่คุณช่วยฉันได้หลายชั่วโมงแล้ว รวม! หากคุณต้องการความช่วยเหลือเกี่ยวกับเพลงขอให้ตะโกนว่าฉันสามารถให้คำแนะนำหรืออย่างอื่นไม่สามารถคิดวิธีการชำระคืนอื่น ๆ กว่าขอบคุณมากหรือถ้วยชา!

ดูเหมือนคำขอและ urllib3 ยิ่งกว่านั้นไม่สามารถทำการเชื่อมต่อเมื่อใช้พร็อกซี :(
dzen

@dzen ฉันยังไม่ได้ใช้urllib3ดังนั้นฉันจะต้องดูให้ดี ขอบคุณสำหรับหัวขึ้น.
chown

3
@ แสดงว่าไวยากรณ์เปลี่ยนแปลงไปตามคำขอ 2.0.0 คุณจะต้องเพิ่มสคีมาลงใน url: docs.python-requests.org/en/latest/user/advanced/#proxiesมันจะดีถ้าคุณสามารถเพิ่มสิ่งนี้ในคำตอบของคุณได้ที่นี่
Jay

28

ฉันพบว่า urllib มีรหัสที่ดีจริงๆในการรับการตั้งค่าพร็อกซีของระบบและพวกเขาจะอยู่ในรูปแบบที่ถูกต้องเพื่อใช้โดยตรง คุณสามารถใช้สิ่งนี้เช่น:

import urllib

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

มันทำงานได้ดีจริงๆและ urllib ก็รู้เกี่ยวกับการตั้งค่า Mac OS X และ Windows เช่นกัน


มันทำงานโดยไม่ต้องใช้ proxy หรือไม่? ผู้ใช้ของเราบางคนไม่มีพร็อกซีและบางคนมี
jonasl

1
มันรวม no_proxy และการร้องขอเคารพ no_proxy หรือไม่? ไม่เป็นไรดูเหมือนว่าจะมีวิธีแก้ปัญหา: github.com/kennethreitz/requests/issues/879
jrwren

4
รับไปผิด:module 'urllib' has no attribute 'getproxies'
Zahra

4
สีเขียว: urllib.request.getproxies ()
oliche

1
@Zahra ลอง urllib2.getproxies ()
rleelr

25

คุณสามารถอ้างถึงเอกสารพร็อกซี่ที่นี่

หากคุณต้องการใช้พร็อกซีคุณสามารถกำหนดค่าคำขอแต่ละรายการด้วยอาร์กิวเมนต์พร็อกซีกับวิธีการร้องขอใด ๆ :

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 Basic Auth กับพร็อกซีของคุณให้ใช้http: // user: password@host.com/ไวยากรณ์:

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

17

คำตอบที่ยอมรับได้เป็นจุดเริ่มต้นที่ดีสำหรับฉัน แต่ฉันได้รับข้อผิดพลาดต่อไปนี้:

AssertionError: Not supported proxy scheme None

แก้ไขสิ่งนี้คือการระบุ http: // ใน 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
            }

ฉันสนใจว่าทำไมต้นฉบับถึงใช้ได้กับบางคน แต่ไม่ใช่ฉัน

แก้ไข: ฉันเห็นคำตอบหลักตอนนี้ปรับปรุงเพื่อสะท้อน :)


4
เปลี่ยนแปลงด้วย 2.0.0: ตอนนี้ URL พร็อกซีต้องมีรูปแบบที่ชัดเจน จะมีการยกข้อยกเว้น MissingSchema ขึ้นหากไม่มี
Jay

4

หากคุณต้องการยืนยันคุกกี้และข้อมูลเซสชันคุณควรทำเช่นนี้:

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 ปี แต่ฉันชอบ:

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

นี่คือคลาสพื้นฐานของฉันในไพ ธ อนสำหรับโมดูลคำร้องขอที่มีพร็อกซี configs และตัวจับเวลาบางตัว!

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

ฉันเพิ่งทำ proxy graber และยังสามารถเชื่อมต่อกับ proxy grabed เดียวกันโดยไม่ต้องป้อนข้อมูลใด ๆ ที่นี่:

#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

มันสายไปหน่อย แต่นี่คือคลาส wrapper ที่ลดความยุ่งยากของพร็อกซีจากนั้นสร้าง http POST หรือ GET:

ProxyRequests

https://github.com/rootVIII/proxy_requests

0

ฉันแบ่งปันรหัสวิธีดึงผู้รับมอบฉันทะจากไซต์ "https://free-proxy-list.net" และจัดเก็บข้อมูลเป็นไฟล์ที่เข้ากันได้กับเครื่องมือเช่น "Elite Proxy Switcher" (รูปแบบ IP: PORT):

## PROXY_UPDATER - รับพร็อกซี่ฟรีจาก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")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.