package atest;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.*;
import org.htmlparser.tags.Div;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.*;
import com.jdon.controller.events.EventModel;
import cn.vetech.framework.base.dao.B_class_dao;
import cn.vetech.framework.base.dao.B_class_dao_sql;
import cn.vetech.framework.dao.SqlMapDaoTemplateFactory;
import cn.vetech.framework.news.dao.B_news_dao;
import cn.vetech.framework.news.dao.B_news_dao_sql;
import cn.vetech.framework.news.model.B_news;
import cn.vetech.framework.news.service.B_news_service;
import cn.vetech.framework.news.service.B_news_service_imp;
import cn.vetech.framework.util.VeDate;

/** *//**
* 抓取中华培训网规则 1.抓取chinahtml/zixunzhongxin目录下的文件
* 说明:循环网址下所有链接,根据一定规则过滤掉一部分链接,读出页面指定节点下的内容
* @author sam.zhang
*
*/
public class TestParser ...{
private B_news_dao b_news_dao;
private B_class_dao b_class_dao;
private B_news_service b_news_service;
private String TRAINING_URL = "http://www.china-training.com"; // 中华培训网网址
private static String TRAINING_ZXURL = "http://www.china-training.com/newpage/zxzx.asp"; // 中华培训网资讯根网址
private String FILEPATH = "chinahtml"; // 中华培训网放置新闻的根文件夹名
private String ZXZX = "zixunzhongxin"; // 存放资讯中心的目录

public TestParser() ...{
SqlMapDaoTemplateFactory sqldao = new SqlMapDaoTemplateFactory();
b_news_dao = new B_news_dao_sql(sqldao);
b_class_dao = new B_class_dao_sql(sqldao);
b_news_service = new B_news_service_imp(b_news_dao, b_class_dao, null,
null);
}

/** *//**
* 得到指定网址下所有链接
*
* @param url
*/
public void getAllUrls(String url) ...{
NodeList nodeList = null;
try ...{
Parser p = new Parser(url);
// nodeList = p.parse(new TagNameFilter( "A ")); // 使用TagNameFilter(两种写法都可以)
nodeList = p.parse(new NodeClassFilter(LinkTag.class)); // 使用NodeClassFilter
} catch (ParserException e) ...{
e.printStackTrace();
}
if (nodeList != null && nodeList.size() > 0) ...{
for (int i = 0; i < nodeList.size(); i++) ...{
String u = ((LinkTag) nodeList.elementAt(i)).getLink()
.toString();
if (isIndesOf(u) != -1) ...{
int num = ((LinkTag) nodeList.elementAt(i)).getLink()
.toString().split("/").length;
if (num > 2) ...{
String str_1 = ((LinkTag) nodeList.elementAt(i))
.getLink().toString().split("/")[1];
String str_2 = ((LinkTag) nodeList.elementAt(i))
.getLink().toString().split("/")[2];
if (str_1 != "" && str_2 != ""
&& FILEPATH.equals(str_1) && ZXZX.equals(str_2)) ...{
String str_utl = ((LinkTag) nodeList.elementAt(i))
.getLink().toString();
str_utl = TRAINING_URL + str_utl;
run(str_utl);
}
}
}
}
}
}

/** *//**
* 得到根网址的实际内容
*
* @param str
*/
public static void run(String str) ...{
try ...{
NodeList nodelist;
Parser parser = new Parser(str); //主要对象(传入网址)
NodeFilter divFilter = new NodeClassFilter(Div.class); //创建一个div对象
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] ...{ divFilter });
nodelist = parser.parse(lastFilter);
Node[] nodes = nodelist.toNodeArray();
String line = "";
String title = ""; // 标题
String content = ""; // 内容
String source = ""; // 来源
for (int i = 0; i < nodes.length; i++) ...{
Node node = nodes[i];
if (node instanceof Div) ...{
Div textnode = (Div) node;
line = textnode.getAttribute("id");
if ("news_title".equals(line)) ...{
// ...得到新闻标题(纯文本)
title = textnode.toPlainTextString();
}
// ...得到文章正文(源码)
if ("news_content".equals(line)) ...{
content = textnode.getStringText();
}
// ...得到文章来源(纯文本)
if ("news_date".equals(line)) ...{
source = isTrim(textnode.toPlainTextString());
if (isIndesOfSource(source) != -1) ...{
source = isTrimSource(source.split(":")[1]);
if ("".equals(source))
source = "ASK123";
} else
source = "ASK123";
}
}
}
if (!"".equals(title) && !"".equals(content)) ...{
TestParser testparser = new TestParser();
B_news b_news = testparser.setModel(title, content, source);
boolean is = testparser.saveNews(b_news);
if (!is) ...{
// ...保存失败
}
}
} catch (ParserException pe) ...{
pe.printStackTrace();
}
}

/** *//**
* 向model填充属性
*
* @return
*/
public B_news setModel(String title, String content, String source) ...{
B_news b_news = new B_news();
b_news.setAccid("ASK123");
b_news.setFbr("ASK123");
b_news.setBt(title);
b_news.setNr(content);
b_news.setSh("1"); // 爬虫,默认审核
b_news.setSyxs("1");
b_news.setBy1("1");
b_news.setShsj(VeDate.getStringDate());
b_news.setGjz("");
b_news.setXwcc(source);
b_news.setSytp("");
b_news.setBy2("");
b_news.setBy4("");
b_news.setSytpxs("0");
b_news.setNrjj(title);
b_news.setSfkf("1");
b_news.setFl("");
b_news.setFlmc1("");
b_news.setFlmc2("");
b_news.setXqfl("");
b_news.setGlfl("none");
b_news.setNextfl("");
return b_news;
}

/** *//**
* 数据库操作
*
* @param b_news
* @return
*/
public boolean saveNews(B_news b_news) ...{
int count = b_news_service.getNewsListCount(b_news);
if (count == 0) ...{
// ...数据库操作
EventModel em = new EventModel();
em.setModel(b_news);
B_news bn = b_news_service.initB_news(em);
EventModel em_1 = new EventModel();
em_1.setModel(bn);
b_news_service.createB_news(em_1);
return true;
} else ...{
// ...该新闻已经存在....
return false;
}
}

/** *//**
* 主函数
*/
public static void main(String[] args) ...{
TestParser tt = new TestParser();
tt.getAllUrls(TRAINING_ZXURL);
}

/** *//**
* 工具函数
*
* @param str
* @return
*/
public static String isTrim(String str) ...{
str = str.replace(" ", "");
return str;
}

public static String isTrimSource(String str) ...{
str = str.replace("作者", "");
return str;
}

public static int isIndesOf(String str) ...{
return str.indexOf("/");
}

public static int isIndesOfSource(String str) ...{
return str.indexOf(":");
}
}嘿嘿,等下.还要下载一个包HTMLPARSER如果不知道哪下载,可以在本人的csdn资源里面下
该资源也包含一个例子和上文是一个例子,资源名叫htmlparser1_6大家自己找吧
这篇博客介绍了如何利用Java进行网页内容抓取,特别是针对特定节点的处理。作者提醒需要下载HTMLPARSER包,并提供了下载途径。
&spm=1001.2101.3001.5002&articleId=2223235&d=1&t=3&u=88c2783c35c44e08a1a745b0d1d5a60b)
3770

被折叠的 条评论
为什么被折叠?



