文章目录
- 1. 前言
- 2. 教程
- 3. 官网
- 4. 在线demo
- 4.1. 本地部署
- 4.2. 安装
- 4.2.1. Python源码构建安装
- 4.2.1.1. 安装redis数据库
- 4.2.1.1.1. 下载redis源码
- 4.2.1.1.2. 启动redis服务
- 4.2.1.1.3. 安装redis服务
- 4.2.1.1.4. 再次通过命令启动redis服务
- 4.2.1.1.5. 测试redis服务是否可用
- 4.2.1.2. 下载proxy_pool源码
- 4.2.1.3. 安装依赖
- 4.2.1.4. 更新配置
- 4.2.1.4.1. 配置参数
- 4.2.1.4.2. 配置参数案例
- 4.2.1.5. 启动项目
- 4.2.1.6. 测试API的调用
- 4.2.1.6.1. 直接打开网页版
- 4.2.1.6.2. 代码测试
- 4.2.2. docker安装
- 4.2.3. API调用
- 5. 报错
1. 前言
- 之前做爬虫的时候,经常会遇到对于一个网页,使用同一个IP多次会被禁掉IP的问题,我们可以自己手动更换代理IP再继续这个问题但多少会有点麻烦,我对于一个懒人来说,手动更换IP太麻烦,而且也不符合程序员懒惰的美德,于是便有了下面的故事。
- proxy_pool 是一个开源的代理池,聚合了各大免费的 ip 代理池。当自己的爬虫因为爬的太快了 ip 被封了的时候,代理池就可以派上用场啦
- 爬虫代理IP池项目,主要功能为定时采集网上发布的免费代理验证入库,定时验证入库的代理保证代理的可用性,提供API和CLI两种使用方式。同时你也可以扩展代理源以增加代理池IP的质量和数量。
2. 教程
- 部署自己的代理池 - idealclover
3. 官网
4. 在线demo
4.1. 本地部署
4.2. 安装
- python爬虫添加代理ip池ProxyPool (Windows) - 灰信网(软件开发博客聚合)
4.2.1. Python源码构建安装
4.2.1.1. 安装redis数据库
4.2.1.1.1. 下载redis源码
- Windows下安装Redis图文教程_喵代王-香菜的博客-CSDN博客_windows安装redis
- windows首先下载安装Redis安装包,并解压到合适位置(放哪都行)
4.2.1.1.2. 启动redis服务
- cmd进入文件位置
- redis-server.exe redis.windows.conf
4.2.1.1.3. 安装redis服务
- 再打开一个cmd窗口,输入下面的命令,将Redis安装到Windows服务中
- redis-server --service-install redis.windows.conf
- 查看是否添加进去了服务
- services.msc
4.2.1.1.4. 再次通过命令启动redis服务
- 关闭第一个“启动服务”cmd窗口,另开一个cmd窗口,启动服务
- redis-server --service-start
- 关闭服务命令
- redis-server --service-stop
4.2.1.1.5. 测试redis服务是否可用
- redis-cli.exe -h 127.0.0.1 -p 6379
- 如果没报错,并且显示下面的界面的话,就表示这个redis服务现在可用
4.2.1.2. 下载proxy_pool源码
git clone git@github.com:jhao104/proxy_pool.git
- 如果无法通过这种方法克隆的话,就手动下载吧
- 或者直接下载特定的release版本
- Releases · jhao104/proxy_pool · GitHub
4.2.1.3. 安装依赖
pip install -r requirements.txt
4.2.1.4. 更新配置
- 配置文件 setting.py 位于项目的主目录下:
4.2.1.4.1. 配置参数
- 配置参考 — ProxyPool 2.1.0 文档
- 配置参数说明
- 服务配置
- HOST
- API服务监听的IP, 本机访问设置为 127.0.0.1, 开启远程访问设置为: 0.0.0.0
- PORT
- API服务监听的端口.
- 数据库配置
- DB_CONN
- 用户存放代理IP的数据库URI, 配置格式为:
db_type://[[user]:[pwd]]@ip:port/[db]
- 目前支持的db_type有: ssdb 、 redis.
- DB_CONN配置示例
# SSDB IP: 127.0.0.1 Port: 8888
DB_CONN = 'ssdb://@127.0.0.1:8888'
# SSDB IP: 127.0.0.1 Port: 8899 Password: 123456
DB_CONN = 'ssdb://:123456@127.0.0.1:8888'
# Redis IP: 127.0.0.1 Port: 6379
DB_CONN = 'redis://@127.0.0.1:6379'
# Redis IP: 127.0.0.1 Port: 6379 Password: 123456
DB_CONN = 'redis://:123456@127.0.0.1:6379'
# Redis IP: 127.0.0.1 Port: 6379 Password: 123456 DB: 15
DB_CONN = 'redis://:123456@127.0.0.1:6379/15'
- 我这里没有密码,所以直接就设置成了
- DB_CONN = 'redis://@127.0.0.1:6379/0'
- ![](https://img-blog.csdnimg.cn/img_convert/1f5a0a730e71f0290c6a6f68f1f9b37e.png)
-
- TABLE_NAME
- 存放代理的数据载体名称, ssdb和redis的存放结构为hash.
- 采集配置
- PROXY_FETCHER
- 启用的代理采集方法名, 代理采集方法位于 fetcher/proxyFetcher.py 类中.
- 由于各个代理源的稳定性不容易掌握, 当某个代理采集方法失效时, 可以该配置中注释掉其名称.
- 如果有增加某些代理采集方法, 也请在该配置中添加其方法名, 具体请参考 /dev/extend_fetcher.
- 调度程序每次执行采集任务时都会再次加载该配置, 保证每次运行的采集方法都是有效的.
- 这里需要实时进行更新
- 校验配置
- HTTP_URL
- 用于检验代理是否可用的地址, 默认为
http://httpbin.org
,可根据使用场景修改为其他地址. - HTTPS_URL
- 用于检验代理是否支持HTTPS的地址, 默认为
https://www.qq.com
,可根据使用场景修改为其他地址. - VERIFY_TIMEOUT
- 检验代理的超时时间, 默认为 10 , 单位秒. 使用代理访问 HTTP(S)_URL 耗时超过 VERIFY_TIMEOUT 时, 视为代理不可用.
- MAX_FAIL_COUNT
- 检验代理允许最大失败次数, 默认为 0, 即出错一次即删除.
- POOL_SIZE_MIN
- 代理检测定时任务运行前若代理数量小于 POOL_SIZE_MIN, 则先运行抓取程序.
4.2.1.4.2. 配置参数案例
# Config.ini 为项目配置文件
# 配置DB
type = SSDB # 如果使用SSDB或redis数据库,均配置为SSDB
host = localhost # db host
port = 6379 # db port
name = proxy # 默认配置
# 配置 ProxyGetter
freeProxyFirst = 1 # 这里是启动的抓取函数,可在ProxyGetter/getFreeProxy.py 扩展
freeProxySecond = 1
....
# 配置 HOST (api服务)
ip = 127.0.0.1 # 监听ip,0.0.0.0开启外网访问
port = 5010 # 监听端口
# 上面配置启动后,代理api地址为 http://127.0.0.1:5010
- 第一个port是你数据库的端口号, 第二个是api的端口号
- 目标计算机积极拒绝 · Issue #118 · jhao104/proxy_pool · GitHub
4.2.1.5. 启动项目
- 如果已配置好运行环境, 具备运行条件, 可以通过 proxyPool.py 启动. proxyPool.py 是项目的CLI入口. 完整程序包含两部份: schedule 调度程序和 server API服务, 调度程序负责采集和验证代理, API服务提供代理服务HTTP接口.
- 通过命令行程序分别启动 调度程序和API服务:
- 启动调度程序:python proxyPool.py schedule
- 可以看到,正在采集对于IP,有的成功,有的失败
- 最终稳定下来
- 再开一个命令号,启动webApi服务:python proxyPool.py server
python proxyPool.py schedule
python proxyPool.py server
4.2.1.6. 测试API的调用
4.2.1.6.1. 直接打开网页版
- 127.0.0.1:5010/get/
http://127.0.0.1:5010/get/
- 这里需要注意的是,网址端口应该改成自己之前定义的端口
- 每一次刷新上面的代理IP地址都会发生改变
4.2.1.6.2. 代码测试
import requests
def get_proxy():
#5000:settings中设置的监听端口,不是Redis服务的端口
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")
print(proxy)
while retry_count > 0:
try:
html = requests.get('http://www.baidu.com', proxies={"http": "http://{}".format(proxy)})
print(html.text)
break
except Exception:
retry_count -= 1
# 删除代理池中代理
delete_proxy(proxy)
return None
getHtml()
4.2.2. docker安装
安装
docker pull jhao104/proxy_pool
docker run --env DB_CONN=redis://:password@ip:port/0 -p 5010:5010 jhao104/proxy_pool:latest
- 运行
docker-compose up -d
4.2.3. API调用
启动web服务后, 默认配置下会开启127.0.0.1:5010/ 的api接口服务:
参数
5. 报错
-
ValueError: invalid literal for int() with base 10: ‘port’
-
可能是一个端口不可用吧,在GUI界面中修改一下端口号就好了
-
redis.exceptions.ConnectionError: Error 10061 connecting to 127.0.0.1:6379. 由于目标计算机积极拒绝,无法连接。.2022-12-24 20:52:10,677 launcher.py[line:39] INFO exit!
-
-
可能只是自己参数设置的不对吧
-
redis.exceptions.AuthenticationError: Client sent AUTH, but no password is set 2022-12-24 21:56:48,828 launcher.py[line:39] INFO exit!
-
redis的账号密码设置的不对
DB_CONN配置示例 -
ImportError: cannot import name ‘Markup’ from ‘jinja2’ (D:\Program\Anaconda3\lib\site-packages\jinja2_init_.py)
-
python版本太高了,目前支持到3.6. 3.6以上的版本把requirements.txt里面的版本号删掉 重新pip install 一下
### APScheduler
werkzeug
Flask
requests
click
gunicorn
lxml
redis
-
pip uninstall -r requirements.txt
-
pip install -r requirements.txt
-
运行出错! · Issue #663 · jhao104/proxy_pool · GitHub
之后就正常了
-
requests.exceptions.ConnectionError: HTTPConnectionPool(host=‘127.0.0.1’, port=5000): Max retries exceeded with url: /get/ (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x000001AF5F88EAD0 Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。’))
-
很简单,端口不匹配,更改即可
ctionPool**(host=‘127.0.0.1’, port=5000): Max retries exceeded with url: /get/ (Caused by NewConnectionError(‘<urllib3.connection.HTTPConnection object at 0x000001AF5F88EAD0 Failed to establish a new connection: [WinError 10061] 由于目标计算机积极拒绝,无法连接。’))
- 很简单,端口不匹配,更改即可
[外链图片转存中…(img-nAUDtJec-1671896468370)]