我根据爬虫大神崔庆才的脚本做了个一个代理池,把他的脚本优化了下,代理池非常稳定,而且加入了IP统计功能。
我们都知道,频繁拨号势必会碰到重复IP,这时候就需要把每个IP放到Redis哈希表中:
redis代理池中的IP统计
这时候大家可以看到,刚拨号几分钟就出现了很多重复IP。大家不必去试我的IP代理,都是做了加密的O(∩_∩)O
还有一个功能,我加入了拨号失败的智能判断。崔大神的代码应该没怎么优化,实际生产中拨号VPS很容易连续拨号失败然后再也不能联网了。它的表现是能拨到IP但是这个时候已经没有网络了,这个时候需要重启,实在不行就要联系售后了,售后会设置一个新的拨号账户,然后你才能继续拨号。代码实现很简单,把每次拨号的IP放到一个list,让list始终保持三个元素,>= 3就pop第一个元素出来,这样这个列表中保存的始终是最近拨出的3个IP,如果三个都是invalid,那么就需要重启机器了,没必要再等待。崔大神的脚本bug之一就在这里,没有处理拨号失败的问题。当然,拨号之前需要把redis中的当前机器的IP删除。
if self.test_proxy(proxy):
logger.info(f'Valid proxy {proxy}')
# 将代理放入数据库
self.set_proxy(proxy)
self.ip_validity_statistics('valid')
time.sleep(DIAL_CYCLE)
else:
logger.error(f'Proxy invalid {proxy}')
# 连续三次拨号无效
self.ip_validity_statistics('invalid')
if len(self.invalid_ip_list) > 0:
if self.invalid_ip_list.count('invalid') == 3:
logger.error('连续三次拨号失败!从代理池删除IP并重启系统.......')
self.remove_proxy()
os.system('/usr/sbin/shutdown -r now')
time.sleep(DIAL_ERROR_CYCLE)
def ip_validity_statistics(self, ele):
if len(self.invalid_ip_list) < 3:
self.invalid_ip_list.append(ele)
else:
self.invalid_ip_list.pop(0)
self.invalid_ip_list.append(ele)
机器重启之后,需要自动重启拨号脚本,我在上一篇文章中提到了,这里不再重复了。稍后我把代码上传github,理论上,建一个千万级甚至亿万级代理池这套脚本也能应付了。批量采购的话,一个拨号VPS成本在40块钱左右,选择江浙一带的带宽多在20Mbps(我实际测试过),我一直在用一家的拨号VPS,服务不错,带宽也足,因为经常用,客服还给我了一个比较大的折扣,如果有需要的可以联系我,要知道正常价60-80,客服MM给了我46的优惠价。VPS我测试过,比较稳定,当然拨号太频繁了还是会出现重复IP甚至封号(需要找客服换拨号账户)。