httpunit 抓取网页(接上一节(爬虫系列)之监控线程管理)
优采云 发布时间: 2022-01-01 02:00httpunit 抓取网页(接上一节(爬虫系列)之监控线程管理)
接上一节(爬虫系列(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