`
沙漠绿树
  • 浏览: 425723 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

网页抓取内存溢出

阅读更多
引用
    最经一直在做网页抓取工作,使用了自己写的HTML解析器。但是有个问题,就是在得到网页的html代码的时候老报内存溢出,结果程序总是停下来。以下是报的异常代码:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
        at java.util.Arrays.copyOf(Arrays.java:2882)
        at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
        at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
        at java.lang.StringBuffer.append(StringBuffer.java:224)
        at slcx.com.WebPage.<init>(WebPage.java:67)
        at slcx.stock.gegu.baidu.ExtBdGgHisRecInfo.执行百度个股历史抓取(ExtBdGgHisRecInfo.java:199)
        at slcx.stock.gegu.baidu.ExtBdGgHisRecInfo.main(ExtBdGgHisRecInfo.java:272)


引用
以下是得到网页html代码的类:WebPage


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

public class WebPage {
	private int connectOutTime = 5000;//链接超时时间
	private int readOutTime = 10000; //读取超时时间

	private String encoding = "gb2312";//网页内容编码
	private String webPageCode = "";//网页代码
	
	private int searchEnd = 0;// 查找最后的 索引
	private int beginIndex = 0;// 开始 索引
	
	public WebPage(String link) throws Exception {
		
		URL url = new URL(link);
		HttpURLConnection httpconn = (HttpURLConnection) url.openConnection();

		httpconn.setConnectTimeout(connectOutTime);
		httpconn.setReadTimeout(readOutTime);

		BufferedReader br = new BufferedReader(new InputStreamReader(httpconn.getInputStream(), encoding));

		StringBuffer sb = new StringBuffer();
		String line = br.readLine();

		while (line != null) {
			sb.append(line + "\r\n");
			line = br.readLine();
		}
		
		webPageCode = sb.toString();
		this.searchEnd=sb.length();
	}
	
	public String getWebPageCode() {
		return webPageCode;
	}
}


引用
以下是是用这个WebPage类的方法,就是用这个方法,老报异常。

public void 执行百度个股历史抓取() {
		DBConnection dbc = new DBConnection();

		人员基本信息DAO ryjDao = new 人员基本信息DAO(dbc);
		HashMap<String, Integer> splNameIdMap = ryjDao.得到荐股者名称和编号();

		StockDAO stcDao = new StockDAO(dbc);
		HashMap<String, String> stcNameCodeMap = stcDao.得到股票名称代码();

		生成百度链接DAO scbDao = new 生成百度链接DAO(dbc);
		百度股票信息采集DAO bdgDao = new 百度股票信息采集DAO(dbc);
		ExtBdGgLnk bdg = new ExtBdGgLnk();

		String datetimer=Date.get("yyyy-MM-dd HH:mm:ss");
		
		Iterator<String> iter = splNameIdMap.keySet().iterator(); //iter长度有2100个左右
		while (iter.hasNext()) {

			String name = iter.next();
			int id = splNameIdMap.get(name);

			ArrayList<String> bdLinklist = scbDao.得到指定推荐者百度URL(id, name, 0);
			if (bdLinklist == null || bdLinklist.isEmpty()) {
				log.info("得到 "+name+ " 的百度搜索结果链接为空");
				continue;
			}
			for (String bdLink : bdLinklist) {

				log.info("现在抓取 " + name +" 的百度链接:" + bdLink);

				ArrayList<String> linkList = bdg.getAllSearchLink(bdLink);
				if (linkList == null || linkList.isEmpty()) {
					log.info("该百度链接没有搜索结果:" + bdLink);
					continue;
				}

				for (String link : linkList) {
					log.info("现在开始抓:" + link + "的荐股信息信息");
					int flag = bdgDao.插入链接(name,link,datetimer);
					if (flag == 2) {
						continue;
					}

					if (!isValidateLink(link)){
						log.info("无效链接:"+link);
						continue;
					}
					
					String webPageCode=null;
					try {
						WebPage web=new WebPage(link);
						webPageCode = web.getWebPageCode();
					} catch (Exception e) {
						e.printStackTrace();
					}					
					if (webPageCode == null || webPageCode.equals("")){
						log.info("该链接没有得到网页代码:"+link);
						continue;
					}
					
					String datetime = 得到推荐股票时间(webPageCode);
					if (datetime == null || datetime.equals("")||datetime.compareTo("2008-01-01 00:00:00")<0){
						log.info("该链接的时间无效:"+link);
						continue;
					}
					
					String stockcode = 得到推荐股票代码(webPageCode, name,splNameIdMap, stcNameCodeMap);
					if (stockcode == null || stockcode.equals("")){
						log.info("该链接得到股票代码无效:"+link);
						continue;
					}

					if (flag > 0) {
						int row = bdgDao.更新一条荐股信息(stockcode, name, datetime,link, 0);
						if (row > 0) {
							log.info("成功抓取一条荐股:" + name + "\t" + datetime + "\t"+ stockcode + "\t" + link);
						} else {
							log.info("荐股信息插入失败:" + link);
						}
					}
				}
				scbDao.修改运行过的百度URL(bdLink, 1);
			}
		}

		dbc.close();
	}



分享到:
评论
3 楼 沙漠绿树 2009-02-06  
CoolinZ 写道

使用中文方法名 很有创意slcx.stock.gegu.baidu.ExtBdGgHisRecInfo.执行百度个股历史抓取(ExtBdGgHisRecInfo.java:199) 这个是哪一行?

使用中文名是领导要求。
2 楼 xuyao 2009-02-06  
有开源的,htmlparser之流都很好用
1 楼 CoolinZ 2009-02-05  
使用中文方法名 很有创意

slcx.stock.gegu.baidu.ExtBdGgHisRecInfo.执行百度个股历史抓取(ExtBdGgHisRecInfo.java:199) 这个是哪一行?

相关推荐

    网页抓取软件(-------)

    网页抓取软件 网页抓取软件 网页抓取软件

    c# 网页抓取分析 表格图形生成

    c# 网页抓取分析 表格图形生成 数据挖掘

    淘宝网页抓取与统计分析软件

    淘宝网页抓取分析器说明 启动方法—— 将DLL和EXE解压到同一个文件夹,直接运行Exe,打开软件。(运行环境:Windows,DotNet3.5以上环境) 功能说明—— 本软件功能强大,相对于其它网页抓取或爬虫软件的优点,不仅...

    asp.net 网页抓取技术

    asp.net 网页抓取技术 实现对别的网页title等的抓取

    java网页抓取数据

    java网页抓取数据

    网页抓取工具metastudio

    MetaSeeker是一个Web网页抓取/数据抽取/页面信息提取工具包,能够按照用户的指导,从Web页面上筛选出需要的信息,并输出含有语义结构的提取结果文件(XML文件),众所周知,Web页面显示的信息是给人阅读的,对于机器...

    java进行网页抓取

    java程序,能进行简单的网页抓取,及数据抓取,里面还有火车采集器的内容

    基于C# 网页信息抓取

    本程序编写了一个从网页中抓取信息(如最新的头条新闻,新闻的来源,标题,内容等)的类,而且本程序文件夹中含有word文件,文件将介绍如何使用这个类来抓取网页中需要的信息。文件将以抓取博客园首页的博客标题和...

    抓取游戏内存基数 抓取游戏内存基数

    抓取游戏内存基数 抓取游戏内存基数 抓取游戏内存基数

    C++实现网页抓取

    最简单的C++实现网页抓取的代码。很容易看懂。容易移植到spider中

    Snoopy_PHP网页抓取工具

    Snoopy_PHP网页抓取工具 snoopy是一个php类,用来模仿web浏览器的功能,它能完成获取网页内容和发送表单的任务。

    fiddler最新网页抓取神器

    免费网页抓取神器最新版本,网页源码抓取准确,万能追踪定位

    网页FLASH抓取器

    网页FLASH抓取器网页FLASH抓取器网页FLASH抓取器网页FLASH抓取器网页FLASH抓取器网页FLASH抓取器

    网页抓取小工具

    学习网站制作,首先要看看别人怎么制作的网站,抓取别人网站上的资源,请用这个工具,简单方便,适合大家

    ASP.NET 网页抓取WEB版

    一、系统启动后在“抓取网页路径” 输入要抓取网页的URL 以文本内默认格式输入 选择“网页编码格式” (如果不知道网页格式可以更换不同选择项),然后点击“测试打开网页”。系统会 在页面右侧空白处显示页面源码...

    网页抓取代码

    百度的网页抓取代码,可以实现一般网页的抓取,标签都适用。

    Java网页抓取数据

    Java网页抓取数据

    抓取和分析网页的类(可以抓取和分析网页)

    抓取和分析网页的类抓取和分析网页的类抓取和分析网页的类抓取和分析网页的类抓取和分析网页的类抓取和分析网页的类

    c#网页抓取

    c#编写的代码,简洁,明了,其主要功能实现网页HTML的抓取

    网页抓取教程.zip

    java抓取网页信息视频教程。可用于javaee或者Android

Global site tag (gtag.js) - Google Analytics