`
dh189
  • 浏览: 135301 次
  • 性别: Icon_minigender_2
  • 来自: 上海
社区版块
存档分类
最新评论

httpclient 获取到网页内容自动判断内容编码

    博客分类:
  • java
阅读更多
在“导航189”网站中编写爬虫程序中使用的httpclient 来获取网页内容,但是在获取网页内容时有编码的问题,这里介绍的一个方法是使用EntityUtils中的toString来返回网页的内容,原理是这样的,在请求的返回header中获取编码,如果没有找到返回的编码就使用默认编码来返回,代码实现如下:
/**
     * 处理GET请求,返回整个页面
     * 
     * @param url 访问地址
     * @param params 编码参数
     * @return
     * @throws Exception
     * @throws Exception
     */
    public synchronized String doGet(String url, String... params) throws Exception {
        DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpProtocolParams.setUserAgent(httpclient.getParams(),
                "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.9) Gecko/20100315 Firefox/3.5.9");
        String charset = "UTF-8";
        if (null != params && params.length >= 1) {
            charset = params[0];
        }
        HttpGet httpget = new HttpGet();
        String content = "";
        httpget.setURI(new java.net.URI(url));
        HttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            //使用EntityUtils的toString方法,传递默认编码,在EntityUtils中的默认编码是ISO-8859-1
            content = EntityUtils.toString(entity, charset);
            httpget.abort();
            httpclient.getConnectionManager().shutdown();
        }
        return content;
    }


调用如下:
          //导航189的网站返回编码是GBK,所以传递和不传递编码都能返回正确的数据
            doGet("http://www.dh189.com/", "GBK");
           doGet("http://www.dh189.com/");
           //民生银行的网站在请求后并没有返回编码,所以要设置编码,不设置则是乱码
            doGet("http://www.cmbc.com.cn/");
            doGet("http://www.cmbc.com.cn/","GBK");


EntityUtils 内部实现是这样的:
/**
     * Get the entity content as a String, using the provided default character set
     * if none is found in the entity. 
     * If defaultCharset is null, the default "ISO-8859-1" is used.
     * 
     * @param entity must not be null
     * @param defaultCharset character set to be applied if none found in the entity
     * @return the entity content as a String
     * @throws ParseException if header elements cannot be parsed
     * @throws IllegalArgumentException if entity is null or if content length > Integer.MAX_VALUE
     * @throws IOException if an error occurs reading the input stream
     */
    public static String toString(
            final HttpEntity entity, final String defaultCharset) throws IOException, ParseException {
        if (entity == null) {
            throw new IllegalArgumentException("HTTP entity may not be null");
        }
        InputStream instream = entity.getContent();
        if (instream == null) {
            return "";
        }
        if (entity.getContentLength() > Integer.MAX_VALUE) {
            throw new IllegalArgumentException("HTTP entity too large to be buffered in memory");
        }
        int i = (int)entity.getContentLength();
        if (i < 0) {
            i = 4096;
        }
        //获取请求中的编码
        String charset = getContentCharSet(entity);
        //若没返回编码则使用传递的编码
        if (charset == null) {
            charset = defaultCharset;
        }
        if (charset == null) {
            charset = HTTP.DEFAULT_CONTENT_CHARSET;
        }
        Reader reader = new InputStreamReader(instream, charset);
        CharArrayBuffer buffer = new CharArrayBuffer(i); 
        try {
            char[] tmp = new char[1024];
            int l;
            while((l = reader.read(tmp)) != -1) {
                buffer.append(tmp, 0, l);
            }
        } finally {
            reader.close();
        }
        return buffer.toString();
    }


EntityUtils 中获取编码的方法如下:
/**
     * Obtains character set of the entity, if known.
     * 
     * @param entity must not be null
     * @return the character set, or null if not found
     * @throws ParseException if header elements cannot be parsed
     * @throws IllegalArgumentException if entity is null
     */
    public static String getContentCharSet(final HttpEntity entity)
        throws ParseException {

        if (entity == null) {
            throw new IllegalArgumentException("HTTP entity may not be null");
        }
        String charset = null;
        if (entity.getContentType() != null) { 
            HeaderElement values[] = entity.getContentType().getElements();
            if (values.length > 0) {
                NameValuePair param = values[0].getParameterByName("charset");
                if (param != null) {
                    charset = param.getValue();
                }
            }
        }
        return charset;
    }
分享到:
评论

相关推荐

    httpclient测试登录并提交表单功能

    - 使用Apache HttpClient可以通过`PostMethod`类来构造表单数据,并发送POST请求到指定的URL。 4. **自定义HTTP方法**: - 为了满足特定的需求,有时需要对Apache HttpClient中的默认方法进行扩展或修改。 - 本...

    httpclient 开发包以及例子

    我们可以读取状态码判断请求是否成功,解析响应头获取相关信息,使用`EntityUtils`类读取响应体内容。 6. **错误处理**:HttpClient提供了异常处理机制,如`IOException`和`HttpException`,需要适当地捕获和处理。...

    httpclient抓取网页数据和所需的10个jar包

    在IT行业中,网络数据抓取是一项常见的任务,用于获取网页上的信息、分析市场趋势或进行自动化测试。HttpClient是Apache软件基金会开发的一个Java库,专门用于发起HTTP请求并处理响应,是进行网页抓取的重要工具。本...

    比较全的httpclient入门介绍和例子代码

    ### HttpClient入门介绍与实例...通过这段代码,我们可以看到`HttpClient`的使用流程,包括实例化、方法创建、执行、结果检查、数据获取以及连接释放等关键步骤。这对于初学者理解和掌握`HttpClient`的使用至关重要。

    httpclient cache 4.2

    - commons-codec-1.6.jar:提供了各种编码解码工具,包括URL编码、Base64编码等,是HttpClient依赖的基础库。 - commons-logging-1.1.1.jar:提供日志记录服务,允许HttpClient使用多种日志实现。 - ...

    Httpclient_jar.zip

    `commons-codec-1.4.jar`则是Apache Commons Codec库,它提供了一系列编码解码的工具,包括Base64编码、URL编码等,HttpClient在处理请求参数或响应数据时可能会用到这些工具。 在实际使用HttpClient时,我们通常会...

    JAVA技术的网页内容智能抓取.pdf

    JAVA技术的网页内容智能抓取 基于JAVA技术的网页内容智能抓取架构完全基于JAVA技术核心技术XML解析、HTML解析、开源组件应用。应用的开源组件包括DOM4J、jericho-html-2.5、commons-httpclient等。 1. XML解析技术...

    C# 自动登陆网站源码(Winform)

    响应中包含了登录后的网页内容,可以通过HttpWebResponse或HttpResponseMessage对象获取。 5. **处理登录结果**:根据返回的响应,判断登录是否成功。这通常通过检查响应状态码(如200表示成功)、分析响应内容...

    使用C#获取网页HTML源码的例子

    因此,在本例中,我们使用了正则表达式来分析获取到的HTML源码,并从中提取出字符集声明部分,以判断网页实际采用的编码格式。如果发现网页声明的编码格式为“utf-8”,则使用UTF-8编码方式重新转换字节数组为字符串...

    全国天气实时获取程序

    例如,可能需要提供城市编码来获取特定地区的天气信息。 3. **数据解析**:获取到的天气数据通常是JSON或XML格式,需要将这些数据解析成可操作的对象。可以使用如`json`库(Python)或`Gson`(Java)进行解析。 4....

    网络爬虫算法

    如`isCreateFile()`用于判断是否应创建文件保存网页内容,`getGoalContent()`用于从网页内容中提取目标内容,`isHasGoalContent()`检测网页内容是否包含目标内容,以及将URL规范化等。 3. **HrefOfPage.java**:这...

    java模拟淘宝登录源码(请看评论,酌情下载)

    本资源提供的"java模拟淘宝登录源码"是基于HTTPClient库实现的,它可以帮助开发者理解如何通过编程方式与Web服务进行交互,尤其是涉及到身份验证的场景。淘宝作为中国最大的电商平台之一,其登录流程涉及到了各种...

    java编写网络爬虫

    `FunctionUtils`是一个工具类,包含了多种静态方法,比如页面链接的正则表达式匹配、获取URL链接的元素、判断是否创建文件、规范化URL以及从网页内容中提取目标内容。这些方法对处理爬取的数据非常有用,可以进行...

    httpcomponents-client-4.5.3

    `EntityUtils`提供了一系列方法来处理响应实体,如读取内容、判断状态等。此外,还可以使用`HttpEntityEnclosingRequestBase`处理需要携带实体的请求。 5. **性能优化**: HttpClient 4.5.3在性能上进行了优化,...

    Httpcore4.4与Httpcilent4.4 jar包合集

    Httpcore4.4中的HttpEntity接口定义了处理HTTP消息实体的方法,如获取内容长度、读取内容、判断是否可重复等。正确导入Httpcore4.4的jar包,即可解决此类问题。 而Httpclient是基于Httpcore构建的,提供了一个功能...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--Activity不允许横竖屏切换 |--Activity常用小技巧 ...|--获取网页的源码 |--读取外部资源的文件3种方式 |--读取手机内的短信 |--通信之Application实现应用全局通信 |--重启adb |--隐式转换 页面 |--震动效果的实现

    人脸检测 C#调用科大讯飞人脸检测

    // 获取响应内容 var responseContent = await response.Content.ReadAsStringAsync(); return responseContent; } ``` 4. 活体检测与眼部状态识别:科大讯飞的API不仅能检测人脸位置,还能进行活体检测,判断...

    Android电池监控.zip项目安卓应用源码下载

    例如,通过`getBatteryLevel()`方法可以获取当前电池百分比,`isCharging()`则可以判断设备是否正在充电。此外,`BatteryManager.BATTERY_PROPERTY_*`常量可以用来获取其他详细电池属性,如温度、电流等。 其次,...

    java获得手机验证码

    在Java编程语言中,获取手机验证码通常涉及到网络通信、安全编码和第三方服务的集成。这里我们将深入探讨这个过程,以及如何使用Java实现这一功能。 首先,我们要理解验证码的主要作用是验证用户身份,防止机器人或...

    java jdk实列宝典 光盘源代码

    添加内容到文件结尾;文件的分割和合并;使用StreamTokenizer统计文件的字符数; 序列化和反序列化对象(将不长用的对象暂时持久化到文件中为对象的序列化,反之用时再把对象恢复到内存为反序列化); 控制对象的...

Global site tag (gtag.js) - Google Analytics