Skip to content

爬虫代理池-python

背景

近期需要写一些网络爬虫,用于释放部分工作量,由于其中部分需要采集大量的信息,难免会触及到网站的反爬机制。

代理池

前期公司提供了一些ip,但由于量巨大,所以在开始寻找代理吃,就发现了pyhon的ProxyPool。

ProxyPool

爬虫代理IP池项目,主要功能为定时采集网上发布的免费代理验证入库,定时验证入库的代理保证代理的可用性,提供API和CLI两种使用方式。同时你也可以扩展代理源以增加代理池IP的质量和数量。
https://github.com/jhao104/proxy_pool

使用教程

  • 搭建代理服务
    docker run -d -it --name redis -p 6379:6379 redis
    docker run --env DB_CONN=redis://:password@ip:port/0 -p 5010:5010 jhao104/proxy_pool:latest
  • 使用代理服务
    启动web服务后, 默认配置下会开启 http://127.0.0.1:5010 的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
  • python 示例
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

使用备注说明

  1. 代理池均来自三方免费代理
  2. 代理池中的代理虽然会判断是否有效,但任然需要自行二次判断。
  3. get_proxy获取到当无法使用,就需要使用delete_proxy 进行删除,以免后续再次提取。
  4. 代理池可能经过一段时间使用后会为空。
发表评论

电子邮件地址不会被公开。 必填项已用*标注