45 个解决方案
#1
要求太过笼统,不是很清楚,UP UP
#2
public static void main(String args[]){
try{
/*声明字符串strLine,用于读取一行信息*/
String strLine;
/*声明url对象,该对象将连接到清华邮箱网页上*/
URL urlObj = new URL("http://localhost:8080/ceshi/2.html");
/*将通过URL对象的openStream方法获得的InputStream对象赋给streamObj*/
InputStream streamObj = urlObj.openStream();
/*通过上面的streamObj生成InputStreamReader类对象readerObj*/
InputStreamReader readerObj = new InputStreamReader(streamObj);
/*生成BufferedReader类对象buffObj*/
BufferedReader buffObj = new BufferedReader(readerObj);
/*while循环用于读取URL对象指定的HTML文件内容,按行读取*/
while((strLine = buffObj.readLine())!=null)
System.out.println(strLine);
/*下面的语句将连接关闭*/
buffObj.close();
}catch(MalformedURLException e){
System.err.println("url error");
}catch(IOException e){
System.out.println("IO error");
}
}
try{
/*声明字符串strLine,用于读取一行信息*/
String strLine;
/*声明url对象,该对象将连接到清华邮箱网页上*/
URL urlObj = new URL("http://localhost:8080/ceshi/2.html");
/*将通过URL对象的openStream方法获得的InputStream对象赋给streamObj*/
InputStream streamObj = urlObj.openStream();
/*通过上面的streamObj生成InputStreamReader类对象readerObj*/
InputStreamReader readerObj = new InputStreamReader(streamObj);
/*生成BufferedReader类对象buffObj*/
BufferedReader buffObj = new BufferedReader(readerObj);
/*while循环用于读取URL对象指定的HTML文件内容,按行读取*/
while((strLine = buffObj.readLine())!=null)
System.out.println(strLine);
/*下面的语句将连接关闭*/
buffObj.close();
}catch(MalformedURLException e){
System.err.println("url error");
}catch(IOException e){
System.out.println("IO error");
}
}
#3
我做爬虫开发用地一个测试类
我用的是httpUnit 加 java正则表达式
实现垂直抓取的
我用的是httpUnit 加 java正则表达式
实现垂直抓取的
#4
代码:
package test;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.meterware.httpunit.ClientProperties;
import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebResponse;
public class MatchSingleUrl {
public static void main(String[] args) {
System.out
.println(getMatchString(
"网友推荐[\\d\\D]{1,350}class=\"B\">([\\d\\D]*)</a><span class=\"dishNum\">|推荐菜: ([^<]*)",
getWebpageSource("http://www.dianping.com/shop/1916656")));
}
/**
*
* 获得网页源码 create date:2008-11-24 author:Administrator
*
* @param url:网页的url
* @return
*/
public static String getWebpageSource(String url) {
// Map<String, String> map = null;// 保存一行结果
// List<Map> list = new ArrayList<Map>();// 保存所有结果
WebConversation wc = new WebConversation();
ClientProperties client = wc.getClientProperties();
// 设置代理
client
.setUserAgent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; "
+ "SV1; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)");
WebResponse response = null;
String text = null;
try {
response = wc.getResource(new GetMethodWebRequest(url));
text = response.getText();
// System.out.println(text);
} catch (IOException e) {
e.printStackTrace();
}
return text;
}
/**
* 获得指定正则表达式匹配指定字符串后的匹配结果 create date:2008-11-24 author:Administrator
*
* @param regex
* 正则表达式
* @param source
* 正则表达式要匹配的内容
* @return
*/
public static String getMatchString(String regex, String text) {
Pattern p = null;
Matcher m = null;
int counter = 0;
String value = "";
int index = 0;
boolean independence = false;
if (regex != null) {
p = Pattern.compile(regex);
m = p.matcher(text);
index = m.groupCount();
while (m.find() && index > 1) {
String str = m.group();
System.out.println(str);
value += str;
}
} else {
System.out.println("这条正则表达式没有定义:" + regex);
}
System.out.println(value);
return value;
}
}
package test;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.meterware.httpunit.ClientProperties;
import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebResponse;
public class MatchSingleUrl {
public static void main(String[] args) {
System.out
.println(getMatchString(
"网友推荐[\\d\\D]{1,350}class=\"B\">([\\d\\D]*)</a><span class=\"dishNum\">|推荐菜: ([^<]*)",
getWebpageSource("http://www.dianping.com/shop/1916656")));
}
/**
*
* 获得网页源码 create date:2008-11-24 author:Administrator
*
* @param url:网页的url
* @return
*/
public static String getWebpageSource(String url) {
// Map<String, String> map = null;// 保存一行结果
// List<Map> list = new ArrayList<Map>();// 保存所有结果
WebConversation wc = new WebConversation();
ClientProperties client = wc.getClientProperties();
// 设置代理
client
.setUserAgent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; "
+ "SV1; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)");
WebResponse response = null;
String text = null;
try {
response = wc.getResource(new GetMethodWebRequest(url));
text = response.getText();
// System.out.println(text);
} catch (IOException e) {
e.printStackTrace();
}
return text;
}
/**
* 获得指定正则表达式匹配指定字符串后的匹配结果 create date:2008-11-24 author:Administrator
*
* @param regex
* 正则表达式
* @param source
* 正则表达式要匹配的内容
* @return
*/
public static String getMatchString(String regex, String text) {
Pattern p = null;
Matcher m = null;
int counter = 0;
String value = "";
int index = 0;
boolean independence = false;
if (regex != null) {
p = Pattern.compile(regex);
m = p.matcher(text);
index = m.groupCount();
while (m.find() && index > 1) {
String str = m.group();
System.out.println(str);
value += str;
}
} else {
System.out.println("这条正则表达式没有定义:" + regex);
}
System.out.println(value);
return value;
}
}
#5
学习了,好贴
#6
用htmlparse抓取网页中的内容
package com.rsstest;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.tags.ParagraphTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.util.SimpleNodeIterator;
public class HtmltestSohu {
public static void main(String[] args) throws Exception {
//
System.out.println(extractText("http://go.rss.sina.com.cn/redirect.php?url=http://finance.sina.com.cn/stock/jsy/20090410/16506089680.shtml"));
//System.out.println(extractText("http://news.163.com/08/1205/16/4SDOG7CE0001121M.html"));
}
public static String extractText(String url) {
StringBuffer returnText = new StringBuffer();
//使用解析目标的URL地址构造一个Parser
Parser parser;
try {
parser = new Parser(url);
parser.setEncoding("EUC-CN");
//构造一个接点LIST,对于htmlparser来说,任何一个HTML标签都是一个Node
NodeList collectionList = new NodeList();
//构造一个段落过录规则过路节点
NodeClassFilter filter = new NodeClassFilter(ParagraphTag.class);
for (NodeIterator e = parser.elements(); e.hasMoreNodes();)
//根据段落过滤规则将过滤后的节点放入新构造的节点LIST中
e.nextNode().collectInto(collectionList, filter);
for (SimpleNodeIterator e = collectionList.elements(); e
.hasMoreNodes();) {
Node node = e.nextNode();
if (node.getChildren() != null
&& node.getChildren().size() == 1) {
//判断该节点内容对应的html文本值是否包含“http://”
if (!(node.getChildren().toHtml().indexOf("http://") > -1)) {
//不包含则将文本值加进来
returnText.append(node.getChildren().toHtml()).append("\n");
}
}
}
} catch (ParserException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return returnText.toString();
}
}
#7
学习~
#9
谢谢了,请问怎样把抓取的数据过滤并导入到数据库里呢?
#10
还有我要的是怎样抓取某个站点的信息。不是单纯的一个页面哦
#11
这就是需要考虑很多东西了。。一个整站或几个整站信息你可以考虑蜘蛛了。heritrix
#12
只抓取一个站点内容,请问有heritrix的例子吗,给贴点好吗
#13
heritrix就是配置安装然后对做些基本的设置就行了。这个有web界面网上很多例子吧。。反正抓一个整站挺麻烦的。首先得到这个这个网站的所有链接这是第一步,然后下载内容 根据你想要的过滤。说着挺简单做的话会有很多问题的。
#14
还有其他的方法吗?htmlparser能实现抓取某一网站上的数据并导入到数据库里吗?我只找了些抓取某一网页的代码
#15
抓取某一网站现成的代码没有 可以为楼主提供一个思路 一般是先通过网站的首页去把该首页上的网址全部抓取下来 然后递归去抓取抓到的网址上的网页内容 这里可以设置一个深度控制递归调用的次数也就是抓取的深度 然后抓取到内容后还要指定过滤规则去过滤那些广告等垃圾信息 我们公司最开始也准备做个类似的工具来抓取新闻 后来发现工作量比较大放弃了 直接花钱买的别人专业的爬虫工具
#16
哦
#17
整站和这个网站中的某一类是不一样的。。
比如一个CMS。他有很多文章,文章又分很多类别比如(JAVA类,J2EE类)但这些文章的基本的HTML源代码还是一样的(比如在一个固定TABLE里面存放的是文章内容)可以根据这个来实现htmlparser 如果想抓取整站而且几乎找不到相同的代码那就考虑用蜘蛛吧。下载下来。。分析。。
你可以发个网站我看看,想抓些什么东西~
比如一个CMS。他有很多文章,文章又分很多类别比如(JAVA类,J2EE类)但这些文章的基本的HTML源代码还是一样的(比如在一个固定TABLE里面存放的是文章内容)可以根据这个来实现htmlparser 如果想抓取整站而且几乎找不到相同的代码那就考虑用蜘蛛吧。下载下来。。分析。。
你可以发个网站我看看,想抓些什么东西~
#18
dom4j获取节点。json,response传输
#19
抓些静态页面上的东西,例如:某站的全部小说信息(是生成了静态页面的)
#20
呵呵。这个不难。
只要一个网站。应该没问题。你发下网站我看看吧。~
只要一个网站。应该没问题。你发下网站我看看吧。~
#21
这个和静态页面没什么多大关系~
#22
怎样才能抓取整站的信息,并分析出有用的信息添加到数据库里呢?继续问
#23
强 学习...
#24
继续问???
#25
呵呵 老哥 厉害哈
偶像呀 。。我崇拜你哦
偶像呀 。。我崇拜你哦
#26
學習了﹗
#27
继续问???
#28
如果自己实现的话,很复杂,需要很多东西,比如页面源代码分析,正则表达式等等。
建议选取现成的框架。
建议选取现成的框架。
#29
强悍啊!和大家一起学习吧!
#30
用什么框架呢?
#31
htmlparser常用代码
取得一段html代码里面所有的链接C#版本,java版本类似:
string htmlcode = "<HTML><HEAD><TITLE>AAA</TITLE></HEAD><BODY>" + ...... + "</BODY></HTML>";
Parser parser = Parser.CreateParser(htmlcode, "GBK");
HtmlPage page = new HtmlPage(parser);
try
{ parser.VisitAllNodesWith(page);}
catch (ParserException e1)
{ e1 = null;}
NodeList nodelist = page.Body;
NodeFilter filter = new TagNameFilter("A");
nodelist = nodelist.ExtractAllNodesThatMatch(filter, true);
for (int i = 0; i < nodelist.Size(); i++)
{
LinkTag link=(LinkTag) nodelist.ElementAt(i);
System.Console.Write(link.GetAttribute("href") + "\n");
}
#32
请高手指点,继续问???
#33
我看了你给我的那个网站了。。不好弄,前提是你不知道他所有的点 就没发得到它的所有的路线,抓取我认为是够呛了。你可以换个思路了。如果有所有的点就可以实现。
#34
#35
我能抓取到他们的所有点!
#36
抓到所有点就可以了就等于有了所有的链接。*组合吧。哈哈~ 这个是生成后的链接http://beijing.8684.cn/h_%CE%BA%B9%AB%B4%E5_%C9%CF%B5%D8%CE%E5%BD%D6 用所有的地点构造这个链接 URLEncode 然后可以直接请求了Parser p=new Parser(url) 根据生成的页面提取就行了。。(没有换乘方案,也许是以下原因的中一个:
您要查询的路线要转三次车以上,本站只提供两次转车,如有不便,请见谅!
没有输入准确的站点名称,你可以从输入提示站点中选取站点来查询
)多线程跑很快的。。况且页面不大,信息抓的很快。
您要查询的路线要转三次车以上,本站只提供两次转车,如有不便,请见谅!
没有输入准确的站点名称,你可以从输入提示站点中选取站点来查询
)多线程跑很快的。。况且页面不大,信息抓的很快。
#37
我抓取过,例子 http://www.seo-fang.cn/post/LUCENE-e5819ae4b880e4b8aae585a8e69687e6909ce7b4a2.aspx
#38
好的,我看看
#39
继续问???
37楼的职能实现简单1个页面的抓取
37楼的职能实现简单1个页面的抓取
#40
继续问???
#41
建议楼主学习一下 heritrix
#42
楼主研究出来了吗? 加我交流一下咯 QQ97219684
#43
楼主,打扰哈,我想请问一下在非开发环境下配置的heritrix可以对数据处理吗??
#44
有没有用asp.net实现的例子???求代码。
#45
package com.eroadsoftware.Webdatagrab;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
* 理财产品大全-银率网数据 抓取
* @author Administrator
*
*/
public class test{
public static void main(String[] args) throws Exception {
String str=getWebHtml("http://www.bankrate.com.cn/financing/grade/bank/0/expect/0/type/0/MinAmount/0/status/0/limit/0/area/-1/Currency/0/ReturnType/0/direction/DESC/isFc/0/isMDA/0/field/3/page/1");
String tabletag = selHtmlTextByAllHtml(str);
testTable(tabletag);
}
/**
* 从allhtml文本中得到
* @param allhtml
* @return
* @throws ParserException
*/
public static String selHtmlTextByAllHtml(String allhtml) throws ParserException{
Parser myParser = new Parser(allhtml);
myParser.setEncoding( "UTF-8" );
NodeFilter filter = new TagNameFilter("table");
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
TableTag tabletag = (TableTag) nodeList.elementAt(0);
// System.out.println(tabletag.toHtml().toString());
return tabletag.toHtml().toString();
}
/**
* 对TABLE 的解析
* @throws Exception
*
*/
public static void testTable(String tablehtml) throws Exception {
Parser myParser = new Parser(tablehtml);
NodeList nodeList = null;
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
/**
* 得到TABLE里面的数据
*/
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table开始到结束
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 1; j < 5; j++) {
System.out.println("===============================第"+(j)+"条数据=====================================");
TableRow tr = (TableRow) rows[j];
if (tr.getAttribute("align") != null
&& tr.getAttribute("align").equalsIgnoreCase(
"center")) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 1) {
System.out.println("对不起,没有你要查询的记录");
} else {
String title="";
for (int k = 0; k < td.length; k++) {
title+=td[k].toPlainTextString().trim()+" |";
if(k==11){
System.out.println("标题:"+title);
String tdhtml = td[1].toHtml().trim();
//得到标题 URL 并抓取详细信息
getDetailURL(tdhtml);
}
}
}
}
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 得到标题URL
* @param urlHtml
* @return
* @throws Exception
*/
public static String getDetailURL(String urlHtml) throws Exception{
Parser aParser = new Parser(urlHtml);
NodeList nodeList = aParser.extractAllNodesThatMatch(new NodeFilter(){
// 实现该方法,用以过滤标签
public boolean accept(Node node)
{
if (node instanceof LinkTag)// 标记
return true;
return false;
}
});
String titelUrl = "";
for (int i = 0; i < nodeList.size(); i++)
{
LinkTag n = (LinkTag) nodeList.elementAt(i);
titelUrl = n.extractLink();
}
String url = "http://www.bankrate.com.cn"+titelUrl;
try {
//根据url抓取 详细信息
getDetail(url);
} catch (RuntimeException e) {
System.out.println("取详细信息时发生错误!");
e.printStackTrace();
}
return null;
}
/**
* 得到详细信息
* @param content
* @throws Exception
*/
public static void getDetail(String url) throws Exception {
String detailAllHtml = getWebHtml(url);
String tableDetailHtml = selHtmlTextByAllHtml(detailAllHtml);
Parser myParser = new Parser(tableDetailHtml);
NodeList nodeList = null;
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
/**
* 得到TABLE里面的数据
*/
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table开始到结束
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 0; j < rows.length; j++) {
TableRow tr = (TableRow) rows[j];
if (tr != null) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 0) {
System.out.println("对不起,没有你要查询的记录");
} else {
for (int k = 0; k < td.length; k++) {
System.out.println(td[k].toPlainTextString().trim());
}
}
}
}
System.out.println("=============================================================================");
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 生产页面代码为字符串
* @param url
* @return
*/
public static String getWebHtml(String url){
try {
URL myURL = new URL(url);
URLConnection conn = myURL.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String line = null;
StringBuffer document = new StringBuffer("");
while ((line = reader.readLine()) != null){
document.append(line + "\n");
}
reader.close();
String resutlDocument = new String(document);
return resutlDocument;
} catch (Exception e) {}
return "";
}
/**
* 删除input字符串中的html格式
*
* @param input
* @param length
* @return
*/
public static String splitAndFilterString(String input) {
if (input == null || input.trim().equals("")) {
return "";
}
// 去掉所有html元素,
String str = input.replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll(
"<[^>]*>", "");
str = str.replaceAll("[(/>)<]", "");
str = str.replaceAll(" ", "");
str = str.replaceAll("\\r", "");
str = str.replaceAll("\\n", "");
str = str.replaceAll("\\t", "");
return str;
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
* 理财产品大全-银率网数据 抓取
* @author Administrator
*
*/
public class test{
public static void main(String[] args) throws Exception {
String str=getWebHtml("http://www.bankrate.com.cn/financing/grade/bank/0/expect/0/type/0/MinAmount/0/status/0/limit/0/area/-1/Currency/0/ReturnType/0/direction/DESC/isFc/0/isMDA/0/field/3/page/1");
String tabletag = selHtmlTextByAllHtml(str);
testTable(tabletag);
}
/**
* 从allhtml文本中得到
* @param allhtml
* @return
* @throws ParserException
*/
public static String selHtmlTextByAllHtml(String allhtml) throws ParserException{
Parser myParser = new Parser(allhtml);
myParser.setEncoding( "UTF-8" );
NodeFilter filter = new TagNameFilter("table");
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
TableTag tabletag = (TableTag) nodeList.elementAt(0);
// System.out.println(tabletag.toHtml().toString());
return tabletag.toHtml().toString();
}
/**
* 对TABLE 的解析
* @throws Exception
*
*/
public static void testTable(String tablehtml) throws Exception {
Parser myParser = new Parser(tablehtml);
NodeList nodeList = null;
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
/**
* 得到TABLE里面的数据
*/
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table开始到结束
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 1; j < 5; j++) {
System.out.println("===============================第"+(j)+"条数据=====================================");
TableRow tr = (TableRow) rows[j];
if (tr.getAttribute("align") != null
&& tr.getAttribute("align").equalsIgnoreCase(
"center")) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 1) {
System.out.println("对不起,没有你要查询的记录");
} else {
String title="";
for (int k = 0; k < td.length; k++) {
title+=td[k].toPlainTextString().trim()+" |";
if(k==11){
System.out.println("标题:"+title);
String tdhtml = td[1].toHtml().trim();
//得到标题 URL 并抓取详细信息
getDetailURL(tdhtml);
}
}
}
}
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 得到标题URL
* @param urlHtml
* @return
* @throws Exception
*/
public static String getDetailURL(String urlHtml) throws Exception{
Parser aParser = new Parser(urlHtml);
NodeList nodeList = aParser.extractAllNodesThatMatch(new NodeFilter(){
// 实现该方法,用以过滤标签
public boolean accept(Node node)
{
if (node instanceof LinkTag)// 标记
return true;
return false;
}
});
String titelUrl = "";
for (int i = 0; i < nodeList.size(); i++)
{
LinkTag n = (LinkTag) nodeList.elementAt(i);
titelUrl = n.extractLink();
}
String url = "http://www.bankrate.com.cn"+titelUrl;
try {
//根据url抓取 详细信息
getDetail(url);
} catch (RuntimeException e) {
System.out.println("取详细信息时发生错误!");
e.printStackTrace();
}
return null;
}
/**
* 得到详细信息
* @param content
* @throws Exception
*/
public static void getDetail(String url) throws Exception {
String detailAllHtml = getWebHtml(url);
String tableDetailHtml = selHtmlTextByAllHtml(detailAllHtml);
Parser myParser = new Parser(tableDetailHtml);
NodeList nodeList = null;
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
/**
* 得到TABLE里面的数据
*/
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table开始到结束
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 0; j < rows.length; j++) {
TableRow tr = (TableRow) rows[j];
if (tr != null) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 0) {
System.out.println("对不起,没有你要查询的记录");
} else {
for (int k = 0; k < td.length; k++) {
System.out.println(td[k].toPlainTextString().trim());
}
}
}
}
System.out.println("=============================================================================");
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 生产页面代码为字符串
* @param url
* @return
*/
public static String getWebHtml(String url){
try {
URL myURL = new URL(url);
URLConnection conn = myURL.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String line = null;
StringBuffer document = new StringBuffer("");
while ((line = reader.readLine()) != null){
document.append(line + "\n");
}
reader.close();
String resutlDocument = new String(document);
return resutlDocument;
} catch (Exception e) {}
return "";
}
/**
* 删除input字符串中的html格式
*
* @param input
* @param length
* @return
*/
public static String splitAndFilterString(String input) {
if (input == null || input.trim().equals("")) {
return "";
}
// 去掉所有html元素,
String str = input.replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll(
"<[^>]*>", "");
str = str.replaceAll("[(/>)<]", "");
str = str.replaceAll(" ", "");
str = str.replaceAll("\\r", "");
str = str.replaceAll("\\n", "");
str = str.replaceAll("\\t", "");
return str;
}
}
#1
要求太过笼统,不是很清楚,UP UP
#2
public static void main(String args[]){
try{
/*声明字符串strLine,用于读取一行信息*/
String strLine;
/*声明url对象,该对象将连接到清华邮箱网页上*/
URL urlObj = new URL("http://localhost:8080/ceshi/2.html");
/*将通过URL对象的openStream方法获得的InputStream对象赋给streamObj*/
InputStream streamObj = urlObj.openStream();
/*通过上面的streamObj生成InputStreamReader类对象readerObj*/
InputStreamReader readerObj = new InputStreamReader(streamObj);
/*生成BufferedReader类对象buffObj*/
BufferedReader buffObj = new BufferedReader(readerObj);
/*while循环用于读取URL对象指定的HTML文件内容,按行读取*/
while((strLine = buffObj.readLine())!=null)
System.out.println(strLine);
/*下面的语句将连接关闭*/
buffObj.close();
}catch(MalformedURLException e){
System.err.println("url error");
}catch(IOException e){
System.out.println("IO error");
}
}
try{
/*声明字符串strLine,用于读取一行信息*/
String strLine;
/*声明url对象,该对象将连接到清华邮箱网页上*/
URL urlObj = new URL("http://localhost:8080/ceshi/2.html");
/*将通过URL对象的openStream方法获得的InputStream对象赋给streamObj*/
InputStream streamObj = urlObj.openStream();
/*通过上面的streamObj生成InputStreamReader类对象readerObj*/
InputStreamReader readerObj = new InputStreamReader(streamObj);
/*生成BufferedReader类对象buffObj*/
BufferedReader buffObj = new BufferedReader(readerObj);
/*while循环用于读取URL对象指定的HTML文件内容,按行读取*/
while((strLine = buffObj.readLine())!=null)
System.out.println(strLine);
/*下面的语句将连接关闭*/
buffObj.close();
}catch(MalformedURLException e){
System.err.println("url error");
}catch(IOException e){
System.out.println("IO error");
}
}
#3
我做爬虫开发用地一个测试类
我用的是httpUnit 加 java正则表达式
实现垂直抓取的
我用的是httpUnit 加 java正则表达式
实现垂直抓取的
#4
代码:
package test;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.meterware.httpunit.ClientProperties;
import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebResponse;
public class MatchSingleUrl {
public static void main(String[] args) {
System.out
.println(getMatchString(
"网友推荐[\\d\\D]{1,350}class=\"B\">([\\d\\D]*)</a><span class=\"dishNum\">|推荐菜: ([^<]*)",
getWebpageSource("http://www.dianping.com/shop/1916656")));
}
/**
*
* 获得网页源码 create date:2008-11-24 author:Administrator
*
* @param url:网页的url
* @return
*/
public static String getWebpageSource(String url) {
// Map<String, String> map = null;// 保存一行结果
// List<Map> list = new ArrayList<Map>();// 保存所有结果
WebConversation wc = new WebConversation();
ClientProperties client = wc.getClientProperties();
// 设置代理
client
.setUserAgent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; "
+ "SV1; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)");
WebResponse response = null;
String text = null;
try {
response = wc.getResource(new GetMethodWebRequest(url));
text = response.getText();
// System.out.println(text);
} catch (IOException e) {
e.printStackTrace();
}
return text;
}
/**
* 获得指定正则表达式匹配指定字符串后的匹配结果 create date:2008-11-24 author:Administrator
*
* @param regex
* 正则表达式
* @param source
* 正则表达式要匹配的内容
* @return
*/
public static String getMatchString(String regex, String text) {
Pattern p = null;
Matcher m = null;
int counter = 0;
String value = "";
int index = 0;
boolean independence = false;
if (regex != null) {
p = Pattern.compile(regex);
m = p.matcher(text);
index = m.groupCount();
while (m.find() && index > 1) {
String str = m.group();
System.out.println(str);
value += str;
}
} else {
System.out.println("这条正则表达式没有定义:" + regex);
}
System.out.println(value);
return value;
}
}
package test;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.meterware.httpunit.ClientProperties;
import com.meterware.httpunit.GetMethodWebRequest;
import com.meterware.httpunit.WebConversation;
import com.meterware.httpunit.WebResponse;
public class MatchSingleUrl {
public static void main(String[] args) {
System.out
.println(getMatchString(
"网友推荐[\\d\\D]{1,350}class=\"B\">([\\d\\D]*)</a><span class=\"dishNum\">|推荐菜: ([^<]*)",
getWebpageSource("http://www.dianping.com/shop/1916656")));
}
/**
*
* 获得网页源码 create date:2008-11-24 author:Administrator
*
* @param url:网页的url
* @return
*/
public static String getWebpageSource(String url) {
// Map<String, String> map = null;// 保存一行结果
// List<Map> list = new ArrayList<Map>();// 保存所有结果
WebConversation wc = new WebConversation();
ClientProperties client = wc.getClientProperties();
// 设置代理
client
.setUserAgent("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; "
+ "SV1; .NET CLR 1.1.4322; InfoPath.2; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)");
WebResponse response = null;
String text = null;
try {
response = wc.getResource(new GetMethodWebRequest(url));
text = response.getText();
// System.out.println(text);
} catch (IOException e) {
e.printStackTrace();
}
return text;
}
/**
* 获得指定正则表达式匹配指定字符串后的匹配结果 create date:2008-11-24 author:Administrator
*
* @param regex
* 正则表达式
* @param source
* 正则表达式要匹配的内容
* @return
*/
public static String getMatchString(String regex, String text) {
Pattern p = null;
Matcher m = null;
int counter = 0;
String value = "";
int index = 0;
boolean independence = false;
if (regex != null) {
p = Pattern.compile(regex);
m = p.matcher(text);
index = m.groupCount();
while (m.find() && index > 1) {
String str = m.group();
System.out.println(str);
value += str;
}
} else {
System.out.println("这条正则表达式没有定义:" + regex);
}
System.out.println(value);
return value;
}
}
#5
学习了,好贴
#6
用htmlparse抓取网页中的内容
package com.rsstest;
import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.tags.ParagraphTag;
import org.htmlparser.util.NodeIterator;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
import org.htmlparser.util.SimpleNodeIterator;
public class HtmltestSohu {
public static void main(String[] args) throws Exception {
//
System.out.println(extractText("http://go.rss.sina.com.cn/redirect.php?url=http://finance.sina.com.cn/stock/jsy/20090410/16506089680.shtml"));
//System.out.println(extractText("http://news.163.com/08/1205/16/4SDOG7CE0001121M.html"));
}
public static String extractText(String url) {
StringBuffer returnText = new StringBuffer();
//使用解析目标的URL地址构造一个Parser
Parser parser;
try {
parser = new Parser(url);
parser.setEncoding("EUC-CN");
//构造一个接点LIST,对于htmlparser来说,任何一个HTML标签都是一个Node
NodeList collectionList = new NodeList();
//构造一个段落过录规则过路节点
NodeClassFilter filter = new NodeClassFilter(ParagraphTag.class);
for (NodeIterator e = parser.elements(); e.hasMoreNodes();)
//根据段落过滤规则将过滤后的节点放入新构造的节点LIST中
e.nextNode().collectInto(collectionList, filter);
for (SimpleNodeIterator e = collectionList.elements(); e
.hasMoreNodes();) {
Node node = e.nextNode();
if (node.getChildren() != null
&& node.getChildren().size() == 1) {
//判断该节点内容对应的html文本值是否包含“http://”
if (!(node.getChildren().toHtml().indexOf("http://") > -1)) {
//不包含则将文本值加进来
returnText.append(node.getChildren().toHtml()).append("\n");
}
}
}
} catch (ParserException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
return returnText.toString();
}
}
#7
学习~
#8
http://blog.csdn.net/rrong_m很多htmlparser的例子
#9
谢谢了,请问怎样把抓取的数据过滤并导入到数据库里呢?
#10
还有我要的是怎样抓取某个站点的信息。不是单纯的一个页面哦
#11
这就是需要考虑很多东西了。。一个整站或几个整站信息你可以考虑蜘蛛了。heritrix
#12
只抓取一个站点内容,请问有heritrix的例子吗,给贴点好吗
#13
heritrix就是配置安装然后对做些基本的设置就行了。这个有web界面网上很多例子吧。。反正抓一个整站挺麻烦的。首先得到这个这个网站的所有链接这是第一步,然后下载内容 根据你想要的过滤。说着挺简单做的话会有很多问题的。
#14
还有其他的方法吗?htmlparser能实现抓取某一网站上的数据并导入到数据库里吗?我只找了些抓取某一网页的代码
#15
抓取某一网站现成的代码没有 可以为楼主提供一个思路 一般是先通过网站的首页去把该首页上的网址全部抓取下来 然后递归去抓取抓到的网址上的网页内容 这里可以设置一个深度控制递归调用的次数也就是抓取的深度 然后抓取到内容后还要指定过滤规则去过滤那些广告等垃圾信息 我们公司最开始也准备做个类似的工具来抓取新闻 后来发现工作量比较大放弃了 直接花钱买的别人专业的爬虫工具
#16
哦
#17
整站和这个网站中的某一类是不一样的。。
比如一个CMS。他有很多文章,文章又分很多类别比如(JAVA类,J2EE类)但这些文章的基本的HTML源代码还是一样的(比如在一个固定TABLE里面存放的是文章内容)可以根据这个来实现htmlparser 如果想抓取整站而且几乎找不到相同的代码那就考虑用蜘蛛吧。下载下来。。分析。。
你可以发个网站我看看,想抓些什么东西~
比如一个CMS。他有很多文章,文章又分很多类别比如(JAVA类,J2EE类)但这些文章的基本的HTML源代码还是一样的(比如在一个固定TABLE里面存放的是文章内容)可以根据这个来实现htmlparser 如果想抓取整站而且几乎找不到相同的代码那就考虑用蜘蛛吧。下载下来。。分析。。
你可以发个网站我看看,想抓些什么东西~
#18
dom4j获取节点。json,response传输
#19
抓些静态页面上的东西,例如:某站的全部小说信息(是生成了静态页面的)
#20
呵呵。这个不难。
只要一个网站。应该没问题。你发下网站我看看吧。~
只要一个网站。应该没问题。你发下网站我看看吧。~
#21
这个和静态页面没什么多大关系~
#22
怎样才能抓取整站的信息,并分析出有用的信息添加到数据库里呢?继续问
#23
强 学习...
#24
继续问???
#25
呵呵 老哥 厉害哈
偶像呀 。。我崇拜你哦
偶像呀 。。我崇拜你哦
#26
學習了﹗
#27
继续问???
#28
如果自己实现的话,很复杂,需要很多东西,比如页面源代码分析,正则表达式等等。
建议选取现成的框架。
建议选取现成的框架。
#29
强悍啊!和大家一起学习吧!
#30
用什么框架呢?
#31
htmlparser常用代码
取得一段html代码里面所有的链接C#版本,java版本类似:
string htmlcode = "<HTML><HEAD><TITLE>AAA</TITLE></HEAD><BODY>" + ...... + "</BODY></HTML>";
Parser parser = Parser.CreateParser(htmlcode, "GBK");
HtmlPage page = new HtmlPage(parser);
try
{ parser.VisitAllNodesWith(page);}
catch (ParserException e1)
{ e1 = null;}
NodeList nodelist = page.Body;
NodeFilter filter = new TagNameFilter("A");
nodelist = nodelist.ExtractAllNodesThatMatch(filter, true);
for (int i = 0; i < nodelist.Size(); i++)
{
LinkTag link=(LinkTag) nodelist.ElementAt(i);
System.Console.Write(link.GetAttribute("href") + "\n");
}
#32
请高手指点,继续问???
#33
我看了你给我的那个网站了。。不好弄,前提是你不知道他所有的点 就没发得到它的所有的路线,抓取我认为是够呛了。你可以换个思路了。如果有所有的点就可以实现。
#34
#35
我能抓取到他们的所有点!
#36
抓到所有点就可以了就等于有了所有的链接。*组合吧。哈哈~ 这个是生成后的链接http://beijing.8684.cn/h_%CE%BA%B9%AB%B4%E5_%C9%CF%B5%D8%CE%E5%BD%D6 用所有的地点构造这个链接 URLEncode 然后可以直接请求了Parser p=new Parser(url) 根据生成的页面提取就行了。。(没有换乘方案,也许是以下原因的中一个:
您要查询的路线要转三次车以上,本站只提供两次转车,如有不便,请见谅!
没有输入准确的站点名称,你可以从输入提示站点中选取站点来查询
)多线程跑很快的。。况且页面不大,信息抓的很快。
您要查询的路线要转三次车以上,本站只提供两次转车,如有不便,请见谅!
没有输入准确的站点名称,你可以从输入提示站点中选取站点来查询
)多线程跑很快的。。况且页面不大,信息抓的很快。
#37
我抓取过,例子 http://www.seo-fang.cn/post/LUCENE-e5819ae4b880e4b8aae585a8e69687e6909ce7b4a2.aspx
#38
好的,我看看
#39
继续问???
37楼的职能实现简单1个页面的抓取
37楼的职能实现简单1个页面的抓取
#40
继续问???
#41
建议楼主学习一下 heritrix
#42
楼主研究出来了吗? 加我交流一下咯 QQ97219684
#43
楼主,打扰哈,我想请问一下在非开发环境下配置的heritrix可以对数据处理吗??
#44
有没有用asp.net实现的例子???求代码。
#45
package com.eroadsoftware.Webdatagrab;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
* 理财产品大全-银率网数据 抓取
* @author Administrator
*
*/
public class test{
public static void main(String[] args) throws Exception {
String str=getWebHtml("http://www.bankrate.com.cn/financing/grade/bank/0/expect/0/type/0/MinAmount/0/status/0/limit/0/area/-1/Currency/0/ReturnType/0/direction/DESC/isFc/0/isMDA/0/field/3/page/1");
String tabletag = selHtmlTextByAllHtml(str);
testTable(tabletag);
}
/**
* 从allhtml文本中得到
* @param allhtml
* @return
* @throws ParserException
*/
public static String selHtmlTextByAllHtml(String allhtml) throws ParserException{
Parser myParser = new Parser(allhtml);
myParser.setEncoding( "UTF-8" );
NodeFilter filter = new TagNameFilter("table");
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
TableTag tabletag = (TableTag) nodeList.elementAt(0);
// System.out.println(tabletag.toHtml().toString());
return tabletag.toHtml().toString();
}
/**
* 对TABLE 的解析
* @throws Exception
*
*/
public static void testTable(String tablehtml) throws Exception {
Parser myParser = new Parser(tablehtml);
NodeList nodeList = null;
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
/**
* 得到TABLE里面的数据
*/
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table开始到结束
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 1; j < 5; j++) {
System.out.println("===============================第"+(j)+"条数据=====================================");
TableRow tr = (TableRow) rows[j];
if (tr.getAttribute("align") != null
&& tr.getAttribute("align").equalsIgnoreCase(
"center")) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 1) {
System.out.println("对不起,没有你要查询的记录");
} else {
String title="";
for (int k = 0; k < td.length; k++) {
title+=td[k].toPlainTextString().trim()+" |";
if(k==11){
System.out.println("标题:"+title);
String tdhtml = td[1].toHtml().trim();
//得到标题 URL 并抓取详细信息
getDetailURL(tdhtml);
}
}
}
}
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 得到标题URL
* @param urlHtml
* @return
* @throws Exception
*/
public static String getDetailURL(String urlHtml) throws Exception{
Parser aParser = new Parser(urlHtml);
NodeList nodeList = aParser.extractAllNodesThatMatch(new NodeFilter(){
// 实现该方法,用以过滤标签
public boolean accept(Node node)
{
if (node instanceof LinkTag)// 标记
return true;
return false;
}
});
String titelUrl = "";
for (int i = 0; i < nodeList.size(); i++)
{
LinkTag n = (LinkTag) nodeList.elementAt(i);
titelUrl = n.extractLink();
}
String url = "http://www.bankrate.com.cn"+titelUrl;
try {
//根据url抓取 详细信息
getDetail(url);
} catch (RuntimeException e) {
System.out.println("取详细信息时发生错误!");
e.printStackTrace();
}
return null;
}
/**
* 得到详细信息
* @param content
* @throws Exception
*/
public static void getDetail(String url) throws Exception {
String detailAllHtml = getWebHtml(url);
String tableDetailHtml = selHtmlTextByAllHtml(detailAllHtml);
Parser myParser = new Parser(tableDetailHtml);
NodeList nodeList = null;
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
/**
* 得到TABLE里面的数据
*/
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table开始到结束
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 0; j < rows.length; j++) {
TableRow tr = (TableRow) rows[j];
if (tr != null) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 0) {
System.out.println("对不起,没有你要查询的记录");
} else {
for (int k = 0; k < td.length; k++) {
System.out.println(td[k].toPlainTextString().trim());
}
}
}
}
System.out.println("=============================================================================");
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 生产页面代码为字符串
* @param url
* @return
*/
public static String getWebHtml(String url){
try {
URL myURL = new URL(url);
URLConnection conn = myURL.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String line = null;
StringBuffer document = new StringBuffer("");
while ((line = reader.readLine()) != null){
document.append(line + "\n");
}
reader.close();
String resutlDocument = new String(document);
return resutlDocument;
} catch (Exception e) {}
return "";
}
/**
* 删除input字符串中的html格式
*
* @param input
* @param length
* @return
*/
public static String splitAndFilterString(String input) {
if (input == null || input.trim().equals("")) {
return "";
}
// 去掉所有html元素,
String str = input.replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll(
"<[^>]*>", "");
str = str.replaceAll("[(/>)<]", "");
str = str.replaceAll(" ", "");
str = str.replaceAll("\\r", "");
str = str.replaceAll("\\n", "");
str = str.replaceAll("\\t", "");
return str;
}
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import org.htmlparser.Node;
import org.htmlparser.NodeFilter;
import org.htmlparser.Parser;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.OrFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.tags.TableColumn;
import org.htmlparser.tags.TableRow;
import org.htmlparser.tags.TableTag;
import org.htmlparser.util.NodeList;
import org.htmlparser.util.ParserException;
/**
* 理财产品大全-银率网数据 抓取
* @author Administrator
*
*/
public class test{
public static void main(String[] args) throws Exception {
String str=getWebHtml("http://www.bankrate.com.cn/financing/grade/bank/0/expect/0/type/0/MinAmount/0/status/0/limit/0/area/-1/Currency/0/ReturnType/0/direction/DESC/isFc/0/isMDA/0/field/3/page/1");
String tabletag = selHtmlTextByAllHtml(str);
testTable(tabletag);
}
/**
* 从allhtml文本中得到
* @param allhtml
* @return
* @throws ParserException
*/
public static String selHtmlTextByAllHtml(String allhtml) throws ParserException{
Parser myParser = new Parser(allhtml);
myParser.setEncoding( "UTF-8" );
NodeFilter filter = new TagNameFilter("table");
NodeList nodeList = myParser.extractAllNodesThatMatch(filter);
TableTag tabletag = (TableTag) nodeList.elementAt(0);
// System.out.println(tabletag.toHtml().toString());
return tabletag.toHtml().toString();
}
/**
* 对TABLE 的解析
* @throws Exception
*
*/
public static void testTable(String tablehtml) throws Exception {
Parser myParser = new Parser(tablehtml);
NodeList nodeList = null;
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
/**
* 得到TABLE里面的数据
*/
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table开始到结束
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 1; j < 5; j++) {
System.out.println("===============================第"+(j)+"条数据=====================================");
TableRow tr = (TableRow) rows[j];
if (tr.getAttribute("align") != null
&& tr.getAttribute("align").equalsIgnoreCase(
"center")) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 1) {
System.out.println("对不起,没有你要查询的记录");
} else {
String title="";
for (int k = 0; k < td.length; k++) {
title+=td[k].toPlainTextString().trim()+" |";
if(k==11){
System.out.println("标题:"+title);
String tdhtml = td[1].toHtml().trim();
//得到标题 URL 并抓取详细信息
getDetailURL(tdhtml);
}
}
}
}
}
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 得到标题URL
* @param urlHtml
* @return
* @throws Exception
*/
public static String getDetailURL(String urlHtml) throws Exception{
Parser aParser = new Parser(urlHtml);
NodeList nodeList = aParser.extractAllNodesThatMatch(new NodeFilter(){
// 实现该方法,用以过滤标签
public boolean accept(Node node)
{
if (node instanceof LinkTag)// 标记
return true;
return false;
}
});
String titelUrl = "";
for (int i = 0; i < nodeList.size(); i++)
{
LinkTag n = (LinkTag) nodeList.elementAt(i);
titelUrl = n.extractLink();
}
String url = "http://www.bankrate.com.cn"+titelUrl;
try {
//根据url抓取 详细信息
getDetail(url);
} catch (RuntimeException e) {
System.out.println("取详细信息时发生错误!");
e.printStackTrace();
}
return null;
}
/**
* 得到详细信息
* @param content
* @throws Exception
*/
public static void getDetail(String url) throws Exception {
String detailAllHtml = getWebHtml(url);
String tableDetailHtml = selHtmlTextByAllHtml(detailAllHtml);
Parser myParser = new Parser(tableDetailHtml);
NodeList nodeList = null;
NodeFilter tableFilter = new NodeClassFilter(TableTag.class);
OrFilter lastFilter = new OrFilter();
lastFilter.setPredicates(new NodeFilter[] { tableFilter });
/**
* 得到TABLE里面的数据
*/
try {
nodeList = myParser.parse(lastFilter);
// 可以从数据table开始到结束
for (int i = 0; i <= nodeList.size(); i++) {
if (nodeList.elementAt(i) instanceof TableTag) {
TableTag tag = (TableTag) nodeList.elementAt(i);
TableRow[] rows = tag.getRows();
for (int j = 0; j < rows.length; j++) {
TableRow tr = (TableRow) rows[j];
if (tr != null) {
TableColumn[] td = tr.getColumns();
// 对不起,没有你要查询的记录!
if (td.length == 0) {
System.out.println("对不起,没有你要查询的记录");
} else {
for (int k = 0; k < td.length; k++) {
System.out.println(td[k].toPlainTextString().trim());
}
}
}
}
System.out.println("=============================================================================");
}
}
} catch (ParserException e) {
e.printStackTrace();
}
}
/**
* 生产页面代码为字符串
* @param url
* @return
*/
public static String getWebHtml(String url){
try {
URL myURL = new URL(url);
URLConnection conn = myURL.openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"UTF-8"));
String line = null;
StringBuffer document = new StringBuffer("");
while ((line = reader.readLine()) != null){
document.append(line + "\n");
}
reader.close();
String resutlDocument = new String(document);
return resutlDocument;
} catch (Exception e) {}
return "";
}
/**
* 删除input字符串中的html格式
*
* @param input
* @param length
* @return
*/
public static String splitAndFilterString(String input) {
if (input == null || input.trim().equals("")) {
return "";
}
// 去掉所有html元素,
String str = input.replaceAll("\\&[a-zA-Z]{1,10};", "").replaceAll(
"<[^>]*>", "");
str = str.replaceAll("[(/>)<]", "");
str = str.replaceAll(" ", "");
str = str.replaceAll("\\r", "");
str = str.replaceAll("\\n", "");
str = str.replaceAll("\\t", "");
return str;
}
}