之前说过,使用webmagic的架构,很容易就可以通过扩展Scheduler构建一个分布式的爬虫。 参考淘宝官方博客的文章,构建了一个基于redis的分布式爬虫实现,代码如下:
public class RedisScheduler implements Scheduler{ private JedisPool pool; private static final String QUEUE_PREFIX = "queue_"; private static final String SET_PREFIX = "set_"; public RedisScheduler(String host){ pool = new JedisPool(new JedisPoolConfig(), host); } @Override public void push(Request request, Task task) { Jedis jedis = pool.getResource(); //使用SortedSet进行url去重 if (jedis.zrank(SET_PREFIX+task.getUUID(),request.getUrl())==null){ //使用List保存队列 jedis.rpush(QUEUE_PREFIX+task.getUUID(),request.getUrl()); jedis.zadd(SET_PREFIX+task.getUUID(),System.currentTimeMillis(),request.getUrl()); } } @Override public Request poll(Task task) { Jedis jedis = pool.getResource(); String url = jedis.lpop(QUEUE_PREFIX+task.getUUID()); if (url==null) { return null; } return new Request(url); }}