爬蟲新利器:揭開Github 火熱的開源IP 代理池秘密!



開源網路
如果你的IP被攔截,別急,可以隨機換成另一個代理IP位址,輕鬆繼續完成存取請求。今天,就讓我們一起來簡單了解IP代理池的安裝與使用,掌握隱藏IP的小技巧。

遇到網頁爬取、漏洞挖掘或滲透測試時,常碰到請求被攔截的煩惱,導致任務中斷。而為了繼續發送請求數據,代理池技術應運而生。它就像一個神奇的「池子」,只要請求代理池,就能得到一個代理IP位址。如果你的IP被攔截,別急,可以隨機換成另一個代理IP位址,輕鬆繼續完成存取請求。今天,就讓我們一起來簡單了解IP代理池的安裝與使用,掌握隱藏IP的小技巧!

最近在GitHub上發現了一個非常優秀的項目,名為proxy_pool[1]的免費代理池工具。該專案完全開源,一直有著積極的開發者維護,活躍度也相當高。

項目介紹

proxy_pool專案採用Python語言開發,主要實現了以下功能:

  • 定時抓取免費代理網站,具有簡易可擴充性。
  • 使用Redis對代理進行存儲,並對代理的可用性進行排序。
  • 定時進行測試和篩選,清除不可用的代理,保留可用的代理。
  • 提供代理API,可以隨機取得經過測試的可用代理程式。

目前,該專案已經斬獲了5.3K顆星(GitHub Star),受到廣泛關注和認可。

部署方式

您可以透過兩種方式來運行代理程式池。一種方式是使用Docker(建議),另一種方式是透過常規方式運作。具體要求如下:

1.Docker

如果使用Docker,則需要安裝以下環境:

  • Docker
  • Docker-Compose

安裝方法自行搜尋即可。官方Docker Hub 映像:germey/proxypool[2]

2.常規方式

常規方式要求有Python 環境、Redis 環境,具體要求如下:

  • Python>=3.6
  • Redis

Docker 運行

如果已經安裝好了Docker和Docker-Compose,只需一條指令即可輕鬆執行。

docker-compose up
  • 1.

運行結果類似如下:

redis        | 1:M 19 Feb 2020 17:09:43.940 * DB loaded from disk: 0.000 seconds
redis        | 1:M 19 Feb 2020 17:09:43.940 * Ready to accept connections
proxypool    | 2020-02-19 17:09:44,200 CRIT Supervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.
proxypool    | 2020-02-19 17:09:44,203 INFO supervisord started with pid 1
proxypool    | 2020-02-19 17:09:45,209 INFO spawned: 'getter' with pid 10
proxypool    | 2020-02-19 17:09:45,212 INFO spawned: 'server' with pid 11
proxypool    | 2020-02-19 17:09:45,216 INFO spawned: 'tester' with pid 12
proxypool    | 2020-02-19 17:09:46,596 INFO success: getter entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
proxypool    | 2020-02-19 17:09:46,596 INFO success: server entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
proxypool    | 2020-02-19 17:09:46,596 INFO success: tester entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.

可以看到Redis、Getter、Server、Tester 都已經啟動成功。這時候訪問http://localhost:5555/random 即可取得一個隨機可用代理程式。

當然你也可以選擇自己Build,直接執行以下指令即可:

docker-compose -f build.yaml up
  • 1.

使用

成功運行之後可以透過http://localhost:5555/random 取得一個隨機可用代理程式。

可以用程式對接實現,下面的範例展示了獲取代理並爬取網頁的過程:

import requests

proxypool_url = 'http://127.0.0.1:5555/random'
target_url = 'http://httpbin.org/get'

def get_random_proxy():
    """
    get random proxy from proxypool
    :return: proxy
    """
    return requests.get(proxypool_url).text.strip()

def crawl(url, proxy):
    """
    use proxy to crawl page
    :param url: page url
    :param proxy: proxy, such as 8.8.8.8:8888
    :return: html
    """
    proxies = {'http': 'http://' + proxy}
    return requests.get(url, proxies=proxies).text


def main():
    """
    main method, entry point
    :return: none
    """
    proxy = get_random_proxy()
    print('get random proxy', proxy)
    html = crawl(target_url, proxy)
    print(html)

if __name__ == '__main__':
    main()
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.

運行結果如下:

get random proxy 116.196.115.209:8080
{
  "args": {},
  "headers": {
    "Accept": "*/*",
    "Accept-Encoding": "gzip, deflate",
    "Host": "httpbin.org",
    "User-Agent": "python-requests/2.22.0",
    "X-Amzn-Trace-Id": "Root=1-5e4d7140-662d9053c0a2e513c7278364"
  },
  "origin": "116.196.115.209",
  "url": "https://httpbin.org/get"
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.

可以看到成功獲取了代理,並請httpbin.org 驗證了代理的可用性。

寫到最後

在網路資料取得和安全性測試中,代理程式池是一個非常有用的工具,能夠幫助使用者有效地管理和利用代理資源,提高工作效率。透過本文的介紹,希望您對代理池的原理和使用有了更深入的了解。無論是對於開發者還是安全工程師來說,掌握代理池的使用技巧都將成為您工作中的利器。

Reference:

  • [1]proxy_pool:https://github.com/Python3WebSpider/ProxyPool
  • [2]germey/proxypool:https://hub.docker.com/r/germey/proxypool