小工具      在线工具  汉语词典  css  js  c++  java

爬虫架构简述

python,爬虫 额外说明

收录于:40天前

项目情况

最近搭建了一个爬虫系统,以scrapy为核心,kafka为队列,然后添加java消费者等外围服务,形成一个结构。这是一个简单的安排

基础结构

考虑到数据的扩展性和互联网的不确认性,考虑使用 nosql来存储大部分业务数据,同时为了更好的处理文字搜索, 于是决定使用elasticsearch + mysql的方式来处理.
然后,我们考虑了底层服务,这涉及到数据获取,解析与内容的保存,这一层的实现逻辑也有很多,经过找网上资料和讨论思考,我们决定采用python爬虫框架.
在这里插入图片描述

引入异步队列

但我们计算到,爬虫的数据量比较大,如果让一个流程同时做 获取,解析,整理,保存,会导致这个流程过长,是一件风险比较大的事,而且,爬虫的网络环境和,整理保存的环境不太一样,耦合到一起不是靠谱的事.所以我们引入了异步结构,使用kafka作为我们的消息队列,接收python来的数据. 同时提供一个消费者对数据进行消费.
在这里插入图片描述

引入定时器

同时,对爬虫获取数据的时机,我们需要有一个爬虫开启的,有两种方案,1让python进程自己定时执行,2,引入外部进程管理. 考虑到内聚原则,我们采用2方案,同时这个外部进程定时器也可以做其它的定时工作,统一管理.
在这里插入图片描述

形成集群

当然,一个进程,尤其是python爬虫,速度太慢(单机网络请求,线程不够等),我们要引入集群.
在这里插入图片描述

爬虫、Kafka、消费者都是各自的集群,节点之间没有直接的联系。其实es和mysql也可以是集群,不影响描述。这里就不做描述了。

最终情况

webapi的进程,涉及到用户, 和部分cms功能,于是也部分功能使用mysql,最后的结构大约如图.
在这里插入图片描述

其它说明

模块说明

图中对redis和logstach和其它一些第三方模块等的描述就没写上去了。
mysql处理如用户,权限,各种配置之类,es主要是存抓取的数据

关于集群

尽管集群在多个地方使用,但它们的机制并不相同。

python爬虫集群将请求保存在redis中,redis是由scrapyd的一个Web服务提供的。它可以开很多作业,一个作业就是一个进程,所以实际上集群节点不止两个。您可以查看此博客以获取此内容。有关爬虫的文章

Kafka是第三方的,有数据存储。除了维护节点状态之外,还有数据分片和副本。其他文章请自行查看。

消费者是一个Java进程,它的集群非常简单。只需指定 Kafka 的分区即可。您可以使用Kafka客户端来完成此操作,并且没有太多业务逻辑。

关于一些改进的思考

批量处理
数据量大的话,批量是一个值得考虑的地方,且其思路不局限在一个功能点.
比如,消费者->es中,可以保存起来批量入,或者引入logstach来处理。

任务和任务之间的关系
从逻辑层面上,任务之间的先后是个很考究的事情,还有其花费时间会不会对其它任务有干扰。这个要看业务

另一方面,前面任务的处理结果是否是后面数据的输入参数,这种情况下,可以考虑使用redis来实现数据共享。

. . .

相关推荐

额外说明

网关--灰度发布 统一限流 统一熔断 统一降级

  灰度发布  比如一个新应用发布,可以将少量流量打到新的,其他的还是走旧的,当新的没什么问题后,再将流量切过来。或把旧的应该替成新的应用版本。   统一限流 统一限流,在网关层面定义好,比如每秒最多能接收1W 请求,每少超过1W请求就不处理   统一熔

额外说明

A.特定领域知识图谱知识推理方案:知识图谱推理算法综述[二](DTransE/PairRE:基于表示学习的知识图谱链接预测算法)

知识图谱专栏简介:数据增强,智能标注,文本信息抽取(实体关系事件抽取)、知识融合算法方案、知识推理、模型优化、模型压缩技术等 专栏详细介绍:知识图谱专栏简介:数据增强,智能标注,文本信息抽取(实体关系事件抽取)、知识融合算法方案、知识推理、模型优化、模型

额外说明

高等数学之曲率

 a代表改变角度 s代表弧长 圆的曲率              

额外说明

日历组件 el-calendar 实现标记功能

需求:在日历组件中选择月份时,可以显示当月已经质检或需质检的数据 思路:前端每次点击日期选择器的时候调用接口,接口返回当月需要质检或已质检的数据,前端拿到数据就开始做判断然后回显。 大体样式  代码: <!-- 日历组件 --> <div sty

额外说明

Jquery实现表格动态增加一行,删除一行(最简洁的代码实现)

最近做的项目中有一个需求就是要求在线填写表格内容时,不够的话可以动态添加一行,我这里用的jQuery来实现,下面是我项目截图展现: 当点击“添加输入框”按钮时,就会自动添加一行 下面我们来一下代码实现(把实际项目中的HTML代码简化了,其他功能可自己加)

额外说明

左侧悬浮菜单实例代码

function OnMouseOverNav() { document.getElementById("scrollMenu").style.display = "none"; document.getElementById("leftN

额外说明

python面向对象设计

1、类的定义。 class 类名: 属性(成员变量) 函数(成员方法) 2、对象的创建。 对象名=类名() 3、构造函数。 类定义一个特殊的称为__init__()的方法。 称为构造函数,以两个下划线开头和结束。 运行结果如下: 4、析构函数。 del(

额外说明

Java——JComboBox下拉列表框与选中状态改变的监听

┏(ω)=☞ 本专栏的目录(为您提供更好的查询方式)(点这里说不定有你想要的) 设置下拉列表框大小以及位置,为下拉列表框添加选项,将下拉列表框加入到JFrame窗口,返回当前所选项,添加选中状态改变的监听器 import javax.swing.*; i

额外说明

【GoWeb项目-个人Blog】数据库表设计

项目地址:https://gitee.com/illlloooovvvvcode/daily-blog 主要任务:数据库表设计 数据库表设计 1. ER图 目前,主体上只有四个模块,设计五张表 posts 文章表 tags 标签表 post_tags 文

额外说明

【Java 基础】类和对象 & 方法重载详解

《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 订阅专栏后添加我微信或者进交流群,进群可找我领取 前端/Ja

ads via 小工具