c httpclient抓取网页(某电商商品详细信息的整体架构布局(图)、业务需求 )

优采云 发布时间: 2021-10-09 22:05

  c httpclient抓取网页(某电商商品详细信息的整体架构布局(图)、业务需求

)

  HtmlCleaner&xPath:网页分析软件,解析出需要的相关信息。

  MySQL数据库:用于存储爬取到的产品的详细信息。

  ZooKeeper:分布式协调工具,用于监控后期各个爬虫的运行状态。

  三、业务需求

  获取电子商务产品的详细信息,需要的相关字段有:产品ID、产品名称、产品价格和产品详细信息。

  四、 整体结构布局

  第一个是我们的核心部件爬虫程序。爬虫过程是:从Redis数据仓库中取出URL,使用HttpClient进行下载,下载的页面内容,我们使用HtmlCleaner和xPath进行页面分析,此时我们解析的页面可能是产品列表页面,或者它可能是产品的详细页面。如果是产品列表页面,则需要在页面中解析出产品详情页面的URL,放入Redis数据仓库进行后期分析;如果是产品详细信息页面,请将其存储在我们的 MySQL 数据中。具体架构图如下:

  

  核心程序爬虫写好后,为了加快页面爬取效率,我们需要对爬虫进行改进:一是多线程修改爬虫程序;二是将爬虫部署到多台服务器上,进一步加快爬虫的爬取效率。在实际生产环境中,由于刀片服务器稳定性较差,可能会出现一些问题,例如:爬虫进程挂掉。这些问题可能经常发生,所以我们需要对其进行监控。一旦发现爬虫进程挂掉,立即启动脚本重启爬虫进程,保证我们整个爬虫核心的持续运行。这是我们的分布式协调服务 ZooKeeper 的使用。我们可以再写一个进程监控程序,实时监控爬虫的运行状态。原理是:爬虫启动时,在ZooKeeper服务中注册自己的临时目录。监控程序使用ZooKeeper监控爬虫注册的临时目录。ZooKeeper的本质——如果注册临时目录的程序挂了,过一会临时目录就会消失。利用这种性质,我们的监控程序监控爬虫注册的临时目录。一旦发现临时目录消失,服务器就会发生变化。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:它在 ZooKeeper 服务中注册自己的临时目录。监控程序使用ZooKeeper监控爬虫注册的临时目录。ZooKeeper的本质——如果注册临时目录的程序挂了,过一会临时目录就会消失。利用这种性质,我们的监控程序监控爬虫注册的临时目录。一旦发现临时目录消失,服务器就会发生变化。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:它在 ZooKeeper 服务中注册自己的临时目录。监控程序使用ZooKeeper监控爬虫注册的临时目录。ZooKeeper的本质——如果注册临时目录的程序挂了,过一会临时目录就会消失。利用这种性质,我们的监控程序监控爬虫注册的临时目录。一旦发现临时目录消失,服务器就会发生变化。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:监控程序使用ZooKeeper监控爬虫注册的临时目录。ZooKeeper的本质——如果注册临时目录的程序挂了,过一会临时目录就会消失。利用这种性质,我们的监控程序监控爬虫注册的临时目录。一旦发现临时目录消失,服务器就会发生变化。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:监控程序使用ZooKeeper监控爬虫注册的临时目录。ZooKeeper的本质——如果注册临时目录的程序挂了,过一会临时目录就会消失。利用这种性质,我们的监控程序监控爬虫注册的临时目录。一旦发现临时目录消失,服务器就会发生变化。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:ZooKeeper的本质——如果注册临时目录的程序挂了,过一会临时目录就会消失。利用这种性质,我们的监控程序监控爬虫注册的临时目录。一旦发现临时目录消失,服务器就会发生变化。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:ZooKeeper的本质——如果注册临时目录的程序挂了,过一会临时目录就会消失。利用这种性质,我们的监控程序监控爬虫注册的临时目录。一旦发现临时目录消失,服务器就会发生变化。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:服务器将被更改。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:服务器将被更改。其上的爬虫进程已经暂停,所以我们需要启动脚本来重启爬虫进程。然后我们将捕获的产品的详细信息存储在我们的分布式 MySQL 数据库中。以下是整个爬虫项目的架构图:

  接下来,我们将重点分析爬虫架构的各个部分。

  五、Redis 数据库-临时存储要爬取的 URL。

  Redis 数据库是一个基于内存的 Key-Value 非关系型数据库。由于其极快的读写速度,受到了人们的热烈追捧(读写速度约为每秒10W)。Redis 数据库用于临时数据存储的选择就是基于此。为了让我们的爬虫优先抓取商品列表页面,我们在Redis中定义了两个队列(利用Redis的list的lpop和rpush模拟),分别是高优先级队列和低优先级队列,我们​​有更高优先级的商品列表page存放在队列中,商品详情页存放在低优先级队列中。这样我们就可以保证爬虫在抓取数据的时候,会先从高优先级队列中抓取数据,这样爬虫会先抓取产品列表页面。

  package cn.mrchor.spider.utils;

import redis.clients.jedis.Jedis;

import redis.clients.jedis.JedisPool;

import redis.clients.jedis.JedisPoolConfig;

public class JedisUtils {

public static String highKey = "jd_high_key";

public static String lowKey = "jd_low_key";

private JedisPool jedisPool = null;

/**

* 构造函数初始化jedis数据库连接池

*/

public JedisUtils() {

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();

jedisPoolConfig.setMaxIdle(10);

jedisPoolConfig.setMaxTotal(100);

jedisPoolConfig.setMaxWaitMillis(10000);

jedisPoolConfig.setTestOnBorrow(true);

jedisPool = new JedisPool("192.168.52.128", 6379);

}

/**

* 获取jedis对象操作jedis数据库

* @return

*/

public Jedis getJedis() {

return this.jedisPool.getResource();

}

/**

* 往list添加数据

*/

public void addUrl(String key, String url) {

Jedis jedis = jedisPool.getResource();

jedis.lpush(key, url);

jedisPool.returnResourceObject(jedis);

}

/**

* 从list中取数据

*/

public String getUrl(String key) {

Jedis jedis = jedisPool.getResource();

String url = jedis.rpop(key);

jedisPool.returnResourceObject(jedis);

return url;

}

}

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线