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

相关推荐

    抓取策略web信息检索与数据抓取深度优先遍历拓展PPT资料.pptx

    3. **内存优化**:控制内存使用,防止因深度过大而导致的内存溢出。 4. **反爬机制应对**:处理网站的反爬策略,如验证码、IP限制等。 **应用场景** 深度优先遍历策略通常适用于以下情况: 1. **有限深度的网站**...

    图片抓取器

    主要功能:1 主要功能根据一个网址去抓取此网址上的图片 demo思路:首先根据一个网址,去解析上面的所有图片链接 ,然后根据图片链接去下载图片到本地手机 最后把本地手机下载的图片显示到界面上。 废话不多说了先上...

    取新闻网页内容去掉html标记和空格

    可能需要分块读取和处理文件,避免一次性加载整个文件导致内存溢出。 6. **错误处理**:程序应具有良好的错误处理机制,如检查文件是否存在、能否成功打开,以及处理可能的异常情况。 7. **代码示例**: ```cpp ...

    网络爬虫的设计方案与实现.pdf

    它可以避免频繁的磁盘I/O操作,提高爬虫的抓取速度,同时通过合理管理内存资源,防止内存溢出。 2. 多线程技术:多线程是爬虫实现高效抓取的关键。通过创建多个线程,爬虫可以同时处理多个网页的下载和解析,极大地...

    python爬虫-17-体验案例-判断是否存在.ev4.rar

    `requests`库提供了一个`get`函数的参数`stream=True`,可以用来流式下载大文件,避免一次性加载全部内容导致内存溢出。 5. **异常处理**: 在实际爬虫过程中,会遇到各种网络问题,如超时、重定向、禁止访问等。...

    山东建筑大学计算机网络课程设计基于Python的网络爬虫设计范文.docx

    7. **调试与测试**:调试阶段要解决的问题可能包括请求失败、数据解析错误、内存溢出等。测试数据和结果显示能验证爬虫功能是否正常,并确保数据质量。 8. **课程设计意义**:通过这次设计,学生不仅能够巩固计算机...

    基于JAVA技术的搜索引擎的研究报告及实现收藏.doc

    此外,JAVA的内存管理和垃圾回收机制也有助于在大规模数据处理中避免内存溢出。 **2.2.2 索引与搜索** 索引构建过程中,JAVA的集合框架(如ArrayList和HashMap)和并发库(如ConcurrentHashMap)为构建高性能索引...

    基于Java的多线程爬虫框架

    - **性能优化**:合理设置线程池大小,避免内存溢出,考虑使用异步IO或NIO提高效率。 - **数据清洗**:抓取的数据往往包含噪声,需要进行预处理,如去除HTML标签、标准化文本等。 - **分布式爬虫**:当单机爬虫...

    scrapy 0.25中文文档

    Scrapy是一个开源和协作的网页抓取框架,用于爬取网站数据和提取结构性数据的应用程序。Scrapy用于数据挖掘和信息处理,支持自动抓取、跟踪链接以及提取异构数据(如JSON, CSV)。该框架是用Python编写的,并设计...

    Heritrix 源码和Jar

    当遇到爬取失败、重复抓取、内存溢出等问题时,了解Heritrix的日志系统和调试方法,可以帮助快速定位和解决问题。 总之,Heritrix、Lucene和Dwr的组合为构建一个功能强大的网络搜索引擎提供了坚实的基础。通过深入...

    安卓源码-新闻类

    6. **图片加载库**:对于新闻中的图片,开发者可能会使用像Glide或Picasso这样的图片加载库,它们能优化图片的加载速度和内存使用,避免内存溢出。 7. **权限管理**:由于涉及到网络访问,源码中会包含Android的...

    PHP如何实现猎取网络上的文件?_.docx

    3. **数据大小限制**:限制读取文件的大小,防止内存溢出或DDoS攻击。 4. **错误处理**:应有适当的错误处理机制,防止敏感信息泄露。 5. **日志记录**:记录文件获取操作,便于跟踪异常行为。 6. **遵守robots.txt*...

    php采集程序 宋正河

    ...最后,使用正则表达式或者XPath对提取的数据进行进一步筛选和处理。...通过不断学习和实践,开发者可以掌握更复杂的网页抓取技巧,为数据分析、搜索引擎优化(SEO)、市场研究等领域提供强大的支持。

    网络游戏-基于动态可分裂Bloom+Filter的网络爬虫URL去重方法.zip

    这种方法在处理大量URL时,能够有效地防止内存溢出,同时保持较低的误判率。 在网络爬虫URL去重的过程中,动态可分裂Bloom Filter的运作机制如下: 1. 初始化:设置一个小型的Bloom Filter,分配足够的位来存储预期...

    跟着崔庆才学爬虫2:requests库的使用

    8. **分块下载大文件**:对于大文件的下载,requests库支持分块读取响应内容,可以避免一次性加载大量数据导致内存溢出。通过`response.iter_content(chunk_size)`实现分块下载。 9. **重试机制**:requests库内置...

    网络游戏-应用于单台多核处理器主机的多线程网络爬虫执行方法.zip

    7. **内存管理**:在处理大量数据时,合理使用内存可以避免内存溢出,提高爬虫的运行效率。 此外,资料可能还会讨论如何在网络游戏开发中应用类似的技术,例如多线程可以用于服务器端的数据处理,提高玩家的交互...

    htmlparser1.4完整包下载

    - 在处理大型或复杂的HTML文档时,注意性能优化,避免内存溢出等问题。 - 鉴于HTMLParser是老版本,可能不支持最新的HTML5特性,对于现代网页的解析可能需要其他更现代的库,如Jsoup。 总的来说,HTMLParser1.4是一...

    用于爬取汽车之家上关于汽车的评论

    6. **迭代器和生成器**:为了处理大量数据,避免一次性加载所有内容导致内存溢出,项目可能使用了生成器来分批处理和存储数据。 7. **多线程或多进程**:为了提高爬取速度,项目可能利用Python的threading或...

    libxml2-2.7.5.tar

    2. **HTML解析器**:除了XML,libxml2还提供了HTML解析功能,允许开发者处理不规范的HTML文档,这对于从网页抓取数据或进行网页解析非常有用。 3. **XPath支持**:XPath是一种在XML文档中查找信息的语言。libxml2...

    web_scrapping:这个报废是唐与edugrad合作

    Web抓取,也被称为网络爬虫或网页抓取,是一种技术,通过自动化程序从互联网上收集和处理大量信息。在本项目"web_scrapping:这个报废是唐与edugrad合作"中,开发者唐和edugrad合作创建了一个使用Python语言和...

Global site tag (gtag.js) - Google Analytics