java-爬虫-14-采用Redis创建url仓库,实现分布式爬虫

前言

使用之前单应用的队列仓库存储抓取的url存在以下两个弊端:

  1. 单应用时候,加入服务宕机了,则单应用中的队列仓库里面的url就会为空,则此时就会从页面的首页重新抓取
  2. 在加快爬虫抓取速度时候,我们有时候需要部署多节点,实现多节点抓取,加快抓取速度,但是多节点抓取同一个页面时候,怎样保证哪些url已经抓取了,而不需要再次抓取了,此时如果是单应用队列仓库将会不能区分
  3. 使用redis创建的url仓库(公共的仓库) 恰好解决了这个问题
  4. 多节点可以实现负载均衡,可以保证服务稳定性(其中一个挂掉了,不会对其他有啥影响)

内容

我们本节实现以下功能: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-08-04 20:49:33

java-爬虫-14-采用Redis创建url仓库,实现分布式爬虫的相关文章

基于Redis的三种分布式爬虫策略

前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够"健壮"的情况下实现起来越简单/方便越好 最好支持"断点续爬"功能 Python分布式爬虫比较常用的应该是scrapy框架加上Redis内存数据库,中间的调度任务等用scrapy-redis模块实现. 此处简单介绍一下基于Redis的三种分布式策略,其实它们之间还是很相似

分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

[TOC] 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HBase等. 基于面向接口的编码思想来开发,因此这个系统具有一定的扩展性,有兴趣的朋友直接看一下代码,就能理解其设计思想,虽然代码目前来说很多地方还是比较紧耦合,但只要花些时间和精力,很多都是可抽取出来并且可配置化的. 因为时间的关系,我只写了京东和苏宁易购两个网站的爬虫,但是完全可以实现不同网站爬虫的随机调度,基于其代码结构,再写国美.天猫等的商品爬取,难度不

使用IntelliJ IDEA 14和Maven创建java web项目

原文:使用IntelliJ IDEA 14和Maven创建java web项目 http://mark.leanote.com/post/%E4%BD%BF%E7%94%A8IntelliJ-IDEA-14%E5%92%8CMaven%E5%88%9B%E5%BB%BAjava-web%E9%A1%B9%E7%9B%AE 安装Maven 下载安装 去maven官网下载最新版. 解压到安装目录. 配置 右键桌面的计算机图标,属性–>高级系统设置–>环境变量,添加M2_HOME的环境变量,然后将该

Java分布式爬虫Nutch教程——导入Nutch工程,执行完整爬取

Java分布式爬虫Nutch教程--导入Nutch工程,执行完整爬取 by briefcopy · Published 2016年4月25日 · Updated 2016年12月11日 在使用本教程之前,需要满足条件: 1)有一台Linux或Linux虚拟机 2)安装JDK(推荐1.7) 3)安装Apache Ant 下载Nutch源码: 推荐使用Nutch 1.9,官方下载地址:http://mirrors.hust.edu.cn/apache/nutch/1.9/apache-nutch-1

Python3分布式爬虫(scrap+redis)基础知识和实战详解

背景 随着业务需求的变化,大规模爬虫遇到各种问题.python爬虫具有先天优势,社区资源比较齐全,各种框架也完美支持.爬虫性能也得到极大提升.本次分享从基础知识入手,涉及python 的两大爬虫框架pyspider.scrapy,并基于scrapy.scrapy-redis 做了分布式爬虫的介绍(直接粘贴的ppt截图)会涉及 redis.mongodb等相关知识. 一.前沿 1.1 爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本.

在阿里云创建私有仓库上传并拉取

在阿里云上创建私有仓库,为后面的微服务上传镜像做准备,后面会安装harbor 操作指南: 1. 登录阿里云Docker Registry $ sudo docker login --username=wgr332574835 registry.cn-hangzhou.aliyuncs.com 用于登录的用户名为阿里云账号全名,密码为开通服务时设置的密码. 您可以在产品控制台首页修改登录密码. 2. 从Registry中拉取镜像 $ sudo docker pull registry.cn-han

爬虫5 scrapy框架2 全站爬取cnblogs, scarpy请求传参, 提高爬取效率, 下载中间件, 集成selenium, fake-useragent, 去重源码分析, 布隆过滤器, 分布式爬虫, java等语言概念补充, bilibili爬视频参考

1 全站爬取cnblogs # 1 scrapy startproject cnblogs_crawl # 2 scrapy genspider cnblogs www.cnblogs.com 示例: # cnblogs_crawl/cnblogs_crawl/spiders/cnblogs.py import scrapy from cnblogs_crawl.items import CnblogsCrawlItem from scrapy.http import Request class

Java中的网络支持InetAddress&amp;URL

针对网络通信的不同层次,Java提供的网络功能有四大类 InetAddress:用于标识网络上的硬件资源.(说白了就是IP地址的相关信息) URL:统一资源定位符,通过URL可以直接读取或写入网络上的数据 Sockets:使用TCP协议实现网络通信的Socket相关的类 Datagram:使用UDP协议,将数据保存在数据报中,通过网络进行通信.(通过在网络中发送数据报进而实现网络的通信) InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)协议. 1 package zhan

github创建远程仓库和git常用命令

git创建远程仓库 首先到github页面上创建仓库(repository)如下: 然后初始化文件夹为仓库,并提交到远程仓库,如下: [[email protected] aa]# git init Initialized empty Git repository in /data/mydata/aa/.git/ [[email protected] aa]# git add . [[email protected] aa]# git commit -m "first commit"