分布式爬虫设计和实现

1.总体设计

功能模块划分:

数据抓取引擎

1.1 调研市面上爬虫框架或库

pholcus

colly

gocrawl

开发工具:goland

开发语言:golang

数据存储:ElasticSearch

前端展示:使用Go语言标准模板库实现http的数据显示部分

爬取内容:相亲类网站的数据

爬虫算法:城市列表 --城市--用户信息,从种子页面开始爬取页面

爬虫的实现步骤:单机版 -- 并发版--分布式版

难点:动态页面内容解析,模拟登录,突破反爬机制

一、单机版步骤

1.获取初始页面的内容

2.提取页面内容关键信息(本项目采用正则表达式)

css选择器

xpath

正则表达式

3.提取城市和url链接,将城市打印

4.整体架构

通过分析,针对城市列表,城市,用户,我们分别抽象出对应的解析器

内容 对应解析器
城市列表 城市列表解析器

--城市列表解析器

城市--城市解析器

用户--用户解析器

解析器Parser定义

输入:utf-8编码格式的文本

输出:Request{URL,对应的Parser}列表,Item列表

Engine引擎

城市列表解析器

城市解析器

用户信息解析器

二、并发版爬虫架构

并发版的爬虫

介绍一下Scheduler调度模块,负责将任务队列中的众多Request请求分配个不同的Worker来解析

不同模块之间的数据传输采用的是Channel通道,并发版的实现在于Scheduler调度器的实现

1.将Fetcher模块和Parser模块整合成Worker模块,然后针对每个Worker创建一个go协程,提高开发效率

2.当把种子url传递给Engine引擎后,会解析出更多的requests,

3.Scheduler调度模块负责将任务队列中的多个Request请求,分发给后端的Worker来解析,

4.Worker解析出来的Item结果再回传给Engine引擎

5.Engine引擎将解析结果Item进行保存,暂时只是打印了item数据

期间遇到了两个问题

channel死等待:最后看这个问题

Fetcher模块被卡住:可能是网站服务器针对爬虫做了连接限速策略,在Fetcher模块拉取网页数据时,可采用设置User-Agent和ratelimit的方式

三、并发版爬虫的队列版本(Work队列和Request队列)

每个Worker对应创建一个Worker队列,并反向注册到Scheduler调度模块中,

Scheduler调度模块在收到Request请求以后投递到Request队列中

Scheduler调度模块在收到WorkerReady完成通知时,会将其投递到Worker队列中

当Request队列和Worker队列中都有元素时,进行如下操作

1.从Requests队列中获取头部的request请求

2.从Worker队列中获取worker对应的channel通道(或称队列)

3.将request请求投递到worker对应的channel通道中,worker就能处理了。

四、数据存储和展示

项目进行到现在,爬虫系统能够解析珍爱网的数据了,我们需要把解析到的数据存储起来

Elastic search 全文搜索引擎 介绍

快速的存储,搜索,分析海量数据

用户:维基百科,github,stack overflow

Elastic Search 能做什么?

1.存储我们爬取的数据

2.无需建表,配置字段

3.json格式的文档

4.全文搜索

寻找:男,有房,有车

寻找:女,年轻漂亮-》身材好-》身材指标好,三维,体重,身高,哈哈

原声支持,不需要写代码,不需要拼接查询语句

go操作Elastic Search

使用的elastic第三方库

https://github.com/olivere/elastic

写程序要的就是持续优化代码,每隔一段时间就自己找下程序的毛病,看看还有那些地方可以进行优化的。

五、分布式爬虫

分布式系统

多个节点、消息传递、完成特定需求

节点具有私有存储,易于开发

消息传递:REST,RPC,中间件(消息队列)

一般来说

对外:REST

模块内部:RPC 主流的有三种jsonrpc grpc thrift

模块之间:中间件

自有协议 docker/libchan

NATS streaming

gocricuit

根据自己需求

分布式网页爬虫系统 设计和实现相关推荐

  1. 分布式多爬虫系统——架构设计

    前言: 在爬虫的开发过程中,有些业务场景需要同时抓取几百个甚至上千个网站,此时就需要一个支持多爬虫的框架.在设计时应该要注意以下几点: 代码复用,功能模块化.如果针对每个网站都写一个完整的爬虫,那其中 ...

  2. 网页爬虫的设计与实现(Java版)

    最近为了练手而且对网页爬虫也挺感兴趣,决定自己写一个网页爬虫程序. 首先看看爬虫都应该有哪些功能. 内容来自(http://www.ibm.com/developerworks/cn/java/j-l ...

  3. 分布式爬虫系统的设计与实现(SourceForge.net数据爬取)

    目录 本科生毕业论文(设计)中文摘要 I 本科生毕业论文(设计)英文摘要 II 目录 I 图目录 III 表目录 IV 第一章 引言 1 1.1 研究背景 1 1.1.1 SourceForge.ne ...

  4. 如何设计一个复杂的分布式爬虫系统?

    一个复杂的分布式爬虫系统由很多的模块组成,每个模块是一个独立的服务(SOA架构),所有的服务都注册到Zookeeper来统一管理和便于线上扩展.模块之间通过thrift(或是protobuf,或是so ...

  5. 手把手教你搭建一个基于Java的分布式爬虫系统

    http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...

  6. 基于SpringBoot和Vue的分布式爬虫系统(JavaWeb)

    前言 本期案例分享,学长给大家上点干货,手把手带你开发一个分布式爬虫系统.通过这个项目,你将学习到下面几点: 架构设计.如果设计一个通用的爬虫系统?一个系统支持爬取所有的网站. 分布式开发经验.分布式 ...

  7. 爬虫那些事-网页爬虫设计思路

    一.前言 爬虫广泛使用于搜索引擎.新闻聚合以及大数据采集当中,一个良好的爬虫系统需要考虑很多方面:爬虫种子的获取需要有个稳定的任务调度机制,下载页面过程需要考虑到网页内容的生成是否是需要js渲染,请求 ...

  8. 设计 一个高性能爬虫系统

    资料来源 http://www.xuebuyuan.com/1296711.html 开源中国 http://my.oschina.net/eshijia/blog/136595 最近看了一篇来自纽约 ...

  9. 【爬虫】一种基于网页相似度去重的爬虫系统

    现有的技术方案: 为解决网页重复抓取的问题,现有的爬虫系统主要是以URL的维度来进行去重.简单的,直接将URL放入数据库中或者放入Redis的Set集合进行去重,复杂一些的,会综合参数名的构成和参数值 ...

最新文章

  1. 【linux】在CentOS7上更改端口号时报错:Job for sshd.service failed because the control process exited with error
  2. Serial Communications in Win32
  3. 区块链软件公司:区块链运用在金融上运用的优点有哪些?
  4. ALI的Tensorflow炼成与GAN科普
  5. 聊透分布式系统一致性
  6. internetreadfile读取数据长度为0_YOLOV3的TensorFlow2.0实现,支持在自己的数据集上训练...
  7. 3A公司年薪30万建模师总结:怎么做才能学好3D建模?
  8. 做人要无需,做事要务实!
  9. [BZOJ4521][Cqoi2016]手机号码 (数位dp)
  10. 随想录(搭建自己嵌入式项目的编译系统)
  11. 【IT项目管理】第8章 习题
  12. Java中通过流下载文件
  13. 人工智能各层思维导图
  14. java 斜杠常量_Java基础之常量
  15. vue cli4接入环信webIM
  16. java统计误码率_MATLAB通信工具箱来计算误码率
  17. python unpacking_Python函数调用时unpacking参数特性
  18. Linux 命令详解之df命令
  19. 什么是jQuery,jQuery的特点。
  20. Ubuntu20.04安装visit可视化软件

热门文章

  1. java并发编程艺术——基础篇
  2. 面向服务与微服务架构
  3. 微信小程序 报错errcode: 40029, errmsg: “invalid code
  4. h5活动是什么意思_h5是什么(H5和Html5是一个东西吗)
  5. hangfire的使用
  6. Hangfire 使用笔记
  7. 事件监听 ActionListener
  8. Mac下安装Homebrew
  9. StringBuffer 拼接字符串时,删除最后一个逗号
  10. html输入时提示文字消失,html中input文字框,初始里边有文字提示。当点选时,文字消失,怎么改?...