gerapy分布式爬虫监控

gerapy部署问题小结

前几天折腾的crawlab虽然功能强大,但是槽点太多了,试试崔大神的gerapy吧。先挖个坑记录下槽点:

  1. 前端无法更改用户密码,Django后台登录可以,这个我是在源码中找出来的(docs/en/source/docker.md, docs/zh_cn/build/html/_sources/docker.md.txt)
  2. 下面docker定死了8000端口,暂时不要使用其他端口。如果需要,改下Dockerfile吧。感觉做的产品不细致,这种应该安装时给选项定制用户信息和端口的
https://github.com/Gerapy/Gerapy/search?q=admin
docker run -d -v ~/gerapy:/app/gerapy -p 8000:8000 germey/gerapy
http://localhost:8000/admin/auth
gerapy爬虫项目结构
  1. 爬虫上传结构是又要求的,需要把整个项目文件夹打包,scrapy.cfg千万不要忘了。
  2. 另外,部署前一定要在每个主机安装好项目的依赖,可以在项目目录运行 pipreqs ./ ,生成requirements.txt然后每个节点pip install -r requirements.txt。不事先安装依赖的话部署会失败
  3. 如果某个.py文件无法在gerapy预览,考虑下该文件是否编码不是utf-8,上传到github时会检测到。

虽然功能比较简单,但是基本上开箱能用,不像crawlab部署困难而且坑儿很多。期待新版本吧。

搭建亿级IP代理池

如何轻松搭建乙级IP代理池

我根据爬虫大神崔庆才的脚本做了个一个代理池,把他的脚本优化了下,代理池非常稳定,而且加入了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甚至封号(需要找客服换拨号账户)。