package com.ws.crawler.controller;
import com.ws.crawler.config.CrawlerConfig;
import com.ws.lucene.Indexer;
import com.ws.mybatis.bean.News;
import com.ws.util.ConnectUtil;
import com.ws.util.NewsServer;
import com.ws.util.TimeUtil;
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.io.File;
import java.io.FileWriter;
import java.util.*;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
public class CrawlerController {
private static Logger log= LoggerFactory.getLogger(CrawlerController.class);
private HashMap<String,String> subDomainMap;
private CrawlerConfig config;
//private HashSet<String> processedUrlSet=new HashSet<>();
//private LinkedList<String> processUrlList=new LinkedList<>();
/**
* subDomainMap 中存放了新闻分类的标题以及所对应的URL
* 在每一个类别的URL中获取该类别下可下载的新闻页面
*/
public void process(){
Iterator<Map.Entry<String, String>> iterator = subDomainMap.entrySet().iterator();
Indexer indexer=null;
try{
indexer=new Indexer(config.getIndexDir());
}catch (Exception e){
e.printStackTrace();
}
//类别循环处理
HashSet<String> processedUrlSet=new HashSet<>();
while (iterator.hasNext()) {
try {
LinkedList<String> processUrlList=new LinkedList<>();
Map.Entry<String, String> entry = iterator.next();
String className = entry.getKey();
String preDownloadUrl = entry.getValue();
String storePath = config.getStorePath() + className;
log.debug("正在处理 " + className + " : " + preDownloadUrl);
Document document = Jsoup.connect(preDownloadUrl).timeout(50000).get();
/* String pageSourceCode = ConnectUtil.getPageSourceCode(preDownloadUrl);
Document document = Jsoup.parse(pageSourceCode);*/
Elements elements = document.select("a[href]");
//提取该类别下可下载的页面
for (Element element : elements) {
String url = element.attr("abs:href");
log.debug(url);
if (url.matches(preDownloadUrl + config.getDownloadRegex())) {
//判断该url是否被处理过
if (!processedUrlSet.contains(url)) {
processUrlList.add(url);
processedUrlSet.add(url);
}
}
}
//下载该类别下所有的页面
download(processUrlList, storePath,config,indexer,className);
/* Worker worker=new Worker(processUrlList,storePath,config,className,indexer);
Thread thread=new Thread(worker,className);
thread.start();*/
}catch (Exception e){
e.printStackTrace();
}
}
try {
//Thread.currentThread().join();
indexer.close();
}catch (Exception e){
e.printStackTrace();
}
/* try {
Thread.currentThread().join();
}catch (InterruptedException e){
e.printStackTrace();
}*/
}
private void download(LinkedList<String> processUrlList, String storePath, CrawlerConfig config,Indexer indexer ,String className){
System.out.println("线程:"+Thread.currentThread().getName()+"存储路径:"+storePath+" 文件个数:"+processUrlList.size());
int count=0;
File directory=new File(storePath);
if(!directory.exists()){
directory.mkdir();
}
//统计该目录下已有的文件数
if(directory.list()==null){
count=0;
}else{
count=directory.list().length;
}
ArrayList<String> divIdList=config.getDivIdList();
while(!processUrlList.isEmpty()){
try {
String url = processUrlList.pop();
Document document = Jsoup.connect(url).timeout(50000).get();
/* String pageSourceCode=ConnectUtil.getPageSourceCode(url);
Document document=Jsoup.parse(pageSourceCode);*/
String title=document.title();
File file = new File(storePath + "\\" + count++ + ".txt");
file.createNewFile();
log.info("创建"+file.getName()+"文件");
for(int i=0;i<divIdList.size();++i){
Elements elements=document.select("div[id="+divIdList.get(i)+"]");
if(elements!=null) {
for (Element element : elements) {
String text = element.text();
News news=new News(title,url,text, TimeUtil.getToday(),className);
log.info("正在将网页内容写入数据库...");
NewsServer.insert(news);
log.info("网页内容写入数据库完成");
log.info("正在将网页内容写入文件"+file.getName()+"...");
char[] textArray=text.toCharArray();
FileWriter writer = new FileWriter(file);
writer.write("title:"+title + "\r\n");
writer.write("url:"+url + "\r\n");
int index=0;
for(int j=0;j<(textArray.length/100);j++){
writer.write(textArray,index,100);
writer.write("\r\n");
index+=100;
}
writer.write(textArray,index,textArray.length-index);
writer.close();
log.info("网页内容写入文件"+file.getName()+"完成");
//这里的时候文件已经写入完成,可以顺便创建索引
log.info("开始为文件"+file.getName()+"创建索引...");
indexer.indexFile(file,news);
log.info("文件"+file.getName()+"创建索引完成");
}
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
/* private void download(LinkedList<String> processUrlList,String storePath){
System.out.println("存储路径:"+storePath+" 文件个数:"+processUrlList.size());
int count=0;
File directory=new File(storePath);
if(!directory.exists()){
directory.mkdir();
}
//统计该目录下已有的文件数
if(directory.list()==null){
count=0;
}else{
count=directory.list().length;
}
ArrayList<String> divIdList=config.getDivIdList();
while(!processUrlList.isEmpty()){
try {
String url = processUrlList.pop();
//Document document = Jsoup.connect(url).timeout(50000).get();
String pageSourceCode=ConnectUtil.getPageSourceCode(url);
Document document=Jsoup.parse(pageSourceCode);
String title=document.title();
File file = new File(storePath + "\\" + count++ + ".txt");
file.createNewFile();
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
基于lucene全文检索引擎实现的短文本匹配系统 ajax什么时候执行success,什么时候执行error 简单的说Ajax请求通过XMLHttpRequest对象发送请求,该对象有四个状态(readyState): 0-未初始化、1-正在初始化、2-发送数据、3-正在发送数据、4-完成。 当XMLHttpRequest.readyState为4时,表示ajax请求已经完成可以得到响应结果。 ajax的success和error方法根据响应状态码来触发。当XMLHttpRequest.status为200的时候,表示响应成功,此时触发success().其他状态码则触发error()。 除了根据响应状态码外,ajax还会在下列情况下走error方法: 返回数据类型不是JSON 网络中断 后台响应中断 使用ajax提交表单数据时,一定要把button写在form外面. jquery获取input type=raido的值 $('input:radio[name="radioname"]:checked').val(); springmvc中返回json数据时,如果json中有中
资源推荐
资源详情
资源评论























收起资源包目录





































































































共 156 条
- 1
- 2
资源评论


博士僧小星
- 粉丝: 2563
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- A159基于springboot+vue的农产品销售系统(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A157基于springboot+vue的漫画天堂网(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A158基于springboot+vue的网上购物商城的设计与实现(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A160基于springboot+vue的攀枝花市鲜花销售系统(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A162基于springboot+vue+微信小程序的校园朋友圈(完整前后端代码+sql脚本+开发文档+全套软件)
- A161基于springboot+vue的零食销售商城的设计与实现(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- A163基于springboot+vue的秦皇岛旅游景点管理系统(LW文档+完整前后端代码+sql脚本+开发文档+全套软件)
- 基于微信小程序的电子数据取证知识测试系统-6dz93fez【附万字论文+PPT+包部署+录制讲解视频】.zip
- 手写实现常用机器学习算法,助你深入理解原理
- SpringBoo基于微信小程序的电子数据取证知识测试系统【附万字论文+PPT+包部署+录制讲解视频】.zip
- 计算机四级网络工程师知识点全面总结-操作系统原理篇
- 计算机四级网络工程师知识点全面总结-计算机网络篇
- 目标检测-人脸检测数据集-20000张图-+对应VOC/COCO/YOLO三种格式标签+YOLO11一键训练脚本
- 南京大学机器学习课程在线判题系统
- OpenCV和YOLO的多路RTSP流实时处理实现
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈



安全验证
文档复制为VIP权益,开通VIP直接复制
