数据开发岗位实习

清明节后入职广州某互联网公司从事数据开发工程师工作(实际上就是爬虫开发),因为我个人的原因8月提出离职。在职四个月期间主要完成了全国所有全国源、地方源的企业信息公示系统的爬虫。 在这里得益于两位yang哥还有大数据组其他同事的帮助,我学到了很多知识。而相比于技术,平时和他们交流时学到的面对问题时的思维方式,对我来说更加重要,让我面对工作甚至生活中的难题时,能够更好地解决问题,这是一笔不可估量的财富。

让我最享受的还是这四个月里一个人生活、学习的快乐,或许再过几年我就要面对家庭、生存的压力,前途是未知的,而我对当下是满足的,所以这段时间的收获我打算慢慢记下来。人不能一直满足现状,也不能永远饥渴。罗马不是一天建成的,我觉得人最重要的是沉淀,知识的沉淀,财富的沉淀,思维的沉淀。

基于浏览器的爬虫

  • 结论: 基于浏览器的爬虫大多都无法用于生产环境

读书时自学爬虫,遇到淘宝1688、天猫等反爬手段很强的网站时,往往会想到使用selenium爬取,而市面上也有很多基于浏览器的爬取工具如八爪鱼、后羿等工具。但是这些难以应用到生产环境,因为:

  1. 速度慢:浏览器会加载大量无关的请求、无关的js,浏览器会将html渲染成DOM树;
  2. 难以调试、无法保证成功率;
  3. 所有通过浏览器执行的前端程序,都可以用代码实现。

爬虫框架

  • Scrapy
    • 最常用的Python爬虫框架,比较灵活
  • Pyspider
    • 分布式Python爬虫框架,追求存储所有历史爬取链接,并自动更新
  • Crawler.js
    • 简单易用的Node爬虫框架
  • Nutch
    • Apache的分布式爬虫,搜索引擎友好

框架分类:

  • 精准型:Scrapy,Crawler.js
  • 撒网型:Pyspider,Nutch

Scrapy介绍

scrapy架构图

来源: scrapy

Scrapy架构图

scrapy 可以分为以下几个部分:

  1. ENGINE。 爬虫引擎,从 Spider 获取要抓取的初始请求。负责处理整个系统的数据流处理、触发事务,是整个框架的核心。
  2. ITEM。项目,定义了爬取结果的数据结构,爬取的数据会被赋值成该Item对象。Scrapy 通过 itemadapter 库支持以下类型的项目:字典、项目对象、数据类对象和 attrs 对象。
  3. Scheduler。 调度器,接受ENGINE发送过来的请求,并且将其加入Redis队列中,在稍后ENGINE再次请求时将请求提供给ENGINE。
  4. Downloader。 下载器,负责下载网页并将它们提供给ENGINE,然后ENGINE再将它们提供给SPIDERS。
  5. SPIDERS。 定义了爬取的逻辑规则和页面解析规则,负责解析响应并且声称提取结果和新的请求。实际上,爬取和解析应该分离,爬取较快,解析较慢,合理的框架应该是先爬取再解析以提高速度。
  6. ITEM PIPELINES。 负责处理由Spider从网页中抽取的项目,主要负责清洗、验证和存储数据。
  7. DOWNLOADER MIDDLEWARES。 下载器中间件,位于引擎和下载器之间的钩子框架,主要处理引擎与下载器之间的请求和响应。
  8. SPIDER MIDDLEWARES。 spider中间件,位于ENGINE和Spider之间的钩子框架,主要处理Spider输入的响应和输出结果以及新的请求。

数据流

  1. 引擎首先打开一个网站,找到处理该网站的Spider,从 Spider 获取要抓取的初始请求。
  2. 引擎从 Spider 获取第一个要爬取的URL,在调度器中以Request的形式调度请求
  3. 引擎向调度器请求下一个要爬取的URL。
  4. 调度程序将下一个要爬取的URL返回给引擎,引擎通过下载器中间件将URL转发给下载器。
  5. 引擎将请求通过下载器中间件发送到下载器,一旦页面完成下载,下载器生成一个响应(带有该页面)并将其通过下载器中间件发送到引擎。
  6. 引擎从下载器接收Response并通过Spider中间件将其发送给Spider进行处理。
  7. Spider 处理Response并将抓取的Item和新的Request通过 Spider 中间件返回给引擎。
  8. 引擎将处理后的Item发送到Item pipeline,然后将处理后的Request发送到调度程序并询问下一个请求进行爬取。
  9. 该过程重复(从第 2 步开始到第8部),直到不再有来自调度程序的请求。

通过多个组件相互协作、不同组件完成的工作不同、组件对异步处理的支持,最大限度地利用了网络带宽,提高了数据爬取和处理的效率。

优缺点

优点

  • 基于 Twisted,异步高并发
  • 灵活,可编程性高,中间件可定制
  • 搭配 scrapy-redis 后可以分布式部署

缺点

  • 每个爬虫都是一个进程,无法集中管理
  • 无法动态分配资源,协调爬虫间优先级
  • 每调整一个参数都要重启爬虫
  • IO跟CPU运算绑定,性能不足只能水平扩展
  • 内存占用高

PySpider

​ 来源:pyspider

pyspider架构

优缺点

优点

  • 基于 Tornado,异步高并发
  • 有一个方便脚本编写的WebUI
  • 分布式部署,IO跟CPU密集型组件分离
  • 保存所有历史请求,过期自动重爬
  • 集中管理多爬虫

缺点

  • 难以跟踪爬取进度,只适合广撒网型爬虫
  • 模式固定,难以扩展
  • 调度器为单进程,容易出现瓶颈
  • 存储所有请求,数据库读写容易出现瓶颈
  • 使用数据库做优先级排序与去重,容易出现瓶颈
  • 难以对爬虫做代码版本管理
  • 无法在爬取过程中输出日志,难以统计监控
  • 无法对多爬虫进行优先级调度

Pyspider的优化版本PyspiderX & PyspiderHub

PyspiderX 是 Pyspider的改进版本:

  • 去掉了成功连接的数据库存储,减轻数据库的存储压力
  • 去掉启动时,加载所有历史请求的操作
  • Redis去重
  • 修复其他已知问题
  • 对接PyspiderHub

PyspiderHub 是一个多 Pyspider 集群管理器:

  • 提供一个集中显示所有 Pyspider 集群运行状态的WebUI
  • 提供针对一个 Pyspider 集群中的爬虫优先级调度(通过定时停止和启动爬虫)
  • 自动获取某个节点的负载,以便用户更好的分配资源

工作用的爬虫系统

  1. 结合了多种爬虫框架的优点,dalao牛逼
  2. 过于先进,不便展示

重点

待更新。。