ProxynetProxynet

چرخاندن پروکسی در Python: راهنما همراه با کد

تاریخ انتشار:

3 دقیقه مطالعه

Acar Diveroli
نویسنده: Acar Diveroli
چرخاندن پروکسی در Python

کسی که از Python درخواست‌های زیادی می‌فرستد با یک آدرس تنها راه به جایی نمی‌برد. در این نوشته می‌بینید که چطور فهرستی از پروکسی‌ها را داخل کد جابه‌جا کنید.

پروکسی آدرس شما را پنهان می‌کند، اما اگر همه درخواست‌ها را پشت سر هم از یک IP بفرستد، سقف درخواست سایت مقصد فعال می‌شود. مسئله اصلی همین است: آدرس شناسایی نمی‌شود، الگو شناسایی می‌شود. اگر به‌جای پروکسی چرخشی فهرست آدرس‌های ثابت خودتان را دارید، جابه‌جایی را کد شما انجام می‌دهد.

چرخش IP یعنی چه؟

چرخش IP یعنی آدرس درخواست‌های خروجی را پیوسته عوض کنید: پس از هر درخواست، در بازه‌های معین یا هر وقت خودتان بخواهید. به‌جای فرستادن همه چیز از یک IP، بار را میان چند آدرس پخش می‌کنید.

در پروکسی مسکونی این کار از پیش در خود سرویس انجام می‌شود. کسی که فهرست خودش را دارد و نمی‌خواهد بر پایه حجم حساب کند، چرخش را خودش می‌سازد؛ موضوع این نوشته همین است.

گام 1: پیش‌نیازها

  • ⁦Python 3⁩
  • محیط توسعه دلخواه شما
  • کتابخانه Requests به عنوان کلاینت HTTP:
bash
pip3 install requests

گام 2: تهیه پروکسی

به فهرستی از آدرس‌ها نیاز دارید. در پنل Proxynet موقعیت مناسب سایت مقصد را انتخاب می‌کنید و میان پروکسی IPv4 و پروکسی IPv6 تصمیم می‌گیرید.

گام 3: یک درخواست بدون پروکسی

برای مقایسه، نخست یک درخواست از خط خودتان:

python
# pip3 install requests
import requests

# send a request to the test endpoint
response = requests.get("https://httpbin.io/ip")

if response.status_code != 200:
    print(f"The request failed with {response.status_code}")
else:
    print(response.text)

خروجی آدرس خودتان را نشان می‌دهد. آن را یادداشت کنید؛ مبنای مقایسه در گام بعدی است.

گام 4: همان درخواست از راه پروکسی

Requests پروکسی‌ها را به شکل یک دیکشنری می‌گیرد، یک ورودی برای HTTP و یکی برای HTTPS:

python
# pip3 install requests
import requests

# specify the proxy server address
proxies = {
    "http": "http://proxy.proxynet.io:60001",
    "https": "http://proxy.proxynet.io:60001",
}

response = requests.get(
    "https://httpbin.io/ip",
    proxies=proxies,
)

if response.status_code != 200:
    print(f"The request failed with {response.status_code}")
else:
    print(response.text)

اگر خروجی حالا آدرسی جز آدرس پیشین نشان دهد، درخواست از پروکسی می‌گذرد.

گام 5: چرخاندن فهرست

پروکسی‌ها را هر کدام در یک خط، در فایلی مانند proxies_list.txt ذخیره کنید:

proxy.proxynet.io:60001
proxy.proxynet.io:60002

برای جابه‌جایی دو راه هست.

به‌ترتیب

رفتن به‌ترتیب بار را یکنواخت پخش می‌کند و وقتی فهرست کوچک است کمک می‌کند که یک آدرس همه کار را به دوش نکشد. عیبش این است که توالی منظم است و طرف مقابلِ دقیق، درست از همین‌جا الگو را می‌بیند.

python
# pip3 install requests
import requests
from itertools import cycle

# read the proxies from the proxy list file
proxies_list = open("proxies_list.txt", "r").read().strip().split("\n")

# create a proxy generator
proxy_pool = cycle(proxies_list)

for _ in range(4):
    proxy = next(proxy_pool)

    proxies = {
        "http": f"http://{proxy}",
        "https": f"http://{proxy}",
    }

    response = requests.get(
        "https://httpbin.io/ip",
        proxies=proxies,
    )

    if response.status_code != 200:
        print(f"The request failed with {response.status_code}")
    else:
        print(response.text)

تصادفی

تصادف الگو را می‌شکند. در عوض ممکن است یک آدرس بیش از بقیه انتخاب شود:

python
# pip3 install requests
import requests
import random

# read the proxies from the proxy list file
proxies_list = open("proxies_list.txt", "r").read().strip().split("\n")

for _ in range(4):
    random_proxy = random.choice(proxies_list)

    proxies = {
        "http": f"http://{random_proxy}",
        "https": f"http://{random_proxy}",
    }

    response = requests.get(
        "https://httpbin.io/ip",
        proxies=proxies,
    )

    if response.status_code != 200:
        print(f"The request failed with {response.status_code}")
    else:
        print(response.text)

فقط IP را عوض نکنید

آدرس تنها یکی از نشانه‌هاست. اگر User-Agent در همه درخواست‌ها یکی بماند، همین ترکیب ربات را لو می‌دهد، هرچند IP عوض شود. آن را هم در هر درخواست تغییر دهید — دستی یا با کتابخانه‌ای مانند fake-useragent — و میان درخواست‌ها یک مکث کوتاه و نامنظم بگذارید.

جمع‌بندی

Python برای اسکرپینگ گزینه خوبی است و ساختن چرخش روی فهرست شخصی با Requests چند خط بیشتر نیست. اگر فهرست کم آورد یا مدیریتش دردسر شد، پروکسی چرخشی همان کار را در سمت سرویس انجام می‌دهد.

پرسش از ChatGPTپرسش از Claude