为什么需要代理池
在爬取网站信息的过程中,有些网站为了防止爬虫,可能会限制每个ip的访问速度或访问次数。对于限制访问速度的情况,我们可以通过time.sleep进行短暂休眠后再次爬取。对于限制ip访问次数的时候我们需要通过代理ip轮换去访问目标网址。所以建立并维护好一个有效的代理ip池也是爬虫的一个准备工作。
如何构建一个代理池
安装
安装Python
至少Python3.5以上
安装Redis
安装好之后将Redis服务开启
配置代理池
cd proxypool
进入proxypool目录,修改settings.py文件
PASSWORD为Redis密码,如果为空,则设置为None
安装依赖
pip3 install -r requirements.txt
打开代理池和API
python3 run.py
获取代理
利用requests获取方法如下
各模块功能
- getter.py
爬虫模块
- class proxypool.getter.FreeProxyGetter
爬虫类,用于抓取代理源网站的代理,用户可复写和补充抓取规则。
schedule.py
调度器模块class proxypool.schedule.ValidityTester
异步检测类,可以对给定的代理的可用性进行异步检测。
- class proxypool.schedule.PoolAdder
代理添加器,用来触发爬虫模块,对代理池内的代理进行补充,代理池代理数达到阈值时停止工作。
- class proxypool.schedule.Schedule
代理池启动类,运行RUN函数时,会创建两个进程,负责对代理池内容的增加和更新。
- db.py
Redis数据库连接模块
- class proxypool.db.RedisClient
数据库操作类,维持与Redis的连接和对数据库的增删查该
- error.py
异常模块
- class proxypool.error.ResourceDepletionError
资源枯竭异常,如果从所有抓取网站都抓不到可用的代理资源,
则抛出此异常。
class proxypool.error.PoolEmptyError
代理池空异常,如果代理池长时间为空,则抛出此异常。
api.py
API模块,启动一个Web服务器,使用Flask实现,对外提供代理的获取功能。
- utils.py
工具箱
- setting.py
设置