爬虫流程

在上周写完用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启动脚本
队列状态图:

github数据怎么Python爬取相关推荐

  1. 爬取电商平台数据,python爬取某维商品数据

    本次内容: 爬取电商平台数据,python爬取某维商品数据 课程亮点 动态数据抓包演示 json数据解析 requests模块的使用 保存csv 环境介绍 python 3.8 [最好用和老师一样的版 ...

  2. 如何用python爬取图片数据_“python爬取微博图片教程“用Python爬虫爬取的图片怎么知道图片有没有水印...

    怎样用python爬新浪微博大V所有数据 我是个微博重度,工作之余喜欢刷刷timeline看看有什么新鲜事发也因此认识了高质量的原创大V,有分享技术资料的,比如好东西传送门:有时不时给你一点人生经验的 ...

  3. python处理表格数据匹配-python爬取两个excel表里的相同数据并匹配输出

    import xlrd def extract(inpath): data = xlrd.open_workbook(inpath, encoding_override="utf-8&quo ...

  4. python爬取+BI分析5000条内衣数据,发现妹子最爱这款文胸

    生活中我们经常会用python进行数据爬取,但是爬取简单分析难,很多人喜欢用echarts图表接口或者是python的第三方库进行数据可视化,甚至是用matlab,基本上都需要用代码实现,在数据展示上 ...

  5. 和讯网债券数据Python爬取保存成CSV文件之一

    本文讲述国债数据使用python爬取的方式,并将得到的数据保存成CSV文件以日期命名,方便后期处理. 具体代码如下所示: import requests from bs4 import Beautif ...

  6. 元旦假期,去哪里旅游好呢?Python爬取元旦旅游最全攻略!

    2020还有最后几天就就结束了,您考虑好2021的第一天去哪里旅游了吗,不如来看看使用Python爬取最全攻略!受益的朋友给个三连. 转发请求声明. 一.实现思路 首先我们爬取的网站是一个穷游网站: ...

  7. python爬取控制台信息_python爬虫实战之爬取智联职位信息和博客文章信息

    1.python爬取招聘信息 简单爬取智联招聘职位信息 # !/usr/bin/env python # -*-coding:utf-8-*- """ @Author  ...

  8. Python应用实战-Python爬取4000+股票数据,并用plotly绘制了树状热力图(treemap)

    目录: 1. 准备工作 2. 开始绘图 2.1. 简单的例子 2.2. px.treemap常用参数介绍 2.3. color_continuous_scale参数介绍 2.4. 大A股市树状热力图来 ...

  9. Python 爬取近十万条程序员招聘数据,告诉你哪类人才和技能最受热捧! | 原力计划...

    作者 | Huang supreme,责编 | 郭芮 出品 | CSDN博客 封图 | CSDN 下载于视觉中国 随着科技的飞速发展,数据呈现爆发式的增长,任何人都摆脱不了与数据打交道,社会对于&qu ...

最新文章

  1. 延迟环境变量扩展(bat)
  2. Xamarin无法调试Android项目
  3. 密码嗅探工具dsniff
  4. 明明白白学C#第0章准备工作
  5. python入门代码示例-Python入门简单的静态网页爬虫3.0 (爬虫的示例代码)
  6. Spring Boot配置文件 application.properties
  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) 分块
  8. 判断机器学习算法或深度学习算法优势常考虑的点
  9. 黄聪:选择适当的关键词
  10. c语言补码转源码函数,求原码、补码,反码(C语言源代码)
  11. Word XP 中目录的编制方法,Word XP 功能键使用大全
  12. 安装webpack上
  13. SWAT | SWAT源码编译
  14. 从RTP包中分析OPUS码流
  15. Debian 安装sublime 安装拼音输入法 安装谷歌浏览器
  16. VS2013未能正确加载microsoft.visualstudio.editor.implementation.editorpackage
  17. oracle、sqlserver、mysql常用函数对比[to_char、to_number、to_date]
  18. iris配置https访问
  19. java调用迅雷_java jna调用迅雷接口下载
  20. spring bean创建过程源码分析(上)

热门文章

  1. 安卓系统AOSP源码修改入门
  2. BIM应用(VR\AR\MR)相关设备及软件——来自《中国建筑业BIM应用分析报告(2020)》
  3. 中断向量,中断向量表 ,中断服务函数
  4. 数字逻辑实验|逻辑函数及其描述工具(Logisim)
  5. 电泵井php和psi,电泵井测压安全技术.doc
  6. Android adb命令使用记录
  7. mac terminal终端打开指定文件夹 当前文件夹打开terminal
  8. 自动领取起点网页版的经验值
  9. 博士毕业答辩会上的感言——余子濠
  10. centos安装与配置