前言
使用之前单应用的队列仓库存储抓取的url存在以下两个弊端:
- 单应用时候,加入服务宕机了,则单应用中的队列仓库里面的url就会为空,则此时就会从页面的首页重新抓取
- 在加快爬虫抓取速度时候,我们有时候需要部署多节点,实现多节点抓取,加快抓取速度,但是多节点抓取同一个页面时候,怎样保证哪些url已经抓取了,而不需要再次抓取了,此时如果是单应用队列仓库将会不能区分
- 使用redis创建的url仓库(公共的仓库) 恰好解决了这个问题
- 多节点可以实现负载均衡,可以保证服务稳定性(其中一个挂掉了,不会对其他有啥影响)
内容
我们本节实现以下功能:Redis实现高低优先级队列
1.集成redis
1.1 maven依赖
在https://mvnrepository.com/搜索出redis的jar包依赖
1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
1.2 编写redis工具类
实现向redis中插入数据,提取数据的工具类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/**
* 操作redis数据库的工具类
* @author yxm
* @date 2018/11/15 23:04:20
*/
public class RedisUtil {
/**
* redis中高优先级
*/
public static String highkey = "spider.highlevel";
/**
* redis中低优先级
*/
public static String lowkey = "spider.lowlevel";
JedisPool jedisPool = null;
public RedisUtil(){
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxId 大专栏 java-爬虫-14-采用Redis创建url仓库,实现分布式爬虫le(10);
poolConfig.setMaxTotal(100);
poolConfig.setMaxWaitMillis(10000);
poolConfig.setTestOnBorrow(true);
jedisPool = new JedisPool(poolConfig, "192.168.20.129", 6379);
}
/**
* 查询
* @param key
* @param start
* @param end
* @return
*/
public List<String> lrange(String key,int start,int end){
Jedis resource = jedisPool.getResource();
List<String> list = resource.lrange(key, start, end);
jedisPool.returnResourceObject(resource);
return list;
}
/**
* 添加
* @param Key
* @param url
*/
public void add(String Key, String url) {
Jedis resource = jedisPool.getResource();
resource.lpush(Key, url);
jedisPool.returnResourceObject(resource);
}
/**
* 获取
* @param key
* @return
*/
public String poll(String key) {
Jedis resource = jedisPool.getResource();
String result = resource.rpop(key);
jedisPool.returnResourceObject(resource);
return result;
}
public static void main(String[] args) {
RedisUtil redisUtil = new RedisUtil();
String url = "http://tv.youku.com/search/index/_page40177_1_cmodid_40177";
redisUtil.add(highkey, url);
}
}
1.3 启动redis
1.4 定义存储url仓库接口的实现(此时是电视剧的实现)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* Redis url仓库实现类
* @author yxm
* @date 2018/11/15 23:22:10
*/
public class RedisRepositoryService implements IRepositoryService {
RedisUtil reidsUtil = new RedisUtil();
@Override
public String poll() {
String url = reidsUtil.poll(RedisUtil.highkey);
if(StringUtils.isBlank(url)){
url = reidsUtil.poll(RedisUtil.lowkey);
}
return url;
}
@Override
public void addHighLevel(String url) {
reidsUtil.add(RedisUtil.highkey,url);
}
@Override
public void addLowLevel(String url) {
reidsUtil.add(RedisUtil.lowkey,url);
}
}
1.5 工程结构
原文地址:https://www.cnblogs.com/dajunjun/p/11711043.html
时间: 2024-10-05 09:43:14