Socks5Proxy

Pengaturan proxy Python requests, menghubungkan proxy SOCKS5 dan HTTP

Panduan ini menjelaskan langkah demi langkah cara menghubungkan HTTP proxy dan SOCKS5 proxy Socks5Proxy ke library Python requests, autentikasi username dan password, serta kode rotasi daftar dan percobaan ulang.

Apa yang perlu dipersiapkan?

Anda membutuhkan Python 3.8 atau lebih tinggi dan library requests. Untuk menggunakan SOCKS5, Anda juga perlu menginstal paket dukungan SOCKS. Menginstal requests[socks] akan sekaligus menginstal PySocks sehingga Anda bisa menggunakan alamat socks5 dan socks5h.

Informasi proxy dapat dilihat di halaman 'Proxy Saya' di dashboard. Contoh ini menggunakan IP 198.51.100.23, port HTTP 8000, port SOCKS5 1080, username spx_user, password spx_pass. Ganti dengan nilai aktual Anda.

pip install "requests[socks]"

Bagaimana cara menghubungkan HTTP proxy?

requests mengirim permintaan melalui proxy yang ditentukan dalam kamus proxies. Penting untuk menambahkan alamat proxy HTTP yang sama ke kunci http dan https. Tanpa kunci https, permintaan ke alamat HTTPS akan langsung keluar tanpa melalui proxy.

Permintaan ke situs HTTPS melewati proxy via metode CONNECT dengan konten tetap terenkripsi. Kode berikut memverifikasi IP proxy dengan meminta alamat pengecekan IP.

import requests

proxy = "http://spx_user:spx_pass@198.51.100.23:8000"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.status_code, r.json())  # the "ip" field should show the proxy IP

Bagaimana cara menghubungkan proxy SOCKS5?

Disarankan menggunakan socks5h di awal alamat. socks5h melakukan resolusi nama domain oleh proxy sehingga permintaan DNS server Anda tidak terlihat dan nama diresolusi berdasarkan negara proxy. Jika menggunakan socks5, resolusi nama dilakukan oleh server Anda sebelum mengirim IP ke proxy.

Anda harus menggunakan port SOCKS5. Jika alamat SOCKS5 dimasukkan ke port HTTP, koneksi tidak akan berhasil, jadi bedakan dua port di setiap baris.

import requests

proxy = "socks5h://spx_user:spx_pass@198.51.100.23:1080"
proxies = {"http": proxy, "https": proxy}

r = requests.get("https://api.ipify.org?format=json", proxies=proxies, timeout=20)
print(r.json())

Bagaimana cara memutar beberapa proxy untuk mengirim permintaan?

Saat mengumpulkan banyak halaman, metode default adalah mengambil daftar dan menggunakan proxy berikutnya untuk setiap permintaan. Kode di bawah ini mengambil daftar SOCKS5 melalui API dan menggunakannya secara bergiliran, dengan maksimal 3 kali percobaan ulang untuk permintaan yang gagal menggunakan proxy berbeda. Juga disertakan jeda singkat untuk menghindari permintaan terlalu cepat ke domain yang sama.

Lebih baik mengistirahatkan proxy yang gagal sebentar sebelum menggunakannya kembali daripada langsung membuangnya. Kesalahan sementara sering disebabkan oleh status situs target.

import itertools
import time
import requests

API = "https://socks5proxy.io/api/v1"
KEY = "YOUR_API_KEY"

lines = requests.get(
    API + "/proxies/download",
    params={"format": "user:pass@ip:port", "protocol": "socks5"},
    headers={"Authorization": "Bearer " + KEY},
    timeout=30,
).text.split()
pool = itertools.cycle(lines)

def fetch(url, tries=3):
    for _ in range(tries):
        p = "socks5h://" + next(pool)
        try:
            r = requests.get(url, proxies={"http": p, "https": p}, timeout=20)
            if r.status_code == 200:
                return r.text
        except requests.RequestException:
            pass
        time.sleep(1)
    return None

for page in range(1, 6):
    html = fetch("https://example.com/list?page=" + str(page))
    print(page, "ok" if html else "failed")
    time.sleep(0.5)

Bagaimana cara mempertahankan sesi dan cookie?

Untuk alur yang memerlukan kelanjutan cookie seperti login atau navigasi halaman, gunakan satu proxy per requests.Session. Masukkan alamat ke atribut proxies objek sesi, dan semua permintaan dari sesi tersebut akan keluar melalui IP yang sama. Setelah alur selesai, tutup sesi dan buat sesi baru dengan proxy berikutnya.

Dengan menetapkan header User-Agent dan Accept-Language per sesi, tampilan di situs target akan konsisten.

import requests

s = requests.Session()
s.proxies = {
    "http": "http://spx_user:spx_pass@198.51.100.23:8000",
    "https": "http://spx_user:spx_pass@198.51.100.23:8000",
}
s.headers.update({"User-Agent": "Mozilla/5.0", "Accept-Language": "en-US,en;q=0.9"})

s.get("https://example.com/", timeout=20)          # cookies are stored in the session
r = s.get("https://example.com/account", timeout=20)  # same IP, same cookies
print(r.status_code)
s.close()

Bagaimana cara menggunakan IP authorization?

Jika Anda mendaftarkan IPv4 server yang menjalankan kode ini di dashboard, Anda dapat menggunakan alamat tanpa username dan password. Tidak perlu menyimpan password di kode atau file konfigurasi, sehingga lebih mudah untuk melakukan deployment ke beberapa server. Anda juga bisa memilih format=ip:port saat mendapatkan daftar.

import requests

proxy = "http://198.51.100.23:8000"  # no user or password, server IP is authorized in the dashboard
r = requests.get("https://api.ipify.org", proxies={"http": proxy, "https": proxy}, timeout=20)
print(r.text)

Bagaimana cara mengirim beberapa permintaan secara bersamaan dengan cepat?

requests menunggu hingga satu permintaan selesai sebelum melanjutkan, jadi untuk mengambil banyak halaman dengan cepat, Anda perlu menjalankan beberapa tugas secara bersamaan. Cara termudah adalah dengan ThreadPoolExecutor dari concurrent.futures. Jaga jumlah tugas lebih sedikit dari jumlah proxy agar permintaan tidak menumpuk di satu IP.

Kode di bawah membagi daftar alamat ke 20 worker, dan setiap worker memilih proxy berikutnya dari daftar untuk digunakan. itertools.cycle aman digunakan bersama oleh beberapa thread untuk mengambil nilai berikutnya, tetapi jika urutan yang tepat diperlukan, gunakan kunci bersama.

import itertools
from concurrent.futures import ThreadPoolExecutor
import requests

lines = open("proxies.txt").read().split()  # user:pass@ip:port per line
pool = itertools.cycle(lines)

def get(url):
    p = "http://" + next(pool)
    try:
        return url, requests.get(url, proxies={"http": p, "https": p}, timeout=20).status_code
    except requests.RequestException as e:
        return url, type(e).__name__

urls = ["https://example.com/item/" + str(i) for i in range(200)]
with ThreadPoolExecutor(max_workers=20) as ex:
    for url, result in ex.map(get, urls):
        print(url, result)

Apakah saya bisa menggunakan library async seperti httpx atau aiohttp?

Ya. httpx menerima parameter proxy saat membuat klien, dan httpx[socks] diperlukan untuk SOCKS5. AsyncClient juga mendukung parameter sama.

aiohttp memerlukan alamat HTTP proxy di parameter proxy untuk setiap permintaan, dan proxy_auth dengan aiohttp.BasicAuth. aiohttp tidak mendukung SOCKS secara default, jadi jika SOCKS5 diperlukan, gunakan konektor dari paket aiohttp-socks.

Metode asinkron dapat memproses ribuan permintaan dengan sumber daya yang terbatas secara bersamaan, tetapi jika jumlah permintaan bersamaan tidak dibatasi, situs target dan proxy akan dibanjiri sekaligus. Gunakan asyncio.Semaphore untuk membatasi jumlah permintaan yang berjalan bersamaan.

import httpx

with httpx.Client(proxy="http://spx_user:spx_pass@198.51.100.23:8000", timeout=20) as client:
    print(client.get("https://api.ipify.org").text)

Bagaimana cara menyelesaikan kesalahan yang sering terjadi?

Error 'Missing dependencies for SOCKS support' berarti requests[socks] belum terinstal. Silakan instal ulang di lingkungan virtual yang sama.

407 Proxy Authentication Required muncul jika username atau password salah, atau saat menggunakan IP authorization tetapi IP server belum terdaftar. Jika password mengandung karakter khusus, gunakan urllib.parse.quote untuk mengubahnya.

Timeout koneksi paling sering terjadi karena port yang tidak sesuai. Pastikan Anda menggunakan port HTTP untuk alamat HTTP dan port SOCKS5 untuk alamat socks5h. Menambahkan nilai timeout dapat mencegah permintaan yang tidak merespons menghentikan seluruh pekerjaan.

  • SOCKS error: pip install "requests[socks]"
  • 407: Periksa username/password atau IP yang terdaftar
  • Waktu habis: Bedakan antara port HTTP dan SOCKS5
  • Tambahkan timeout ke semua permintaan
Pengaturan proxy Python requests, menghubungkan SOCKS5·HTTP | Socks5Proxy