今天下午写了个网络蜘蛛程序,当抓取几个页面的时候,程序运行得很正常, 但是当抓取整个网站的时候,程序就会报内存溢出。下面是我的程序代码
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/","公司地址");
    }}

解决方案 »

  1.   

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

  2.   

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

  3.   

    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)
      

  4.   

    这位仁兄 我也是用htmlparser 抓取网页 也出现了内存溢出,找不到解决的办法,我感觉你不要一次抓取,批量抓取。
      

  5.   


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

  6.   

    不用自己写sokect,获取页面代码可以用httpclient,然后根据需要用正则匹配你要的内容,如果页面结构非常复杂正则办不到就先用正则缩写范围,然后再用htmlparser解析,htmlparser解析会生成很多对象,像抓取这样的解析速度如果页面过大就很容易内存溢出了。