`
沙漠绿树
  • 浏览: 426190 次
  • 性别: 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) 这个是哪一行?

相关推荐

    WX小程序源码小游戏类

    WX小程序源码小游戏类提取方式是百度网盘分享地址

    grpcio-1.47.2-cp310-cp310-musllinux_1_1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    cryptography-42.0.3-cp37-abi3-musllinux_1_1_x86_64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    2021131528+谢镕汕.zip

    2021131528+谢镕汕.zip

    sja1301.i386.tar.gz

    SQLyong 各个版本,免费下载 SQLyog是业界著名的Webyog公司出品的一款简洁高效、功能强大的图形化MySQL数据库管理工具。使用SQLyog可以快速直观地让您从世界的任何角落通过网络来维护远端的MySQL数据库。

    VB学生宿舍管理系统(源代码+论文).rar

    计算机专业毕业设计VB精品论文资源

    基于多种编程语言的露营服务平台设计源码

    本项目是基于多种编程语言的露营服务平台设计源码,包含4315个文件,其中包括1752个JavaScript文件、885个TypeScript文件、420个WXML模板文件、406个WXSS样式文件、403个JSON配置文件、233个Markdown文档、182个WXS文件、13个PNG图像文件和6个MAP文件。系统专注于提供露营服务平台功能,支持地点搜索、预订功能等功能,为用户提供了一个稳定、高效的露营服务平台。

    菜日常菜日常菜日常菜日常

    菜日常菜日常菜日常菜日常

    debugpy-1.6.7.post1-cp310-cp310-win_amd64.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip

    源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip 源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip 源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip 源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip 源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip 源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip 源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip 源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip 源代码-Flash+JS图片切换轮换特效ASP读取数据库版.zip

    KF32Lxxx_StdPeriph_Lib.zip

    芯旺微 Kungfu芯片资料

    VB文档管理信息系统设计(源代码+系统+答辩PPT).rar

    计算机专业毕业时间之VB精品论文源代码资源

    1716894470778.jpg

    1716894470778.jpg

    SQLyog-13.1.5-0.x64Community.exe

    SQLyog-13.1.5-0.x64Community

    残差注意力-基于Pytorch实现的残差注意力网络-附项目源码-优质项目实战.zip

    残差注意力_基于Pytorch实现的残差注意力网络_附项目源码_优质项目实战

    不同月份用户手机账单数据,包括短信费用、上网费用、折扣金额等等

    不同月份用户手机账单数据,包括短信费用、上网费用、折扣金额等等 字段包括 sms_fee web_fee extra_fee total_fee discount extra_discount actual_fee paid_fee等等

    ADSP-BF533的例程源码1:EBIU总线驱动源码

    ADSP-BF533的EBIU总线驱动源码,

    源代码-ExcelToAccess批量导入数据 v1.0.zip

    源代码-ExcelToAccess批量导入数据 v1.0.zip

    h5py-2.7.1-cp35-cp35m-manylinux1_i686.whl

    Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。

    ChipON IDE For KungFu8.zip

    芯旺微 Kungfu芯片资料

Global site tag (gtag.js) - Google Analytics