利用Python把github上非常实用的数据全部抓取下来!留给自己备用

207 阅读1分钟
原文链接: click.aliyun.com
利用Python把github上非常实用的数据全部抓取下来!留给自己备用利用Python把github上非常实用的数据全部抓取下来!留给自己备用

这是我根据这个流程实现的代码,网址:LiuRoy/github_spider

递归实现

利用Python把github上非常实用的数据全部抓取下来!留给自己备用

运行结果

因为每个请求延时很高,爬虫运行效率很慢,访问了几千个请求之后拿到了部分数据,这是按照查看数降序排列的python项目:

利用Python把github上非常实用的数据全部抓取下来!留给自己备用

这是按粉丝数降序排列的用户列表

利用Python把github上非常实用的数据全部抓取下来!留给自己备用

运行缺陷

作为一个有追求的程序员,当然不能因为一点小成就满足,总结一下递归实现的几个缺陷:

因为是深度优先,当整个用户图很大的时候,单机递归可能造成内存溢出从而使程序崩溃,只能在单机短时间运行。单个请求延时过长,数据下载速度太慢。

  1. 针对一段时间内访问失败的链接没有重试机制,存在数据丢失的可能。

异步优化

利用Python把github上非常实用的数据全部抓取下来!留给自己备用

队列实现

实现原理

采取广度优先的遍历的方式,可以把要访问的网址存放在队列中,再套用生产者消费者的模式就可以很容易的实现多并发,从而解决上面的问题2。如果某段时间内一直失败,只需要将数据再仍会队列就可以彻底解决问题3。不仅如此,这种方式还可以支持中断后继续运行,程序流程图如下:

利用Python把github上非常实用的数据全部抓取下来!留给自己备用

运行程序

为了实现多级部署(虽然我就只有一台机器),消息队列使用了rabbitmq,需要创建名为github,类型是direct的exchange,然后创建四个名称分别为user, repo, follower, following的队列,详细的绑定关系见下图:

利用Python把github上非常实用的数据全部抓取下来!留给自己备用

利用Python把github上非常实用的数据全部抓取下来!留给自己备用