分布式爬虫 c# 应该如何实现

zhouyekun 2016-10-12 11:50:38
现在是这样的场景
我有10台电脑
但是现在 我的很多操作一台电脑是完成不了的 爬虫 数据分析等等
我想把这些一个大的操作分解成很多小任务
发送给其他10电脑 由他们去计算
然后把抓的结果或者计算结果发送回来
然后我这台电脑汇总 这件事情就算完成了
这样的一个逻辑 应该怎么样实现比较好 ?
...全文
576 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2016-10-18
  • 打赏
  • 举报
回复
首先将任务汇总做什么,分列,然后,每台客户机都跑一样的程序来做要做的事情.,完成任务以后把执行结果返回到主服务器。具体做法
以抓取某商城数据为例。
1.主机将负责读取的商品类别链接
2.从机从主机获取链接
3.在从机执行本地程序去每个页面抓取数据,将本类商品数据全部读取完毕以后,上传到主机。
第一步到第二步的过程可以通过wcf或者webservice来做,第三部可以通过消息队列来做(主要用在主机获取到从机数据后的数据处理)
我叫小菜菜 2016-10-13
  • 打赏
  • 举报
回复
引用 9 楼 zhouyekun 的回复:
问题是 你们只看到了抓取这个模块 还有频率分析 分析比较麻烦 有很多中间变量 和参数 用数据库很麻烦 而且没必要
连数据库都“没必要”,那数据仓库更不用提了,你还想做什么频率分析?请问你想“分析”的数据从哪来,别告诉我是保存在磁盘文件里面。 再说说模块问题,抓取模块和分析模块是独立的,这取决于你的业务逻辑。 根据业务场景的复杂程度,从低到高一般是:简单变量→磁盘文件→关系型数据库(大量数据)→非关系型数据库(海量数据)。 还是先回去翻翻楼层,先弄透想干嘛再提数据分析吧。
zhouyekun 2016-10-13
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
以数据库做数据载体 程序从数据库获取待爬取的 url,并将爬取的结果放回数据库,仅此而已 不说十台,就是 100 台也都一样 所以不要想的他复杂了
引用 4 楼 xuzuning 的回复:
数据分析也是建立在已有数据的基础上的,而已有数据都保存于数据库中 这跟业务越来越复杂有什么关系? 业务再复杂,也不可能用未来数据做计算的依据
按照你这种方式 我没办法解决需求...我现在是想用分布式来解决现在的瓶颈 .... 现在的数据量很大了 十几个G的数据. 要是
引用 8 楼 zhi_ai_yaya 的回复:
[quote=引用 1 楼 xuzuning 的回复:] 以数据库做数据载体 程序从数据库获取待爬取的 url,并将爬取的结果放回数据库,仅此而已 不说十台,就是 100 台也都一样 所以不要想的他复杂了
正解。 其实就是 1任务分解→2任务分派→3汇总结果。 按照这3个基本步骤设计就行了。 1.任务分解:最简单的就是数据库的行,或者任务队列的元素,都是单个任务。 2.任务分派:不就是互斥获取任务嘛,大家读取不同的任务即可。 3.结果汇总:就是合并结果集,没什么好说的。[/quote] 问题是 你们只看到了抓取这个模块 还有频率分析 分析比较麻烦 有很多中间变量 和参数 用数据库很麻烦 而且没必要
  • 打赏
  • 举报
回复
简单来说,假设你在“拉萨”的某台服务器当作 Master,你可以让你上海的4台公网服务器、乌鲁木齐的6台公网服务器、成都的20台局域网内pc 机动态地注册为 worker。 然后,你可以使用任意一个 client,通过某个worker 发送任务给 master,然后 master 调度所有的属于你自己的机器(不管是公网的,还是私网的),完成这些任务,然后将执行结果返回给最终的 client。 一个分布式调度系统,自己用 c# 语言写,可能100行代码足以。关键是要了解 api 设计。
  • 打赏
  • 举报
回复
你可以仿照 German 的协议来设计 --> 你可以仿照 Gearman 的协议来设计 以 api 为核心,搞懂其原理。Gearman 是一个原型。
xuzuning 2016-10-12
  • 打赏
  • 举报
回复
数据分析也是建立在已有数据的基础上的,而已有数据都保存于数据库中 这跟业务越来越复杂有什么关系? 业务再复杂,也不可能用未来数据做计算的依据
  • 打赏
  • 举报
回复
分布式调度最起码要有几个 api 功能,你可以仿照 German 的协议来设计。
zhouyekun 2016-10-12
  • 打赏
  • 举报
回复
之前没有数据分析 的时候这样子是可以的 但是后面业务越来越复杂 有一些需要数据分析的业务 而且逻辑也越来越复杂 就适应不了了
xuzuning 2016-10-12
  • 打赏
  • 举报
回复
以数据库做数据载体 程序从数据库获取待爬取的 url,并将爬取的结果放回数据库,仅此而已 不说十台,就是 100 台也都一样 所以不要想的他复杂了
我叫小菜菜 2016-10-12
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
以数据库做数据载体 程序从数据库获取待爬取的 url,并将爬取的结果放回数据库,仅此而已 不说十台,就是 100 台也都一样 所以不要想的他复杂了
正解。 其实就是 1任务分解→2任务分派→3汇总结果。 按照这3个基本步骤设计就行了。 1.任务分解:最简单的就是数据库的行,或者任务队列的元素,都是单个任务。 2.任务分派:不就是互斥获取任务嘛,大家读取不同的任务即可。 3.结果汇总:就是合并结果集,没什么好说的。
  • 打赏
  • 举报
回复
分布式系统是“不落地”的,也就是说,它起码是一个网络服务系统而展示出来的。至于它用不用到数据库,那是它自己的事情。 它起码要完成这样几个功能: 1. 可以动态注册 Worker 主机。 2. 在任意个 Worker 故障时,系统不会垮掉。 3. 每一个任务都可以根据“Worker 上面有没有相关服务、相关机器的资源是否足够”等动态探测信息,来调度任务。 4. Worker 执行结果最终会返回给 client。 5. 可以制定最多一台机器,也可以指定所有机器来执行任务。 6. 高效率的通讯机制。 7. 不丢任务,任务可以自动重启。 8 .................................. 一个公司有许多台空闲的电脑。为什么不可以把这些机器利用起来,开发几个分布式的服务放到互联网上呢?比如说统计服务,就完全没有必要占用主营业务服务器。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧