100分求解决网络蜘蛛报内存溢出问题的方法

夏日旋风里的小原子 2010-03-14 12:11:22
今天下午写了个网络蜘蛛程序,当抓取几个页面的时候,程序运行得很正常, 但是当抓取整个网站的时候,程序就会报内存溢出。下面是我的程序代码


public class MySelfInfo {

//存取抓取到的公司地址
public static ArrayList<String> companyMan=new ArrayList<String>();

public static void getRowBykeyword(String url,String keyword){
try {
//抓取我的关键字
Parser parser=new Parser(url);
TagNameFilter filter=new TagNameFilter("tr");
NodeList nodelist=parser.extractAllNodesThatMatch(filter); //每次都是这里报内存溢出
for(Node node : nodelist.toNodeArray()){
if(node instanceof TableRow){
TableRow row=(TableRow)node;
TableColumn[] columns=row.getColumns();
if(columns[0].toPlainTextString().trim().startsWith(keyword)){
companyMan.add(columns[1].toPlainTextString().trim());
}
}
}

//拿到超链接进行递归
Parser parserlink=new Parser(url);
TagNameFilter linkfilter=new TagNameFilter("a");
NodeList linklist=parserlink.extractAllNodesThatMatch(linkfilter);
for(Node node : linklist.toNodeArray()){
LinkTag linktag=(LinkTag)node;
//递归
getRowBykeyword(linktag.getLink(),keyword); }
} catch (ParserException e) {
e.printStackTrace();
}
}


public static void main(String[] args) {
getRowBykeyword("http://china.alibaba.com/","公司地址");
}

}

...全文
252 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 fengbj312 的回复:]

引用 8 楼 fanjin287659245 的回复:

引用 5 楼 hnxxhc 的回复:

解析整个页面很费内存,速度也不怎么样,最好用正则,除非正则办不到再考虑htmlparser


您具体是怎么样做的,是自己写socket,自己解析吗?

不用自己写sokect,获取页面代码可以用httpclient,然后根据需要用正则匹配你要的内容,如果页面结构非常复杂正则办不到……
[/Quote]
用正则表达式果然没有内存溢出,你太强了,谢谢你了。结贴给分
fengbj312 2010-03-18
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fanjin287659245 的回复:]

引用 5 楼 hnxxhc 的回复:

解析整个页面很费内存,速度也不怎么样,最好用正则,除非正则办不到再考虑htmlparser


您具体是怎么样做的,是自己写socket,自己解析吗?
[/Quote]
不用自己写sokect,获取页面代码可以用httpclient,然后根据需要用正则匹配你要的内容,如果页面结构非常复杂正则办不到就先用正则缩写范围,然后再用htmlparser解析,htmlparser解析会生成很多对象,像抓取这样的解析速度如果页面过大就很容易内存溢出了。
longlonglong25 2010-03-16
  • 打赏
  • 举报
回复
学习,学习,帮顶。。
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jamesliulyc 的回复:]

貌似你是死循环,测试到你的递归是死循环
[/Quote]

我做了相同路径判断,还是出现内存溢出
JamesLiu 2010-03-16
  • 打赏
  • 举报
回复
貌似你是死循环,测试到你的递归是死循环
xiachedan 2010-03-15
  • 打赏
  • 举报
回复
把异常贴出来
javafx 2010-03-15
  • 打赏
  • 举报
回复
没做过这方面的,帮顶
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hnxxhc 的回复:]

解析整个页面很费内存,速度也不怎么样,最好用正则,除非正则办不到再考虑htmlparser
[/Quote]

您具体是怎么样做的,是自己写socket,自己解析吗?
guo624587253 2010-03-15
  • 打赏
  • 举报
回复
这位仁兄 我也是用htmlparser 抓取网页 也出现了内存溢出,找不到解决的办法,我感觉你不要一次抓取,批量抓取。
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiachedan 的回复:]

把异常贴出来
[/Quote]
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Vector.<init>(Vector.java:111)
at java.util.Vector.<init>(Vector.java:124)
at java.util.Vector.<init>(Vector.java:133)
at org.htmlparser.lexer.Lexer.parseTag(Lexer.java:1002)
at org.htmlparser.lexer.Lexer.nextNode(Lexer.java:368)
at org.htmlparser.scanners.CompositeTagScanner.scan(CompositeTagScanner.java:110)
at org.htmlparser.util.IteratorImpl.nextNode(IteratorImpl.java:91)
at org.htmlparser.Parser.extractAllNodesThatMatch(Parser.java:767)
at ParserInfor.MySelfInfo.fillLinkQuen(MySelfInfo.java:85)
at ParserInfor.MySelfInfo.fillLinkQuen(MySelfInfo.java:99)
at ParserInfor.MySelfInfo.fillLinkQuen(MySelfInfo.java:99)
hnxxhc 2010-03-15
  • 打赏
  • 举报
回复
解析整个页面很费内存,速度也不怎么样,最好用正则,除非正则办不到再考虑htmlparser
fengbj312 2010-03-15
  • 打赏
  • 举报
回复
解析整个页面很费内存,速度也不怎么样,最好用正则,除非正则办不到再考虑htmlparser
  • 打赏
  • 举报
回复
真的没有人用过,问题解决立即散粉
lllwwt 2010-03-14
  • 打赏
  • 举报
回复
帮lz顶一下

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧