swoole_process 多进程爬虫url去重和数据存储问题

等风来___ 发布于 2017/11/10 15:27
阅读 1K+
收藏 0

用swoole_process创建主进程,然后再开启多个子进程,从主进程首次爬取主页面,把爬取到的url过滤后平均分发给多个子进程,每个子进程去爬取收到的url,进程间数据共享用的是redis队列,从url爬取到数据后先经过过滤,过滤完成以后再考虑保存到数据库,同时新的url地址保存到redis队列,等待进程空闲,再pop出来分发任务给子进程。

现在有两个问题:

1、现在有个问题,进程之间是互不干涉的,可能存在A,B两个进程同时拿到了从“相同的url”爬取到的数据,判断是否存在于bloomFilter里面,同时得到的判断是不存在,那么就会出现重复数据。

后来改成数据归总,当这次所有的子进程的任务都爬取完成,先把数据归总在一起,由主进程去统一过滤筛选,这样就不会出现重复的问题,但是效率就低了。

2、数据往数据库存储的问题,如果是在主或子进程里保存,数据量大的情况下会影响到爬取的效率,或者是单独开几个用于存数据的进程。

想问问各位大佬,这两个问题是怎么处理的。

 

加载中
0
一箭落旄头

进程锁 ,我是在读取到某个url的时候,就锁定这个url ,其他进程在读取到相同的url时候就会跳过去,这样就不会出现重复的url了。我觉得进程不会出现百分之百的同步,肯定会有时间间隔的。 我对底层不了解 ,应该是这样吧。反正我用swoole 多线程爬虫这样用的。

等风来___
好的,我研究研究看看,现在是单独拉个俩进程专门做存储的。
0
bo-少
bo-少

可是试试mysql的排它锁

等风来___
我先不考虑这个。先看看从程序上找解决办吧。
0
不哭泣的阿木木
不哭泣的阿木木

mysql 唯一 索引,重复的 写不进去

0
梅开源
梅开源

进程之间当然可以通讯,不会管道消息什么的,可以通过redis或数据库来记录待查询目标

爬虫首先应该有个爬虫去爬出路径,其他进程或其他服务器根据路径再获取目标内容

返回顶部
顶部