分布式爬虫设计
2017-05-18 23:49:39 0 举报
基于客户端服务端的简单爬虫架构设计,服务端进行任务规则的调度,客户端进行任务网站的爬取
作者其他创作
大纲/内容
发送规则爬取完成指令FINISHED
队列中是否有规则
插入List
是否有下一页
CRAWLING
根据几条规则启动几个线程处理,每个线程按各自规则爬取网站
返回爬虫规则到客户端
接收到数据,存入mysql数据库T_BASE_CRAWLER_CONTENT表,更新T_BASE_CRAWLER_CLIENT,insertnum,scannum
服务端
服务端 开始
根据ruleid设置T_BASE_CLIENT表STATUS=1(规则爬取状态改为爬取中),clienthost更新为当前客户端,若没有,则新增CLIENT表记录
发送爬取到的数据到服务器,指令ADDING
每1分钟
否,继续爬取下一个详情页
是
客户端连接断开
同步爬虫规则到redis队列(list,只存储ruleid)获取mysql规则方式:根据ISSYNC=0STATUS=1order by save_time获取添加的和更改的爬虫规则(新增和修改爬虫规则表时,定时重爬时设置ISSYNC=0)
客户端1
WAITING,则过10s再次请求
FINISHED
再同步爬虫规则
有规则,则返回规则爬取指令,没有,则返回等待指令
把详情页url写入redis的去重list中,成功进行下一步操作根据规则爬取详情页内容,插入List中
根据pop出的ruleid获取redis hash中的规则详情
获取规则 指令GET_RULE
爬虫规则维护线程
有
此详情页是最后一条
ADDING
hash,规则详情表,ruleid-field-value
启动线程
循环时间
同步T_BASE_CRAWLER_CONTENT中的URLMD5到redis中,使用set
把规则最近爬取时间在5小时之前的规则对应的ISSYNC置0(规则最近爬取时间为T_BASE_CLIENT表SAVETIME),重新爬取
等待客户端连接
根据要获取的规则数,在redis规则队列中pop出几条规则
是否需要?还是获取规则时直接从mysql取需要的规则数据存入redis,hash中key-filed-valuekey:rule[id]filed:字段名value:值不要了
set,存放URLMD5集合,用来去重
每5小时
删除redis中client对应规则记录把对应规则重新push到redis list队列中
否
列表页获取所有详情url
指令
不处理此url
是,把扫描条数和List发送给服务端,List清空,扫描条数归0
读取redis判断是否重复
Redis4种存储方式
爬取指令 CRAWLING等待指令 WAITING
list,规则ID队列,存放ruleid
获取下一页url
没有,则返回客户端抓取完成指令 FINISHED
提取每一个详情页进行判断,扫描条数++
没有
收藏
0 条评论
下一页