这个目录下封装了操作数据库的一些接口。
为了通用性,本项目使用SQLite作为底层的数据库,使用sqlite3
提供的接口对数据库进行操作。
主要包含两个表,分别用于储存代理和爬取器:
- 代理
字段名称 | 数据类型 | 说明 |
---|---|---|
fetcher_name | 字符串 | 这个代理来自哪个爬取器 |
protocol | 字符串 | 代理协议名称,一般为HTTP |
ip | 字符串 | 代理的IP地址 |
port | 整数 | 代理的端口号 |
validated | 布尔值 | 这个代理是否通过了验证,通过了验证表示当前代理可用 |
latency | 整数 | 延迟(单位毫秒),表示上次验证所用的时间,越小则代理质量越好 |
validate_date | 时间戳 | 上一次进行验证的时间 |
to_validate_date | 时间戳 | 下一次进行验证的时间,如何调整下一次验证的时间可见后文或者代码Proxy.py |
validate_failed_cnt | 整数 | 已经连续验证失败了多少次,会影响下一次验证的时间 |
- 爬取器
字段名称 | 数据类型 | 说明 |
---|---|---|
name | 字符串 | 爬取器的名称 |
enable | 布尔值 | 是否启用这个爬取器,被禁用的爬取器不会在之后被运行,但是其之前爬取的代理依然存在 |
sum_proxies_cnt | 整数 | 至今为止总共爬取到了多少个代理 |
last_proxies_cnt | 整数 | 上次爬取到了多少个代理 |
last_fetch_date | 时间戳 | 上次爬取的时间 |
由于不同代理网站公开的免费代理质量差距较大,因此对于多次验证都失败的代理,我们需要降低对他们进行验证的频率,甚至将他们从数据库中删除。 而对于现在可用的代理,则需要频繁对其进行验证,以保证其可用性。
目前的算法较为简单,可见Proxy.py
文件中的validate
函数,核心思想如下:
- 优先验证之前验证通过并且到了验证时间的代理(
conn.py
中的getToValidate
函数) - 对于爬取器新爬取到的代理,我们需要尽快对其进行验证(设置
to_validate_date
为当前时间) - 如果某个代理验证成功,那么设置它下一次进行验证的时间为5分钟之后
- 如果某个代理验证失败,那么设置它下一次进行验证的时间为 5 * 连续失败次数 分钟之后,如果连续3次失败,那么将其从数据库中删除
你可以修改为自己的算法,主要代码涉及Proxy.py
文件以及conn.py
文件的pushNewFetch
和getToValidate
函数。