آموزش rotate کردن پروکسی و آدرس های IP در پایتون و Scrapy

Rotating Proxies

با سلام و درود، تو این آموزش قصد دارم از rotate کردن proxies و IP Addresses در پایتون و در ادامه استفاده از پروکسی در Scrapy صحبت بکنم. (How To Rotate Proxies and IP Addresses using Python)

خب من خودم از تغییر IP و استفاده از پروکسی برای Scrapy استفاده کردم و دیدم میتونه یه آموزش جامع برای استفاده از پروکسی در پایتون باشه که یه موضوع جدا از بحث Scrapy برای ایجاد کردم. منتهی همین جا به مبحث پروکسی در خزنده ها (Scrapy) نیز می پردازم:)

روش ارسال درخواست ها (requests) از طریق پروکسی (Proxy) در پایتون (Python) با استفاده از Requests :

اگر شما از Python-Requests استفاده می کنید، شما میتونید یه request را از طریق پروکسی و با کانفیگ کردن آرگومان proxies بفرستید:

به تکه کد زیر توجه کنید :

import requests

proxies = {
  'http': 'http://47.74.38.43:8118',
  'https': 'http://119.82.253.24:44060',
}

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

توجه : احتمالا زمانی که شما این پست را مطالعه می کنید، پروکسی ها بالا در دسترس نباشند.

حال مسئله اینجاست که شما پروکسی دارید یا خیر!؟ سایت هایی که پروکسی رایگان ارائه می دهند، کم نیستندو یکی از بهترین هاشون سایت https://free-proxy-list.net/ هست، یه نگاهی بهش بندازید. میتونید به این سایت یه سر بزنید و یه پروکسی رو بردارید (میتونیه پروکسی https را پشتیبانی کند یا خیر)

حال بیاید از پروکسی استفاده کنیم. برای اینکه بفهمیم پروکسی اعمال شده یا خیر از سایت HTTPBin’s IP استفاده کردیم. اول یه سر به اینجا بزنید :

https://httpbin.org/ip

داره IPشما را نمایش می دهد (اگر از پیلتر شکن استفاده نمی کنید).

حال به تکه کد زیر دقت کنید :

import requests
url = 'https://httpbin.org/ip'
proxies = {
    "http": 'http://47.74.38.43:8118', 
    "https": 'http://119.82.253.24:44060'
}
response = requests.get(url,proxies=proxies)
print(response.json())
{'origin': '47.74.38.43'}

مشاهده می کنید که درخواست شما از طریق پروکسی فرستاده شده است.

آموزش Rotating کردن درخواست ها از طریق استخری ای پروکسی ها در پایتون (Rotating Requests through a pool of Proxies) :

خب در ادامه قصد دارم لیستی از پروکسی ها را از روی سایتی که بالا معرفی کردم و پروکسی رایگان ارائه می داد، بسازم. به کد زیر توجه کنید، روی سایت free-proxy-list.net یه خزنده نوشتیم تا لیست پروکسی ها را استخراج کند:

def get_https_proxies():
    url = 'https://free-proxy-list.net/'
    response = requests.get(url)
    parser = fromstring(response.text)
    httpsProxies = set()
    for i in parser.xpath('//tbody/tr')[:10]:
        if i.xpath('.//td[7][contains(text(),"yes")]'):
            #Grabbing IP and corresponding PORT
            proxy = ":".join([i.xpath('.//td[1]/text()')[0], i.xpath('.//td[2]/text()')[0]])
            httpsProxies.add(proxy)
    return httpsProxies

برای پروکسی های http نیز تکه کد زیر :

# Sadegh-khan: Get list of free-proxy (http) from free-proxy-list.net
def get_http_proxies():
    url = 'https://free-proxy-list.net/'
    response = requests.get(url)
    parser = fromstring(response.text)
    httpProxies = set()
    for i in parser.xpath('//tbody/tr')[:20]:
        if i.xpath('.//td[7][contains(text(),"no")]'):
            #Grabbing IP and corresponding PORT
            proxy = ":".join([i.xpath('.//td[1]/text()')[0], i.xpath('.//td[2]/text()')[0]])
            httpProxies.add(proxy)
    return httpProxies

برای استفاده از کد بالا نیز به راحتی دستورات زیر را داخل فایل پایتون مان می نویسیم:

proxies = get_https_proxies()
    print(proxies)
    httpProxies = get_http_proxies()
    print(httpProxies)

استفاده از Rotating Proxies در Scrapy :

خب تا اینجای کار تونستیم یه لیست از پروکسی های رایگان بدست بیاریم، حال نوبت به استفاده از این پروکسی ها داخل Scrapy رسیده است.

برای این کار از scrapy-rotating-proxies استفاده می کنیم (یه سر به صفحه گیت هاب scrapy rotating proxies بزنید) برای نصبش کافیست از دستور pip استفاده کنیم (داخل سایت pypi (Python Package Index) نیز می تونید پیداش کنید):

pip install scrapy-rotated-proxy

حال باید تغییراتی را در فایل Settings.py پروژه Scrapy تان بدهید:

DOWNLOADER_MIDDLEWARES = {
    'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
}

ROTATING_PROXY_LIST = [
    'proxy1.com:8000',
    'proxy2.com:8031',
    # ...
]

که ما چون لیست پروکسی ها را در مرحله قبلی بدست آورده بودیم، Option دوم به صورت زیر اصلاح می شود:

'ROTATING_PROXY_LIST': httpProxies,

برای یادآوری httpProxies به صورت زیر مقدار دهی شده بود:

    httpProxies = get_http_proxies()

می توانید لیست پروکسی ها را از داخل فایل .txt نیز فراخوانی کنید. برای اینکار باید از Option با نام ROTATING_PROXY_LIST_PATH استفاده کنید که اولویتش در اجرا شدن بالاتر از ROTATING_PROXY_LIST می باشد.

httpProxies = get_http_proxies()
    print(httpProxies)
    # Sadegh Khan : Write HttpProxies to a text file
    with open('http_proxies.txt', 'w') as f:
        for item in httpProxies:
            f.write("%s\n" % item)
    print("************ %%%%% Proxies %%%%% *************")

البته اگر قصد دارید پروژه Scrapy را به صورت اسکریپت اجرا بکنید و فایل Settings.py نداشته باشید، می توانید به صورت زیر تغییرات مربوط به Settings را انجام دهید:

custom_settings = {
        'FEED_URI': "%(name)s %(time)s new.json",
        'FEED_FORMAT': 'json',
        'DOWNLOADER_MIDDLEWARES': {
            'rotating_proxies.middlewares.RotatingProxyMiddleware': 610,
            },
        'ROTATING_PROXY_LIST': httpProxies,
'ROTATING_PROXY_LIST_PATH': 'http_proxies.txt',
        }

توجه داشته باشید که custom_settings را باید داخل کلاس spider تان نوشته باشید. به عکس زیر توجه کنید :

کل کد خزنده به صورت زیر می باشد :

آدرس گیت هاب قرار داده خواهد شد 🙂 AmazonSpider3