【补充】代理池搭建

【补充】代理池搭建

【1】引入

  • 代理池是一种用于获取可用代理服务器的工具,可以帮助用户在发送请求时隐藏真实IP地址并提高访问稳定性。
  • 开源的代理池核心原理:https://github.com/jhao104/proxy_pool
    • 1 使用爬虫技术,爬取网上免费的代理
    • 2 爬完回来做验证,如果能用,存到redis中
  • 启动调度程序,爬代理,验证,存到redis中
    • python proxyPool.py schedule

步骤1:选择合适的开源软件

  • 首先,我们需要选择一款适合搭建代理池的开源软件。
  • 目前市面上有很多可供选择的软件,比如Scrapy、ProxyPool等。
  • 根据自己的需求和技术能力,选择一款稳定可靠的软件进行搭建。

步骤2:安装依赖和配置环境

  • 根据所选软件的官方文档,安装相关依赖并配置环境。
  • 通常情况下,您需要安装Python以及相应的库和模块。

步骤3:编写代理池程序

根据软件的要求,编写代理池程序。程序主要包括以下几个部分:

  • 代理获取:从免费代理网站或付费代理提供商获取代理IP,并进行有效性验证。
  • 代理存储:将有效的代理IP存储在数据库或其他存储介质中,以供后续使用。
  • 代理检测与维护:定时检测已存储的代理IP的有效性,并根据需要进行维护,如删除无效的代理IP。

步骤4:运行代理池程序

  • 确认程序编写完成后,通过命令行或脚本运行代理池程序。
  • 程序会自动获取、存储和维护代理IP。

步骤5:从代理池中随机取出代理发起请求

  • 在需要使用代理的场景下,可以从代理池中随机选择一个可用的代理IP,并将其添加到请求头中。
  • 示例代码如下:
import random
import requests

def get_random_proxy():
    # 从数据库或其他存储介质中获取代理池中的代理IP列表
    proxy_list = ['ip1:port1', 'ip2:port2', 'ip3:port3', ...]
    
    # 随机选择一个代理IP
    random_proxy = random.choice(proxy_list)
    
    return random_proxy

def send_request(url):
    # 获取随机代理IP
    proxy = get_random_proxy()
    
    # 设置代理参数
    proxies = {
        'http': 'http://' + proxy,
        'https': 'https://' + proxy
    }
    
    try:
        # 发起请求
        response = requests.get(url, proxies=proxies, timeout=10)
        
        # 处理响应数据
        # ...
        
    except Exception as e:
        # 请求异常处理
        # ...

# 示例调用
url = "http://example.com"
send_request(url)
  • 通过以上步骤,您就可以搭建一个代理池,并从中随机选择代理IP发送请求。
  • 记得定期更新和维护代理池,以确保代理IP的有效性和可用性。

【2】拉取第三方镜像

  • pycharm
    • Git
    • Clone
    • Git from version control

https://github.com/jhao104/proxy_pool

【3】搭建虚拟环境

mkvirtualenv -p python39 proxypool

【4】安装依赖

pip install -r requirements.txt

【5】更新配置

# setting.py 为项目配置文件

# 配置API服务

HOST = "0.0.0.0"               # IP
PORT = 5000                    # 监听端口


# 配置数据库
# Redis数据库
DB_CONN = 'redis://127.0.0.1:8888/2'


# 配置 ProxyFetcher

PROXY_FETCHER = [
    "freeProxy01",      # 这里是启用的代理抓取方法名,所有fetch方法位于fetcher/proxyFetcher.py
    "freeProxy02",
    # ....
]

# 代理验证目标网站
HTTP_URL = "http://httpbin.org"

HTTPS_URL = "https://www.qq.com"

【6】启动项目

  • 如果已经具备运行条件, 可用通过proxyPool.py启动。
  • 程序分为: schedule 调度程序 和 server Api服务

(1)启动调度程序

  • 启动调度程序,爬代理,验证,存到redis中
python proxyPool.py schedule

(2)启动webApi服务

  • 使用flask启动服务,对外开放了几个接口,向某个接口发请求,就能随机获取一个代理
python proxyPool.py server

【7】使用

(1)Api

api method Description params
/ GET api介绍 None
/get GET 随机获取一个代理 可选参数: ?type=https 过滤支持https的代理
/pop GET 获取并删除一个代理 可选参数: ?type=https 过滤支持https的代理
/all GET 获取所有代理 可选参数: ?type=https 过滤支持https的代理
/count GET 查看代理数量 None
/delete GET 删除代理 ?proxy=host:ip

(2)爬虫使用

  • 如果要在爬虫代码中使用的话, 可以将此api封装成函数直接使用,例如
import requests

def get_proxy():
    return requests.get("http://127.0.0.1:5010/get/").json()

def delete_proxy(proxy):
    requests.get("http://127.0.0.1:5010/delete/?proxy={}".format(proxy))

# your spider code

def getHtml():
    # ....
    retry_count = 5
    proxy = get_proxy().get("proxy")
    while retry_count > 0:
        try:
            html = requests.get('http://www.example.com', proxies={"http": "http://{}".format(proxy)})
            # 使用代理访问
            return html
        except Exception:
            retry_count -= 1
    # 删除代理池中代理
    delete_proxy(proxy)
    return None
  • 简单示例
import requests
res = requests.get('http://192.168.1.252:5010/get/?type=http').json()['proxy']
proxies = {
    'http': res,
}
print(proxies)
# 我们是http 要使用http的代理
respone = requests.get('http://139.155.203.196:8080/', proxies=proxies)
print(respone.text)

posted @ 2023-08-22 09:16  Chimengmeng  阅读(256)  评论(0编辑  收藏  举报
/* */