一、前言

爬虫广泛使用于搜索引擎、新闻聚合以及大数据采集当中,一个良好的爬虫系统需要考虑很多方面:爬虫种子的获取需要有个稳定的任务调度机制,下载页面过程需要考虑到网页内容的生成是否是需要js渲染,请求网页是否需要设置请求头,还有请求过多会不会被对方封锁。另外就是数据处理过程,什么页面需要进行数据提取,什么页面是分裂成其它页面,还有页面内容提取需要采用什么手段:比如css selector解析,xpath解析,还有许多内容是通过json格式返回 需要解析json,还有的内容是属于xml,这就需要你都还有当获取到结果之后需要对结果进行整理、规范化和持久化。

二、设计思路

图2-1 设计思路

因为工作当中主要是对新闻内容进行抓取,所以结合新闻资讯进行处理。如图2-1所示,一个典型的新闻网站会分两个页面进行展示,一个是列表页一个是详情页,我们要从列表页进行处理分裂出详情页,然后下载详情页进行处理提取里面的详情页。最后对提取的结果进行处理,处理的结果后面可以接入其它流程如更进一步的清洗等,最后经过持久化的内容最终可以通过业务流程处理出去。当一个业务流程抓住输入输出,然后结构化和剖析这个流程后,就会知道怎么进行设计了。

三、爬虫系统架构图

图3-1 技术架构

相信接触过scrapy及其它第三方开源抓取工具应该对上面的图不会陌生,系统也是参考java一个比较出名的框架webmagic进程处理的,基于组件化进行开发:

爬虫系统通过scheduler获取待抓取任务,系统需要考虑到多种可调度的方式,这就需要设计一种可以通过配置选择不同调度模块的功能,比如来自redis的任务调度、来自MQ的任务,也可能来自文件和数据库的调度。另外从页面解析的request同样也需要丢到scheduler进行调度。

Downloader下载器,下载网页详情有多种java中api提供java.net.URL、java.net.URLConnection 以及HttpClient进行下载,然后还有诸如Https的处理等。

PageProcess页面处理器,通常情况下锁抽取的内容就需要在这边进行处理,同时可以分裂出新的链接,解析HTML可以自己定制使用JSOUP,XPATH以及json 、xml解析。

Pipeline负责抽取结果的处理,包括计算、持久化到文件、数据库等

四、整体的技术实现

图3-2

如上图所示

任务调度

数据源种子存储在DB中,然后全部加载到redis缓存,爬虫系统基于redis做调度。调度程序和爬虫主程序采用RabbitMQ(zeroMq,kafuka也可以)做解耦。

这块调度只需要采用单机去完成,主要是完成的功能比较单一,只需要调度待爬取的URL即好,如果采取分布式集群架构提高可用性,就需要解决数据一致性和数据同步问题,反而会导致系统的整体处理能力下降,爬虫调度如果宕机不影响业务,直接重启就好了。

去重处理

爬虫的去重主要包含两个方面,一个是URL去重,保障相同的URL不再重复下载;另外一个内容去重,相同页面的内容不再重复存储。去重一方面能够提高爬虫的抓取效率,避免重复抓取无效的数据,另外一方面能够提高内容的质量,保障内容展示或者搜索结果展示时不存在重复的数据。

  • URL去重简单的实现是可以采用O(1)时间复杂度的HASH算法,具体可以把已经爬取过的数据缓存在分布式缓存如Redis中,不过这种方实现比较简单但是的会占用大量的Redis空间,URL量比较小可以采用,如果URL量比较大那就需要采取布隆过滤器去提高效率。
  • 内容去重,常用的是计算整个页面的MD5,通过判断是否有相同的网页,事实上许多网页都会进行调整,所以不能把整个页面去进行比较,而是需要将HTML里面的有效内容提取出来,去除掉html标签,针对有效的内容进行比较,还有就是从有效内容中抽取一两段话进行,进行MD5计算进行比较,同样的用布隆过滤器去代替Hash表进行优化。

网页内容多种多样可以用MongoDB 这种NoSql数据库做存储。利用其文档存储以及key 、value的优势进行非结构化的持久化,最后抓取的数据可以进一步推送到清洗程序中处理。然后处理后的数据最后存到关系型数据库Mysql中,然后通过业务逻辑处理展示到PC和手机端。

上面就是整个爬虫系统的设计。。

爬虫那些事-网页爬虫设计思路相关推荐

  1. python爬虫数据挖掘_Python网页爬虫文本处理科学计算机器学习数据挖掘兵器谱...

    转载自"我爱自然语言处理":http://www.52nlp.cn,已获得授权.更多内容可见公众号:"牛衣古柳"(ID:Deserts-X). 周末时看到这篇不 ...

  2. python爬虫难点_python网页爬虫浅析

    Python网页爬虫简介: 有时候我们需要把一个网页的图片copy 下来.通常手工的方式是鼠标右键 save picture as ... python 网页爬虫可以一次性把所有图片copy 下来. ...

  3. Python爬虫 基于Beautiful Soup的糗事百科爬虫

    python爬虫 ---- 糗事百科爬虫 首先进入糗事百科官网首页 -> 糗事百科 本次爬虫的目标是翻页爬取糗事百科的信息,包括 标题, 链接, 作者名, 好笑数&评论数 之后右键检查, ...

  4. 分析两个网页设计思路

    上面两个网页实际设计思路是一样的 这里重点分析顶部部分 顶部的关键词有 背景 logo 标志  文字  文字装饰(分光的分割线) 其他装饰(老鹰  光晕)  也正是这些细节体现了作者的专业之处   对 ...

  5. 当你想学习爬虫,写个爬虫时,你到底要知道多少东西

    当今大数据的时代,网络爬虫已经成为了获取数据的一个重要手段. 但要学习好爬虫并没有那么简单.首先知识点和方向实在是太多了,它关系到了计算机网络.编程基础.前端开发.后端开发.App 开发与逆向.网络安 ...

  6. python爬虫设计思路_python网络爬虫(9)构建基础爬虫思路

    目的意义 基础爬虫分5个模块,使用多个文件相互配合,实现一个相对完善的数据爬取方案,便于以后更完善的爬虫做准备. 这里目的是爬取200条百度百科信息,并生成一个html文件,存储爬取的站点,词条,解释 ...

  7. 如何设计一个网页爬虫

    作为长期深耕在爬虫行业的程序猿来说,对于设计一个网页爬虫想必很简单,下面就是一些有关网页爬虫设计的一些思路,可以过来看一看. 第一步:简述用例与约束条件 把所有需要的东西聚集在一起,审视问题.不停的提 ...

  8. LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口

    目录 1114. 按序打印 解法 1115. 交替打印FooBar 解法 1116. 打印零与奇偶数 解法 1117. H2O 生成 解法 1118. 设计有限阻塞队列 解法 1195. 交替打印字符 ...

  9. python爬虫获取的网页数据为什么要加[0-python3爬虫爬取网页思路及常见问题(原创)...

    学习爬虫有一段时间了,对遇到的一些问题进行一下总结. 爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save). 下面分别说下这几个过程中可以 ...

最新文章

  1. JPA(七):映射关联关系------映射双向多对一的关联关系
  2. 如何进行高效的时间管理?
  3. python类的私有属性_Python 的私有属性和‘受保护的’属性
  4. 王洪超:WPF催熟整个软件生态链
  5. 白白浪费了这满园春色
  6. sdut 2153:Clockwise(第一届山东省省赛原题,计算几何+DP)
  7. Tableau系列之与R语言结合
  8. eclipse中查看android源码
  9. 005 form组件---基本使用.
  10. linux收缩java位置,找到linux中当前java的安装位置
  11. Python实现一个数组除以一个数
  12. .NetCore+WebUploader实现大文件分片上传
  13. threejs引擎中 环境光线与管道流动
  14. 怎么抽象mysql数据库_一个用于mysql的数据库抽象层函数库
  15. Oracle 数据库实例介绍
  16. 【PSO三维路径规划】基于matlab球面矢量粒子群算法无人机三维路径规划【含Matlab源码 1682期】
  17. 论文阅读:Reasoning about Object Affordances in a Knowledge Base Representation
  18. C——识别键盘按下模拟键盘按下
  19. java——Random种子
  20. key 、primary key 、unique key 与index区别

热门文章

  1. 黑马程序员匠心之作|C++教程从0到1入门编程(基础)
  2. 最新软件云测试方法你知道多少?有什么好处
  3. 尚硅谷Java、HTML5前端、全栈式开发视频
  4. iOS 改变图片颜色
  5. 超全软件下载网站和网页(一网一匠)
  6. pikachu通关教程
  7. 分区空间分配:window10怎样把C盘空间分一点给D盘?
  8. Mybatis狂神说完整笔记
  9. python+selenium自动化脚本例子
  10. 【2018,中国智能+】新智元10万+热文排行,AI爆发没有看客