网站首页 > 精选教程 正文
前言:
之前写过一个分布式爬虫服务, 虽然定位在日爬取页面百万级, 规模和难度并不大, 但对于很多资讯收集站点而言, 有个这个爬虫系统后, 可以说是如虎添翼. 这也是我所认可的这个服务的价值所在.
本文将讲述下, 我这个分布式爬虫服务的架构,以及如何工作, 写得简陋, 权当抛砖引玉耳.
概念之争:
首先谈下, 框架Vs服务, 这两者的区别. 因为之前也有人问我, scrapy爬虫框架和我的服务有什么区别? 我是不是重复造了轮子? 下面先简答解答一下.
框架:抽象了网页爬取和网页信息提取, 大大简化了程序员的编写难度, 但是另一方面, 它是单机的, 框架离分布式, 集群化管理还有一定的距离.
服务:面向的是普通运营人员(非程序员), 只要编写简单的规则, 即可定义一个爬虫任务, 由架构决定, 其是分布式管理.
由此可见, 以汽车为例, 框架相当于汽车零件, 需要专业的技术人员才能打理, 而服务则是整车, 只需有驾照, 就能行驶.
应用场景:
有很多资讯站点, 其文章来源于各大平台, 和各类有特色的先站点. 如果站点运营人员手动去收集, 费时费力, 效果也不见得佳. 一来站点来源多, 二来手动收集文章效率低.
针对这种情况, 爬虫服务就应运而生. 当然由于信息采集, 是基于模板, 而各个来源网站模本不一. 因此通用爬虫的思路, 必然走不通.
因此定制爬虫的思路, 就浮上水面, 另一方面, 抽象爬虫的规则, 使得运营人员绕开代码编写.
思路:
由于是面向资讯站点(博客, 新闻等), 单个网站(板块)其页面模板是相对固定的, 而且有规律可循.
我们简单的把网站页面, 分为两大类, 1. 导航型页面, 2. 内容型页面.
导航型页面, 主要提取文章链接, 而页面型内容, 就是所谓的文章页.
通过对url规则进行提取, 依据正则表达式, 还是能区分这两类页面的.
内容提取时, 则依据页面模板, 圈定正文, 标题, 时间等信息. 技术的方案选择, 相对比较容易, 无论是jsoup, 还是xpath, 都是大利器.
基础架构:
webapp用于爬虫规则管理(增删改查), 和爬虫进度和调度的查看.
调度节点, 则用于分配爬虫任务.
爬虫节点, 具体执行爬虫任务的节点.
kafka(开源), 分布式队列服务, 用于存放爬取到的网页信息, 借助topic订阅模式, 方便系统耦合.
如何工作:
爬虫节点, 从调度节点中获取爬虫任务, 然后就单点执行该爬虫任务. 一个爬虫节点, 可以设定多个爬虫任务, 其内部采用java并发的ScheduleExecutorService, 设定有限的线程池,按时间事件驱动来运行, 因此爬虫节点的负载和爬虫任务的个数, 并非成正比.
调度任务是, 是排他性的, 任务只允许一个爬虫节点执行. 其采用mysql的for update的锁机制, 来实现任务竞争和锁定的.
爬取频率控制, 每个站点, 基本上每隔一段时间才爬取一次页面.
当前不足:
当然该爬虫服务, 也有相当的不足.
1. 缺少failover机制, 当爬虫节点宕机时, 爬虫任务就不能恢复了, 从而导致当天的数据丢失.
2. 缺少ip地址池, 很容易被网站管理人员加入黑名单.
3. 对于特大站点, 并不适用, 因为限制了爬虫频率.
总结:
就资讯类聚合站点而言, 该爬虫服务, 显然是一大帮助. 它可以设定管理多个爬虫规则, 另一方面, 规则任务可以获取页面数也相当可观.
同时引入topic的概念, 方便服务对网页数据做分类处理.
架构这东西, 没有完美的, 只是合适自己的, 对于该爬虫服务的架构设计, 以及使用场景的认知, 我个人还是相当的满意.
猜你喜欢
- 2025-03-28 Python入门系列20-Python内置数据结构之字典
- 2025-03-28 从0教你用Python写网络爬虫,内容详细代码清晰,适合入门学习
- 2025-03-28 静态网页爬虫①(静态网页爬取实验报告)
- 2025-03-28 大数据采集系统架构方案(大数据平台数据采集系统)
- 2025-03-28 LPL比赛数据可视化,完成这个项目,用尽了我的所有Python知识
- 2025-03-28 网络爬虫开源框架(爬虫框架scrapy)
- 2025-03-28 python爬虫常用工具库总结(python爬虫工具下载)
- 2025-03-28 教您使用DynamicGecco抓取JD全部商品信息
- 2025-03-28 大数据公司发家第一步的爬虫技术,今天就来调试个开源爬虫项目
- 2025-03-28 「爬虫教程」第一章:python爬虫基础教程
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)