文档章节

使用webmagic构建一个分布式的爬虫

黄亿华
 黄亿华
发布于 2013/07/25 08:24
字数 179
阅读 8436
收藏 17

之前说过,使用webmagic的架构,很容易就可以通过扩展Scheduler构建一个分布式的爬虫。 参考淘宝官方博客的文章快速构建实时抓取集群,构建了一个基于redis的分布式爬虫实现,代码如下:

<!-- lang: java -->
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);
    }
}

© 著作权归作者所有

黄亿华

黄亿华

粉丝 2445
博文 131
码字总数 116344
作品 7
程序员
私信 提问
加载中

评论(10)

乐娃子
乐娃子
直接用kafka是不也行。
司马长风kill
司马长风kill
黄老师,最近拜读了您的webmagic,分布式那个没有太搞懂,
是不是就是对URL用redis进行了管理
如果我要爬取各种不同的新闻,论坛,博客等, 那么这个还试用么。
个人感觉这个怎么跟理解的分布式有点出入
司马长风kill
司马长风kill
QH_C
QH_C
具体调用方法:
Spider ocSpider=Spider.create(new GithubPageProcessor()).addUrl("https://github.com/code4craft").setScheduler(new RedisScheduler("localhost")).setDownloader(new HttpClientDownloader()).addPipeline(new ConsolePipelinep());
SpiderMonitor.instance().register(ocSpider);
ocSpider.start();
QH_C
QH_C
老师您好,在学习时遇到了如下问题,希望您赐教:不适用分布式可以爬取到数据(使用QueueScheduler),如果使用分布式(使用RedisScheduler)报异常,异常如下:

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: Could not get a resource from the pool
  at redis.clients.util.Pool.getResource(Pool.java:22)
  at us.codecraft.webmagic.scheduler.RedisScheduler.isDuplicate(RedisScheduler.java:49)
  at us.codecraft.webmagic.scheduler.DuplicateRemovedScheduler.push(DuplicateRemovedScheduler.java:34)
  at us.codecraft.webmagic.Spider.setScheduler(Spider.java:198)
  at com.inspur.MonitorExample.main(MonitorExample.java:31)
Caused by: redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
  at redis.clients.jedis.Connection.connect(Connection.java:124)
  at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:54)
  at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1657)
  at redis.clients.jedis.JedisPool$JedisFactory.makeObject(JedisPool.java:63)
  at org.apache.commons
悠悠然然
悠悠然然
上面的质疑是有一定道理的,理论上分布式存在任务分解合并的,而不是几个程序部署在不同的计算机上就可以的。
不过好歹可以一起干活了,已经非常不错了,一般应用足够了。
黄亿华
黄亿华 博主

引用来自“邢哲”的评论

这。。。算分布式爬虫?只是从一个共享的缓存里取出需要爬的url啊。。当然还有把需要爬的存进去

爬虫本身是无状态的,分布式的功能交给了存储。我觉得叫分布式也没问题,跟现在的web应用的模式是类似的。
程序猿_哲
程序猿_哲
这。。。算分布式爬虫?只是从一个共享的缓存里取出需要爬的url啊。。当然还有把需要爬的存进去
黄亿华
黄亿华 博主

引用来自“lidongyang”的评论

这个是不是和单机开发一样,只不过Scheduler使用RedisScheduler,把程序部署到多台机器上,都通过RedisScheduler从redis队列里边读写数据。?

恩,是的,完全可水平扩展的。
charlesl
charlesl
这个是不是和单机开发一样,只不过Scheduler使用RedisScheduler,把程序部署到多台机器上,都通过RedisScheduler从redis队列里边读写数据。?
webmagic 0.2.0 发布,Java垂直爬虫框架

此次更新的主题是"方便"(之前的主题是"灵活")。 增加了webmagic-extension模块。 增加了注解方式支持,可以通过POJO+注解的方式编写一个爬虫,更符合Java开发习惯。以下是抓取oschina博客的完...

黄亿华
2013/08/12
5.1K
22
WebMagic-Avalon之分布式实现方案

WebMagic之前具有基本的分布式功能,可以将一个Spider部署到多台机器上,并通过Redis来管理URL,达到多机合作抓取的目标。 我在WebMagic-Avalon里计划完成一个管理后台,通过这个后台可以新建...

黄亿华
2014/03/12
5K
19
webmagic的设计机制及原理-如何开发一个Java爬虫

此文章是webmagic 0.1.0版的设计手册,后续版本的入门及用户手册请看这里:https://github.com/code4craft/webmagic/blob/master/user-manual.md 之前就有网友在博客里留言,觉得webmagic的实...

黄亿华
2013/07/20
67.8K
94
玩转webmagic代码之Scheduler

webmagic上线之后,因为灵活性很强,得到了一些爬虫老手的欢迎,但是对于新手来说可能稍微摸不着头脑,我的需求是这样子,什么模块化,什么灵活性,但是看了半天,我也不知道怎么解决我的问题...

黄亿华
2013/08/21
13.8K
10
WebMagic使用说明-安装篇

WebMagic使用说明-安装篇 本文是WebMagic文档的一部分。系列文章写完后,会整合到WebMagic新版文档中。 1. 使用WebMagic WebMagic主要包含两个jar包:和。在项目中添加这两个包的依赖,即可使...

黄亿华
2014/04/03
3.3K
13

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
12
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部