爬虫那些事-网页爬虫设计思路
一、前言
爬虫广泛使用于搜索引擎、新闻聚合以及大数据采集当中,一个良好的爬虫系统需要考虑很多方面:爬虫种子的获取需要有个稳定的任务调度机制,下载页面过程需要考虑到网页内容的生成是否是需要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和手机端。
上面就是整个爬虫系统的设计。。
爬虫那些事-网页爬虫设计思路相关推荐
- python爬虫数据挖掘_Python网页爬虫文本处理科学计算机器学习数据挖掘兵器谱...
转载自"我爱自然语言处理":http://www.52nlp.cn,已获得授权.更多内容可见公众号:"牛衣古柳"(ID:Deserts-X). 周末时看到这篇不 ...
- python爬虫难点_python网页爬虫浅析
Python网页爬虫简介: 有时候我们需要把一个网页的图片copy 下来.通常手工的方式是鼠标右键 save picture as ... python 网页爬虫可以一次性把所有图片copy 下来. ...
- Python爬虫 基于Beautiful Soup的糗事百科爬虫
python爬虫 ---- 糗事百科爬虫 首先进入糗事百科官网首页 -> 糗事百科 本次爬虫的目标是翻页爬取糗事百科的信息,包括 标题, 链接, 作者名, 好笑数&评论数 之后右键检查, ...
- 分析两个网页设计思路
上面两个网页实际设计思路是一样的 这里重点分析顶部部分 顶部的关键词有 背景 logo 标志 文字 文字装饰(分光的分割线) 其他装饰(老鹰 光晕) 也正是这些细节体现了作者的专业之处 对 ...
- 当你想学习爬虫,写个爬虫时,你到底要知道多少东西
当今大数据的时代,网络爬虫已经成为了获取数据的一个重要手段. 但要学习好爬虫并没有那么简单.首先知识点和方向实在是太多了,它关系到了计算机网络.编程基础.前端开发.后端开发.App 开发与逆向.网络安 ...
- python爬虫设计思路_python网络爬虫(9)构建基础爬虫思路
目的意义 基础爬虫分5个模块,使用多个文件相互配合,实现一个相对完善的数据爬取方案,便于以后更完善的爬虫做准备. 这里目的是爬取200条百度百科信息,并生成一个html文件,存储爬取的站点,词条,解释 ...
- 如何设计一个网页爬虫
作为长期深耕在爬虫行业的程序猿来说,对于设计一个网页爬虫想必很简单,下面就是一些有关网页爬虫设计的一些思路,可以过来看一看. 第一步:简述用例与约束条件 把所有需要的东西聚集在一起,审视问题.不停的提 ...
- LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
目录 1114. 按序打印 解法 1115. 交替打印FooBar 解法 1116. 打印零与奇偶数 解法 1117. H2O 生成 解法 1118. 设计有限阻塞队列 解法 1195. 交替打印字符 ...
- python爬虫获取的网页数据为什么要加[0-python3爬虫爬取网页思路及常见问题(原创)...
学习爬虫有一段时间了,对遇到的一些问题进行一下总结. 爬虫流程可大致分为:请求网页(request),获取响应(response),解析(parse),保存(save). 下面分别说下这几个过程中可以 ...
最新文章
- JPA(七):映射关联关系------映射双向多对一的关联关系
- 如何进行高效的时间管理?
- python类的私有属性_Python 的私有属性和‘受保护的’属性
- 王洪超:WPF催熟整个软件生态链
- 白白浪费了这满园春色
- sdut 2153:Clockwise(第一届山东省省赛原题,计算几何+DP)
- Tableau系列之与R语言结合
- eclipse中查看android源码
- 005 form组件---基本使用.
- linux收缩java位置,找到linux中当前java的安装位置
- Python实现一个数组除以一个数
- .NetCore+WebUploader实现大文件分片上传
- threejs引擎中 环境光线与管道流动
- 怎么抽象mysql数据库_一个用于mysql的数据库抽象层函数库
- Oracle 数据库实例介绍
- 【PSO三维路径规划】基于matlab球面矢量粒子群算法无人机三维路径规划【含Matlab源码 1682期】
- 论文阅读:Reasoning about Object Affordances in a Knowledge Base Representation
- C——识别键盘按下模拟键盘按下
- java——Random种子
- key 、primary key 、unique key 与index区别