一、环境准备
在开始搭建之前,我们需要确保本地环境已经安装了以下工具和软件:
- Python 3.9.2:你可以从 Python 官方网站 下载并安装 Python 3.9.2 版本。
- Redis:Redis 是一个开源的内存数据结构存储系统,用于存储代理 IP 信息。你可以从 Redis 官方网站 下载并安装 Redis。
- Git:用于从 GitHub 克隆 proxy_pool 项目。你可以从 Git 官方网站 下载并安装 Git。
注意:python环境可以选择其它版本,具体参考GitHub项目文档,经测试,3.9.2环境是可以运行的
二、克隆项目
打开终端或命令提示符,执行以下命令从 GitHub 克隆 proxy_pool 项目:
bash
git clone https://github.com/jhao104/proxy_pool.git
克隆完成后,进入项目目录:
bash
cd proxy_pool
三、安装依赖
在项目目录下,使用 pip
安装项目所需的依赖库:
bash
pip install -r requirements.txt
这个过程可能需要一些时间,请耐心等待。
四、更新配置
项目的配置文件 setting.py
位于项目的主目录下。打开该文件,根据实际情况修改配置信息:
# 配置 API 服务
HOST = "0.0.0.0" # IP
PORT = 5000 # 监听端口
# 配置数据库
DB_CONN = 'redis://@127.0.0.1:6379/0' # 请根据实际的 Redis 配置修改
# 配置 ProxyFetcher
PROXY_FETCHER = [
"freeProxy01", # 这里是启用的代理抓取方法,所有 fetch 方法位于 fetcher/proxyFetcher.py
"freeProxy02",
# ....
]
五、启动 Redis 服务
在终端中启动 Redis 服务:
bash
redis-server
确保 Redis 服务正常运行后,我们可以继续启动代理 IP 池项目。
六、启动项目
proxy_pool 项目包含两部分:schedule
调度程序和 server
API 服务。调度程序负责采集和验证代理,API 服务提供代理服务的 HTTP 接口。
启动调度程序
在终端中执行以下命令启动调度程序:
bash
python proxyPool.py schedule
调度程序会定时从各个免费代理源采集代理 IP,并进行验证,将可用的代理 IP 存入 Redis 数据库。
启动 API 服务
在另一个终端中执行以下命令启动 API 服务:
bash
python proxyPool.py server
API 服务启动后,你可以通过访问 http://127.0.0.1:5000
来查看 API 介绍。
七、使用代理 IP 池
启动 ProxyPool 的 server
后,会提供以下几个 HTTP 接口:
Api | Method | Description | Arg |
---|---|---|---|
/ | GET | API 介绍 | 无 |
/get | GET | 随机返回一个代理 | 无 |
/get_all | GET | 返回所有代理 | 无 |
/get_status | GET | 返回代理数量 | 无 |
/delete | GET | 删除指定代理 | proxy=host:ip |
更多配置请参考项目文档 /user/how_to_config
以下是一个使用 Python 代码调用 API 获取代理的示例:
import requests
def get_proxy():
return requests.get("http://127.0.0.1:5000/get/").json()
def delete_proxy(proxy):
requests.get("http://127.0.0.1:5000/delete/?proxy={}".format(proxy))
# 你的爬虫代码
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
八、扩展代理源
项目默认包含几个免费的代理获取源,但质量可能有限。你可以通过以下步骤扩展代理源:
- 在
ProxyFetcher
类中添加自定义的获取代理的静态方法,该方法需要以生成器(yield
)形式返回host:ip
格式的代理。例如:
class ProxyFetcher(object):
# ....
# 自定义代理源获取方法
@staticmethod
def freeProxyCustom1(): # 命名不和已有重复即可
# 通过某网站或者某接口或某数据库获取代理
# 假设你已经拿到了一个代理列表
proxies = ["x.x.x.x:3128", "x.x.x.x:80"]
for proxy in proxies:
yield proxy
# 确保每个 proxy 都是 host:ip 正确的格式返回
2.修改 setting.py
文件中的 PROXY_FETCHER
项,在其下添加自定义方法的名字:
PROXY_FETCHER = [
"freeProxy01",
"freeProxy02",
# ....
"freeProxyCustom1" # 确保名字和你添加方法名字一致
]
schedule
进程会每隔一段时间抓取一次代理,下次抓取时会自动识别调用你定义的方法。
九、总结
通过以上步骤,我们成功搭建了一个免费的代理 IP 池。这个代理 IP 池可以帮助我们在爬虫项目中更稳定地访问目标网站,提高爬虫的效率和成功率。同时,我们还可以通过扩展代理源来增加代理 IP 的质量和数量。