github数据怎么Python爬取

news2024/11/24 11:28:12

爬虫流程

在上周写完用scrapy爬去知乎用户信息的爬虫之后,github上star个数一下就在公司小组内部排的上名次了,我还信誓旦旦的跟上级吹牛皮说如果再写一个,都不好意思和你再提star了,怕你们伤心。上级不屑的说,那就写一个爬虫爬一爬github,找一找python大牛,公司也正好在找人。临危受命,格外激动,当天就去研究github网站,琢磨怎么解析页面以及爬虫的运行策略。意外的发现github提供了非常nice的API以及文档文档,让我对github的爱已经深入骨髓。

说了这么多废话,讲讲真题吧。我需要下载github用户还有他们的reposities数据,展开方式也很简单,根据一个用户的following以及follower关系,遍历整个用户网就可以下载所有的数据了,听说github注册用户才几百万,一下就把所有的数据爬下来想想还有点小激动呢,下面是流程图:

递归实现

 

运行命令
看到这么简单的流程,内心的第一想法就是先简单的写一个递归实现呗,要是性能差再慢慢优化,所以第一版代码很快就完成了(在目录recursion下)。数据存储使用mongo,重复请求判断使用的redis,写mongo数据采用celery的异步调用,需要rabbitmq服务正常启动,在settings.py正确配置后,使用下面的步骤启动:

进入github_spider目录
执行命令celery -A github_spider.worker worker loglevel=info启动异步任务
执行命令python github_spider/recursion/main.py启动爬虫
运行结果
因为每个请求延时很高,爬虫运行效率很慢,访问了几千个请求之后拿到了部分数据,这是按照查看数降序排列的python项目: 

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

运行缺陷


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

因为是深度优先,当整个用户图很大的时候,单机递归可能造成内存溢出从而使程序崩溃,只能在单机短时间运行。
单个请求延时过长,数据下载速度太慢。
针对一段时间内访问失败的链接没有重试机制,存在数据丢失的可能。


异步优化


针对这种I/O耗时的问题,解决方法也就那几种,要么多并发,要么走异步访问,要么双管齐下。针对上面的问题2,我最开始的解决方式是异步请求API。因为最开始写代码的时候考虑到了这点,代码对调用方法已经做过优化,很快就改好了,实现方式使用了grequests。这个库和requests是同一个作者,代码也非常的简单,就是讲request请求用gevent做了一个简单的封装,可以非阻塞的请求数据。

但是当我运行之后,发现程序很快运行结束,一查发现公网IP被github封掉了,当时心中千万只草泥马奔腾而过,没办法只能祭出爬虫的终极杀器--代理。又专门写了一个辅助脚本从网上爬取免费的HTTPS代理存放在redis中,路径proxy/extract.py,每次请求的时候都带上代理,运行错误重试自动更换代理并把错误代理清楚。本来网上免费的HTTPS代理就很少,而且很多还不能用,由于大量的报错重试,访问速度不仅没有原来快,而且比原来慢一大截,此路不通只能走多并发实现了。

队列实现


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

 

运行程序

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

 

详细的启动步骤如下:

进入github_spider目录
执行命令celery -A github_spider.worker worker loglevel=info启动异步任务
执行命令python github_spider/proxy/extract.py更新代理
执行命令python github_spider/queue/main.py启动脚本
队列状态图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/43297.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网站页面SEO优化方案

如果可以实现记得点赞分享,谢谢老铁~ 背景说明 针对网页面而提供相应的产品页面 SEO 优化部署方案,使其产品页面符合 SEO 规范,且能尽快获得产品词的较好排名。 产品相关页面URL命名 URL 结构对于网站页面的 seo 来说非常重要…

VirtualLab教程特辑

目录前言一、一些界面上的说明1、关于软边relative edge width2、catalog里器件参数改动3、系统光线分析仪的光线数4、编程手册从哪看以及哪里可以编程5、Multiple Light Source6、多波长与多模式分开显示7、harmonic fields set-manipulations8、detector results显示功率小9、…

阿尔茨海默病中的人类连接组及它与生物标记物和遗传学的关系

摘要 阿尔茨海默病(AD)损害了大脑的结构和功能网络,导致认知障碍。最近的连接组学研究结果已经将AD中结构和功能网络组织的变化与淀粉样蛋白-β和tau蛋白的积累和扩散模式联系起来,为该疾病的神经生物学机制提供了见解。此外,对基因相关的连接…

如何检索专利技术?

问题一:申请实用新型专利需要提交哪些文件呢? 主要有以下四点: 1、请求书:主要包括实用新型专利的名称、申请人的名称和地址等内容; 2、权利要求书:这里需要交代好每一项要保护的内容; 3、说…

CommonsCollections6利用链分析

目录 (一)利用链 (二)代码分析 0x01 TiedMapEntry 0x02 HashMap (三)POC: (一)利用链 先来看 ysoserial 中的利用链: /*Gadget chain:java.io.ObjectInputStream.readObject()…

[附源码]SSM计算机毕业设计线上图书销售管理系统JAVA

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

三大O(nlogn)算法分析

堆排序 demo 从第一个父节点开始,每一个都调换自己和所有子孙节点的上下层次调换,形成最大堆。然后进行堆分支调整 class Solution {public int[] sortArray(int[] nums) {maxHeap(nums);sort(nums);return nums;}public static void maxHeap(int[] n…

blender hardOps插件

hardOps将一些常用的功能整合在一起,方便调用,例如,平滑,倒角,标记锐边,添加修改器 打开hardOps 方法1:物体模式在舞台左侧选择hardOps图标 推荐用这个 方法2:这个插件的打开方式非…

C++【类型转换】

文章目录一、C语言的类型转换二、C的强制类型转换1.static_cast静态转换2.reinterpret_cast重新诠释3.const_cast小总结4.dynamic_cast动态转换一、C语言的类型转换 在C语言中,如果赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者…

【PAT】数据结构树和图月考复习1

选择题 2-1 我们用一个有向图来表示航空公司所有航班的航线。下列哪种算法最适合解决找给定两城市间最经济的飞行路线问题? A.深度优先搜索 B.Kruskal算法 C.拓扑排序算法 D.Dijkstra算法 解析: 本题为单源最短路径问题,应选用dijsktra算…

【WMWare 克隆CentOS虚拟机 】解决克隆后 ip 冲突 主机名重复问题

前言: 当我需要搭建数据库主从复制集群时,不想再重新安装一遍 mysql ,于是将安装好 mysql 的虚拟机克隆一份 一、克隆方法 鼠标右击虚拟机 ----> 管理 ----> 克隆 (选择完全克隆,选择好位置,设置好…

python函数使用

目录 一.函数基本概念 1.函数是什么 2.使用函数的好处是: 3.为什么要学习、使用函数 二.函数使用 1.定义方法 2.函数的调用 3.注意事项 4.例子 三.函数中的参数 作用 注意 四.函数中的返回值 1.什么是函数返回值? 2.返回值的应用语法: 注意 五.None类型 一.函数…

Android茶叶进销存

功能描述: 该app主要实现了茶叶的进货、销售、供应商、客户的管理,是一个完整的小型进销存app,适合新手学习sqlite数据库的基本使用。具体功能如下: 一、个人业务管理子系统 1、客户信息登记、修改、注销(客户管理) …

[Linux](15)线程基础,线程控制,线程的互斥与同步

文章目录前言Linux 线程概念线程的优点线程的缺点线程异常线程用途使用pthread_createpthread_join线程退出线程id分离线程线程互斥问题:临界资源访问问题问题解决:互斥锁的使用RAII 风格的加锁方式可重入 & 线程安全死锁的概念线程同步条件变量生产…

[附源码]计算机毕业设计springboot春晓学堂管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

让我们进入面向对象的世界(四)

文章目录前言一. 初始多态1.1 多态是什么1.2 多态是怎么工作1.3多态的向上转型和向下转型二.多态的好处三.总结前言 前面我们讲过了,面向对象继承的特性,下面我们会根据多态来展开讨论,还是用熟悉的方式,让大家去了解这个疯狂的东…

软考证书具体用途--详细介绍

拿到软考证书的前提是对你自己今后的职业发展有帮助,用得到才能对你而言发挥它最大的好处。 软考证书的具体用途: 1.纳入我国高校人才培养和教学体系 目前,软考已经被纳入高校人才培养和教学体系。在很多高校中,软考纳入学分&a…

设置渐变边框色

如上图所示,需设置渐变边框色,左右边框颜色固定,上边框从左到右开始渐变,下边框从右到左开始渐变。 思考了很久,如果看作是一个div,则需要用到 border-image属性设置渐变色。也可以看作是两个div&#xff0…

北大学者发现,经常喝牛奶,增加中国人肝癌和乳腺癌风险

牛奶是生活中常见的饮品。牛奶含有丰富的蛋白质,钙元素等多种营养成分,能为人体提供充足的蛋白质和钙,增强人体的体质,提高免疫力。然而,无论是什么,物极必反,过量饮用也会对身体产生不利的影响…

2022Flink大数据比赛项目-焦点科技大数据编程大赛

文章目录0.数据获取1.需求概要2.数据标准2.1.输入数据格式2.2.输出数据格式2.3.数据主键及关系3.表详细1.order_info2.bill_info3.bill_item4.ord_pay5.ord_pay_log6.pay_method7.pay_bank_card4.开发工具、语言版本、工具版本5.赛题解答数据分流任务1任务2任务3小结附录0.数据…