如何实现抓取某一网站上的数据并导入到数据库里?有人说可以用htmlparser?最好给点代码例子

时间:2021-07-13 19:05:04
如何实现抓取某一网站上的数据并导入到数据库里?有人说可以用htmlparser?最好给点代码例子

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");   
  }   
  }   

#3


我做爬虫开发用地一个测试类
我用的是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\">|推荐菜:&nbsp;([^<]*)",
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


引用 11 楼 rrong_m 的回复:
这就是需要考虑很多东西了。。一个整站或几个整站信息你可以考虑蜘蛛了。heritrix

只抓取一个站点内容,请问有heritrix的例子吗,给贴点好吗

#13


heritrix就是配置安装然后对做些基本的设置就行了。这个有web界面网上很多例子吧。。反正抓一个整站挺麻烦的。首先得到这个这个网站的所有链接这是第一步,然后下载内容 根据你想要的过滤。说着挺简单做的话会有很多问题的。

#14


还有其他的方法吗?htmlparser能实现抓取某一网站上的数据并导入到数据库里吗?我只找了些抓取某一网页的代码

#15


抓取某一网站现成的代码没有 可以为楼主提供一个思路  一般是先通过网站的首页去把该首页上的网址全部抓取下来 然后递归去抓取抓到的网址上的网页内容 这里可以设置一个深度控制递归调用的次数也就是抓取的深度 然后抓取到内容后还要指定过滤规则去过滤那些广告等垃圾信息 我们公司最开始也准备做个类似的工具来抓取新闻 后来发现工作量比较大放弃了 直接花钱买的别人专业的爬虫工具

#16


#17


引用 13 楼 rrong_m 的回复:
heritrix就是配置安装然后对做些基本的设置就行了。这个有web界面网上很多例子吧。。反正抓一个整站挺麻烦的。首先得到这个这个网站的所有链接这是第一步,然后下载内容 根据你想要的过滤。说着挺简单做的话会有很多问题的。
整站和这个网站中的某一类是不一样的。。
比如一个CMS。他有很多文章,文章又分很多类别比如(JAVA类,J2EE类)但这些文章的基本的HTML源代码还是一样的(比如在一个固定TABLE里面存放的是文章内容)可以根据这个来实现htmlparser   如果想抓取整站而且几乎找不到相同的代码那就考虑用蜘蛛吧。下载下来。。分析。。
你可以发个网站我看看,想抓些什么东西~

#18


dom4j获取节点。json,response传输

#19


引用 17 楼 rrong_m 的回复:
引用 13 楼 rrong_m 的回复:
heritrix就是配置安装然后对做些基本的设置就行了。这个有web界面网上很多例子吧。。反正抓一个整站挺麻烦的。首先得到这个这个网站的所有链接这是第一步,然后下载内容 根据你想要的过滤。说着挺简单做的话会有很多问题的。 

整站和这个网站中的某一类是不一样的。。 
比如一个CMS。他有很多文章,文章又分很多类别比如(JAVA类,J2EE类)但这些文章的基本的HTML源代码还是一样的(比如在一个固…

抓些静态页面上的东西,例如:某站的全部小说信息(是生成了静态页面的)

#20


呵呵。这个不难。
只要一个网站。应该没问题。你发下网站我看看吧。~

#21


这个和静态页面没什么多大关系~

#22


怎样才能抓取整站的信息,并分析出有用的信息添加到数据库里呢?继续问

#23


强 学习...

#24


继续问???

#25


呵呵 老哥 厉害哈
  偶像呀 。。我崇拜你哦

#26


學習了﹗

#27


继续问???

#28


如果自己实现的话,很复杂,需要很多东西,比如页面源代码分析,正则表达式等等。

建议选取现成的框架。

#29


强悍啊!和大家一起学习吧!

#30


引用 28 楼 ldg_2 的回复:
如果自己实现的话,很复杂,需要很多东西,比如页面源代码分析,正则表达式等等。 

建议选取现成的框架。

用什么框架呢?

#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


该回复于2009-07-18 00:13:59被版主删除

#35


引用 33 楼 rrong_m 的回复:
我看了你给我的那个网站了。。不好弄,前提是你不知道他所有的点 就没发得到它的所有的路线,抓取我认为是够呛了。你可以换个思路了。如果有所有的点就可以实现。

我能抓取到他们的所有点!

#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


引用 37 楼 huhai123 的回复:
我抓取过,例子 http://www.seo-fang.cn/post/LUCENE-e5819ae4b880e4b8aae585a8e69687e6909ce7b4a2.aspx

好的,我看看

#39


继续问???
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;   
 }
}

#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");   
  }   
  }   

#3


我做爬虫开发用地一个测试类
我用的是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\">|推荐菜:&nbsp;([^<]*)",
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


引用 11 楼 rrong_m 的回复:
这就是需要考虑很多东西了。。一个整站或几个整站信息你可以考虑蜘蛛了。heritrix

只抓取一个站点内容,请问有heritrix的例子吗,给贴点好吗

#13


heritrix就是配置安装然后对做些基本的设置就行了。这个有web界面网上很多例子吧。。反正抓一个整站挺麻烦的。首先得到这个这个网站的所有链接这是第一步,然后下载内容 根据你想要的过滤。说着挺简单做的话会有很多问题的。

#14


还有其他的方法吗?htmlparser能实现抓取某一网站上的数据并导入到数据库里吗?我只找了些抓取某一网页的代码

#15


抓取某一网站现成的代码没有 可以为楼主提供一个思路  一般是先通过网站的首页去把该首页上的网址全部抓取下来 然后递归去抓取抓到的网址上的网页内容 这里可以设置一个深度控制递归调用的次数也就是抓取的深度 然后抓取到内容后还要指定过滤规则去过滤那些广告等垃圾信息 我们公司最开始也准备做个类似的工具来抓取新闻 后来发现工作量比较大放弃了 直接花钱买的别人专业的爬虫工具

#16


#17


引用 13 楼 rrong_m 的回复:
heritrix就是配置安装然后对做些基本的设置就行了。这个有web界面网上很多例子吧。。反正抓一个整站挺麻烦的。首先得到这个这个网站的所有链接这是第一步,然后下载内容 根据你想要的过滤。说着挺简单做的话会有很多问题的。
整站和这个网站中的某一类是不一样的。。
比如一个CMS。他有很多文章,文章又分很多类别比如(JAVA类,J2EE类)但这些文章的基本的HTML源代码还是一样的(比如在一个固定TABLE里面存放的是文章内容)可以根据这个来实现htmlparser   如果想抓取整站而且几乎找不到相同的代码那就考虑用蜘蛛吧。下载下来。。分析。。
你可以发个网站我看看,想抓些什么东西~

#18


dom4j获取节点。json,response传输

#19


引用 17 楼 rrong_m 的回复:
引用 13 楼 rrong_m 的回复:
heritrix就是配置安装然后对做些基本的设置就行了。这个有web界面网上很多例子吧。。反正抓一个整站挺麻烦的。首先得到这个这个网站的所有链接这是第一步,然后下载内容 根据你想要的过滤。说着挺简单做的话会有很多问题的。 

整站和这个网站中的某一类是不一样的。。 
比如一个CMS。他有很多文章,文章又分很多类别比如(JAVA类,J2EE类)但这些文章的基本的HTML源代码还是一样的(比如在一个固…

抓些静态页面上的东西,例如:某站的全部小说信息(是生成了静态页面的)

#20


呵呵。这个不难。
只要一个网站。应该没问题。你发下网站我看看吧。~

#21


这个和静态页面没什么多大关系~

#22


怎样才能抓取整站的信息,并分析出有用的信息添加到数据库里呢?继续问

#23


强 学习...

#24


继续问???

#25


呵呵 老哥 厉害哈
  偶像呀 。。我崇拜你哦

#26


學習了﹗

#27


继续问???

#28


如果自己实现的话,很复杂,需要很多东西,比如页面源代码分析,正则表达式等等。

建议选取现成的框架。

#29


强悍啊!和大家一起学习吧!

#30


引用 28 楼 ldg_2 的回复:
如果自己实现的话,很复杂,需要很多东西,比如页面源代码分析,正则表达式等等。 

建议选取现成的框架。

用什么框架呢?

#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


该回复于2009-07-18 00:13:59被版主删除

#35


引用 33 楼 rrong_m 的回复:
我看了你给我的那个网站了。。不好弄,前提是你不知道他所有的点 就没发得到它的所有的路线,抓取我认为是够呛了。你可以换个思路了。如果有所有的点就可以实现。

我能抓取到他们的所有点!

#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


引用 37 楼 huhai123 的回复:
我抓取过,例子 http://www.seo-fang.cn/post/LUCENE-e5819ae4b880e4b8aae585a8e69687e6909ce7b4a2.aspx

好的,我看看

#39


继续问???
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;   
 }
}