`
macken
  • 浏览: 346184 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java获取html源代码

    博客分类:
  • Java
 
阅读更多
刚开始写了一个获取html代码的Java函数,但是对于使用gzip传输的html,代码获取以后是乱码;
package com.dg.util;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;

import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.HttpResponseException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;



public class HttpUtil {
	public static String getContent(String url, String encoding) throws Exception {
		URI uri = new URI(url);
		HttpClient client = new DefaultHttpClient();
		CharsetHandler handler = new CharsetHandler(encoding);
		HttpGet httpget = new HttpGet(uri);
		httpget.setHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7 360EE");
		String html = client.execute(httpget, handler);
		System.out.println("html:"+url);
		return html;
	}
	public static void main(String[] args){
		String url="http://www.6vdy.com/dy/2011-12-20/16961.html";
		String html=getContent(url,"gb2312");
	}


}

class CharsetHandler implements ResponseHandler<String> {
	private String charset;

	public CharsetHandler(String charset) {
		this.charset = charset;
	}

	public String handleResponse(HttpResponse response) throws ClientProtocolException, IOException {
		StatusLine statusLine = response.getStatusLine();
		if (statusLine.getStatusCode() >= 300) {
			throw new HttpResponseException(statusLine.getStatusCode(), statusLine.getReasonPhrase());
		}
		HttpEntity entity = response.getEntity();
		if (entity != null) {
			if (!StringUtils.isBlank(charset)) {
				return EntityUtils.toString(entity, charset);
			} else {
				return EntityUtils.toString(entity);
			}
		} else {
			return null;
		}
	}
}
在网上找了一个别人写的可以自动识别是否为gzip压缩的一段代码,在编码转换方面效果不是很好
package com.dg.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.zip.GZIPInputStream;

import org.apache.commons.httpclient.DefaultHttpMethodRetryHandler;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpException;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.lang3.StringUtils;

public class HttpUtil {

	public static String getContent(String htmlurl, String charset) throws IOException {
		StringBuffer sb = new StringBuffer();
		String acceptEncoding = "";
		/* 1.生成 HttpClinet 对象并设置参数 */
		HttpClient httpClient = new HttpClient();
		// 设置 Http 连接超时 5s
		httpClient.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
		GetMethod method = new GetMethod(htmlurl);
		method.addRequestHeader("User-Agent",
				"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/535.7 (KHTML, like Gecko) Chrome/16.0.912.63 Safari/535.7 360EE");
		// 设置 get 请求超时 5s
		method.getParams().getDoubleParameter(HttpMethodParams.SO_TIMEOUT, 10000);
		// 设置请求重试处理
		method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler());
		int statusCode;
		try {
			statusCode = httpClient.executeMethod(method);
			// 判断访问的状态码
			if (statusCode != HttpStatus.SC_OK) {
				return sb.toString();
			} else {
				if (method.getResponseHeader("Content-Encoding") != null)
					acceptEncoding = method.getResponseHeader("Content-Encoding").getValue();
				if (acceptEncoding.toLowerCase().indexOf("gzip") > -1) {
					// 建立gzip解压工作流
					InputStream is;
					is = method.getResponseBodyAsStream();
					GZIPInputStream gzin = new GZIPInputStream(is);
					InputStreamReader isr = new InputStreamReader(gzin, charset); // 设置读取流的编码格式,自定义编码
					java.io.BufferedReader br = new java.io.BufferedReader(isr);
					String tempbf;
					while ((tempbf = br.readLine()) != null) {
						sb.append(tempbf);
						sb.append("\r\n");
					}
					isr.close();
					gzin.close();
					System.out.println(sb);
				} else {
					InputStreamReader isr;
					isr = new InputStreamReader(method.getResponseBodyAsStream(), charset);
					java.io.BufferedReader br = new java.io.BufferedReader(isr);
					String tempbf;
					while ((tempbf = br.readLine()) != null) {
						sb.append(tempbf);
						sb.append("\r\n");
					}
					isr.close();
				}
			}
		} catch (HttpException e1) {
			e1.printStackTrace();
		} catch (IOException e1) {
			e1.printStackTrace();
		}
		method.abort();
		method.releaseConnection();
		return sb.toString();
	}
	public static void main(String[] args) throws Exception{
		String url="http://www.baidu.com";
		String html=getContent(url,"gb2312");
		System.out.println(html);
	}
}
 

 

分享到:
评论

相关推荐

    Java提交后获取网页源代码

    利用java进行网页的源代码获取 可以用在数据采集使用 可用于安卓平台

    张孝祥Java高新技术源代码.rar

    【标题】"张孝祥Java高新技术源代码.rar"是一个压缩包文件,主要包含了Java高级技术相关的源代码。张孝祥,作为一个知名的Java教育专家,他的教程通常深入浅出,覆盖了Java编程的诸多核心和进阶领域。这个压缩包可能...

    Java源代码反编译专家

    Java源代码反编译是Java开发中的一种技术,主要用于查看已编译的字节码类文件(.class文件)背后的原始源代码。这对于学习、调试、逆向工程或理解无源代码的第三方库非常有用。在Java开发领域,有时我们可能会遇到只...

    开源实用的Java系统源代码

    要使用开源Java系统源代码,首先需要从可靠渠道获取源代码。可以通过GitHub、GitLab等代码托管平台查找合适的项目。例如,提供的网址(http://jh-space.com/blog/2014/03/07/607.html)可能指向了一个具体的开源项目...

    JAVA爬虫项目源代码

    【JAVA爬虫项目源代码】是一个使用JAVA编程语言编写的爬虫项目,它结合了多线程编程和队列管理技术来提升数据抓取的效率和并发性。在这个项目中,开发者利用了以下核心技术: 1. **HttpClinet**:HttpClinet是Java...

    java课本源代码

    在源代码中,观察`${}`内的表达式,了解其如何获取和设置值。 5. **MVC(Model-View-Controller)设计模式**:这是一种常见的软件设计模式,用于组织Web应用的结构。在Java Web中,通常使用Struts、Spring MVC或JSF...

    java爬虫源代码

    Java爬虫源代码是用于自动化抓取网页信息的程序,主要应用于数据分析、信息提取和搜索引擎优化等领域。在Java中开发爬虫,可以利用其强大的类库和跨平台特性,实现高效稳定的数据抓取。本项目包含以下几个核心知识点...

    JAVA上百实例源码以及开源项目源代码

    JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个目标文件 摘要:Java源码,网络相关,浏览器 Java编写的HTML浏览器源代码,一个很...

    JAVA4个项目源代码

    【JAVA4个项目源代码】是针对Java编程语言的实践学习资源,包含了四个完整的项目实例,适合初学者到进阶者提升编程技能。这些项目可以直接在Eclipse或MyEclipse这样的集成开发环境中导入,方便进行代码阅读、调试和...

    java邮件服务系统源代码

    在这个Java邮件服务系统源代码中,开发者可能会使用控制台输入或者读取配置文件的方式来获取SMTP服务器的参数,确保代码的灵活性和可扩展性。同时,错误处理也是必不可少的一部分,比如处理网络异常、认证失败等问题...

    [图灵社区]《深度学习搜索引擎开发:Java实现》源代码.zip

    本书的源代码包含了作者为阐述理论和技术而编写的Java程序,这些程序是理解并实践深度学习搜索引擎开发的关键。下面将详细讨论相关知识点。 一、深度学习基础 深度学习是机器学习的一个分支,它模拟人脑神经网络的...

    Date的Java源代码

    根据提供的文件信息,可以看出这里似乎存在一定的误解,因为这部分内容实际上并不是Java源代码的一部分,而更像是HTML表单的代码片段。然而,为了更好地理解和解答题目中的需求,我们可以围绕“Date的Java源代码”这...

    java 电子商务项目源代码

    【Java 电子商务项目源代码详解】 Java 电子商务项目源代码是一种基于Java编程语言的软件开发实践,用于构建在线购物、交易处理以及管理电子商务平台。在本项目中,我们特别关注的是一个“bs结构考试系统”的实现,...

    java写的源代码行数统计器

    在实际使用中,源代码行数统计器可能会采用递归遍历目录的方式,查找并读取所有的源代码文件,然后根据不同类型的代码(如Java、HTML、CSS、JavaScript等)进行分类统计。它可能还会区分注释行、空行和有效代码行,...

    Java记事本程序源代码

    Java记事本程序源代码是Java编程领域的一个基础示例,它展示了如何使用Java语言实现一个功能完备的文本编辑器,类似于我们常见的Windows记事本。这个程序包含了文件操作、编辑功能以及帮助菜单等基本元素,是学习...

    jsp+java企业网站源代码

    【JSP+Java企业网站源代码详解】 JSP(JavaServer Pages)是Java技术在Web开发中的一个重要应用,它是一种动态网页技术,允许开发者将HTML、XML或其他标记语言与Java代码混合编写,从而实现服务器端的动态内容生成...

    java抓取网页内容源代码

    ### Java抓取网页内容源代码解析与扩展 在IT领域,网页抓取(或称网络爬虫)是一项关键技能,广泛应用于数据收集、市场分析、搜索引擎优化等多个方面。本篇文章将深入探讨一个Java编写的网页内容抓取代码,旨在帮助...

    Java Web 整合开发 完全自学手册 源代码

    《Java Web 整合开发 完全自学手册》是一本深度探讨...通过本书提供的源代码,读者可以深入理解每个知识点的实际应用,加深对Java Web开发的理解,并提升实战能力。无论是初学者还是有经验的开发者,都能从中受益匪浅。

    Linux下基于MVC的java web开发源代码

    本项目提供了一套完整的Java Web开发源代码,适用于学习和实战。 首先,Java是Web开发中的主要编程语言,它提供了丰富的库和框架,如Spring、Struts、Hibernate等,支持MVC模式。在Linux系统中,开发者通常选择使用...

    JAVA计算器源代码

    【JAVA计算器源代码】是一个基于Java编程语言实现的简单计算工具,主要功能是进行基本的四则运算,即加法、减法、乘法和除法。这个源代码实例对于初学者来说,是一个很好的学习资源,它展示了如何使用Java语言构建一...

Global site tag (gtag.js) - Google Analytics