【补充】代理池搭建
【补充】代理池搭建
【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
- 启动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 |
(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)