httpunit 抓取网页(接上一节(爬虫系列)之监控线程管理)

优采云 发布时间: 2022-01-01 02:00

  httpunit 抓取网页(接上一节(爬虫系列)之监控线程管理)

  接上一节(爬虫系列(1):抓取网页网址)。

  根据需要处理网页数据的分析。比如抓取某个小说网站的小说内容,那么就需要分析网页上小说内容的具体标识,然后根据该标识获取小说内容。

  这里,我简单分析一下网址上的关键词来抓取信息。

  要求

  在URL上抓取带有新闻或博客的网页信息,并将整个页面信息保存在一个文件中。

  配置

  1、在SpiderConfig类中添加配置:

  /**

* 分析页面线程数

*/

public int minerThreadNum = 2;

/**

* URL中包含的关键字

*/

public List keys;

  2、修改application.properties(.yml),添加新的配置属性,如下图:

  

  魔猿简单爬虫配置

  队列管理

  为SpiderQueue添加一个存储队列,主要方法如下:

  /**

* 存储队列

* 存储线程从这里取数据

*/

private static volatile Queue store = new LinkedList();

/**

* 添加到存储队列

*

* @param html 爬取页面

*/

public synchronized static void addStore(SpiderHtml html) {

store.add(html);

}

/**

* 存储队列出队列

*

* @return 爬取页面

*/

public synchronized static SpiderHtml storePoll() {

return store.poll();

}

/**

* 存储队列是否为空

*

* @return

*/

public static boolean storeIsEmpty() {

return store.isEmpty();

}

  抓取分析任务

  主要作用是拉出等待队列中的URL,然后依次抓取网页信息,分析URL关键字。

  package mobi.huanyuan.spider.runable;

import mobi.huanyuan.spider.SpiderApplication;

import mobi.huanyuan.spider.SpiderQueue;

import mobi.huanyuan.spider.bean.SpiderHtml;

import mobi.huanyuan.spider.config.SpiderConfig;

import org.apache.commons.lang3.StringUtils;

import org.jsoup.Connection;

import org.jsoup.Jsoup;

import org.jsoup.nodes.Document;

import org.jsoup.nodes.Element;

import org.jsoup.select.Elements;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import java.util.HashSet;

import java.util.List;

import java.util.Set;

/**

* 解析页面任务.

*

* @author Jonathan L.(xingbing.lai@gmail.com)

* @version 1.0.0 -- Datetime: 2020/2/18 17:11

*/

public class SpiderParseHtmlRunnable implements Runnable {

private static final Logger logger = LoggerFactory.getLogger(SpiderParseHtmlRunnable.class);

private SpiderConfig config;

public SpiderParseHtmlRunnable(SpiderConfig config) {

this.config = config;

}

@Override

public void run() {

while (!SpiderApplication.isStopping) {

parse();

}

}

private synchronized void parse() {

SpiderHtml html = SpiderQueue.waitingMinePoll(); // 等待提取URL的分析页面出队列

if (null == html || StringUtils.isBlank(html.getHtml())) {

return;

}

//当前页面深度 {

while (!isStopping) {

try {

TimeUnit.SECONDS.sleep(5);

} catch (InterruptedException e) {

e.printStackTrace();

}

if (SpiderQueue.unVisitedIsEmpty()

&& SpiderQueue.waitingMineIsEmpty()

&& SpiderQueue.storeIsEmpty()) {

isStopping = true;

threadPoolTaskExecutor.shutdown();

logger.info("程序结束。。。。。。当前线程[{}]", Thread.currentThread().getName());

long endTime = System.currentTimeMillis();

logger.info("已经访问队列URL大小[{}]当前线程[{}]", SpiderQueue.getUrlSetSize(), Thread.currentThread().getName());

logger.info("用时[{}ms]当前线程[{}]", endTime - starTime, Thread.currentThread().getName());

// 停止springboot

context.close();

System.exit(0);

}

}

});

  关于我

  

  编程界的老猿猴,自媒体世界的新宠じ☆ve

  编程界的老猿猴,自媒体世界的新宠じ☆ve

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线