`

HttpClient4获取抓取网页编码,内容等信息

阅读更多
public static void worm() throws Exception{
		    // 初始化,此处构造函数就与3.1中不同
            HttpClient httpclient = new DefaultHttpClient();
		    HttpHost targetHost = new HttpHost("www.baidu.com");
	        //HttpGet httpget = new HttpGet("http://www.apache.org/");
	        HttpGet httpget = new HttpGet("/");
	 
	        // 查看默认request头部信息
	        System.out.println("Accept-Charset:" + httpget.getFirstHeader("Accept-Charset"));
	        // 以下这条如果不加会发现无论你设置Accept-Charset为gbk还是utf-8,他都会默认返回gb2312(本例针对google.cn来说)
	        httpget.setHeader("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2)");
	        // 用逗号分隔显示可以同时接受多种编码
	        httpget.setHeader("Accept-Language", "zh-cn,zh;q=0.5");
	        httpget.setHeader("Accept-Charset", "GB2312,utf-8;q=0.7,*;q=0.7");
	        // 验证头部信息设置生效
	        System.out.println("Accept-Charset:" + httpget.getFirstHeader("Accept-Charset").getValue());
	 
	        // Execute HTTP request
	        System.out.println("executing request " + httpget.getURI());
	        HttpResponse response = httpclient.execute(targetHost, httpget);
	        //HttpResponse response = httpclient.execute(httpget);
	 
	        System.out.println("----------------------------------------");
	        System.out.println("Location: " + response.getLastHeader("Location"));
	        System.out.println(response.getStatusLine().getStatusCode());
	        System.out.println(response.getLastHeader("Content-Type"));
	        System.out.println(response.getLastHeader("Content-Length"));
	        
	        System.out.println("----------------------------------------");
	 
	        // 判断页面返回状态判断是否进行转向抓取新链接
	        int statusCode = response.getStatusLine().getStatusCode();
	        if ((statusCode == HttpStatus.SC_MOVED_PERMANENTLY) ||
	                (statusCode == HttpStatus.SC_MOVED_TEMPORARILY) ||
	                (statusCode == HttpStatus.SC_SEE_OTHER) ||
	                (statusCode == HttpStatus.SC_TEMPORARY_REDIRECT)) {
	            // 此处重定向处理  此处还未验证
	            String newUri = response.getLastHeader("Location").getValue();
	            httpclient = new DefaultHttpClient();
	            httpget = new HttpGet(newUri);
	            response = httpclient.execute(httpget);
	        }
	 
	        // Get hold of the response entity
	        HttpEntity entity = response.getEntity();
	        
	        // 查看所有返回头部信息
	        Header headers[] = response.getAllHeaders();
	        int ii = 0;
	        while (ii < headers.length) {
	            System.out.println(headers[ii].getName() + ": " + headers[ii].getValue());
	            ++ii;
	        }
	        
	        // If the response does not enclose an entity, there is no need
	        // to bother about connection release
	        if (entity != null) {
	            // 将源码流保存在一个byte数组当中,因为可能需要两次用到该流,
	            byte[] bytes = EntityUtils.toByteArray(entity);
	            String charSet = "";
	            
	            // 如果头部Content-Type中包含了编码信息,那么我们可以直接在此处获取
	            charSet = EntityUtils.getContentCharSet(entity);
	 
	            System.out.println("In header: " + charSet);
	            // 如果头部中没有,那么我们需要 查看页面源码,这个方法虽然不能说完全正确,因为有些粗糙的网页编码者没有在页面中写头部编码信息
	            if (charSet == "") {
	                String regEx="(?=<meta).*?(?<=charset=[\\'|\\\"]?)([[a-z]|[A-Z]|[0-9]|-]*)";
	                Pattern p=Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
	                Matcher m=p.matcher(new String(bytes));  // 默认编码转成字符串,因为我们的匹配中无中文,所以串中可能的乱码对我们没有影响
	                boolean result=m.find();
	                if (m.groupCount() == 1) {
	                    charSet = m.group(1);
	                } else {
	                    charSet = "";
	                }
	            }
	            System.out.println("Last get: " + charSet);
	            // 至此,我们可以将原byte数组按照正常编码专成字符串输出(如果找到了编码的话)
	            System.out.println("Encoding string is: " + new String(bytes, charSet));
	        }
	 
	        httpclient.getConnectionManager().shutdown();  
	}

 

分享到:
评论

相关推荐

    Android例子源码使用HttpClient获取网页html源代码

    本例子是一个使用HttpClient和URLConnection获取网页html内容的小例子,获取到的源码不解析直接显示,技术比较简单,需要的朋友可以下载研究一下,项目编码GBK默认编译版本2.3.3

    使用HttpClient获取网页html源代码.zip

    使用HttpClient获取网页html源代码获取到的源码不解析直接显示,技术比较简单,需要的朋友可以下载研究一下,项目编码GBK默认编译版本2.3.3。  

    Android例子源码使用HttpClient获取网页html源代码.zip

    本例子是一个使用HttpClient和URLConnection获取网页html内容的小例子,获取到的源码不解析直接显示,技术比较简单,需要的朋友可以下载研究一下,项目编码GBK默认编译版本2.3.3

    使用HttpClient获取网页html源代码

    使用HttpClient获取网页html源代码获取到的源码不解析直接显示,技术比较简单,需要的朋友可以下载研究一下,项目编码GBK默认编译版本2.3.3。

    Jsoup+httpclient 模拟登陆和抓取

    * 模拟等录 后获取所需要的页面 * @param client * @param newUrl * @throws Exception */ private static String createHtml(HttpClient client, String newUrl) throws Exception { SimpleDateFormat ...

    根据ip地址获取城市地理位置

    1、location.html 在浏览器中打开页面,即可获取您当前的ip地址,和所在城市,以及城市地理位置编码。(以国家统计局为准) ... 放在web项目中,可获取访问用户的ip地址,所在城市,和所在城市区域编码。

    CSharpCrawler:C#爬虫示例程序,想学习爬虫入门知识的可以看过来。后续会慢慢加入更多爬虫相关的知识

    获取指定url的网页头信息 如何从网页源码中提取页面的编码 抓取动态网页 使用来抓取动态网页 使用WebBrowser(IE)来抓取动态网页 使用来抓取动态网页 使用来抓取动态网页 WebAPI调用 获取实时天气 调用中

    C# 使用HttpClient模拟请求的案例

    情景描述 将一个时间转换为对应的unix时间戳, 字符集使用UTF-8编码,数据通讯统一采用 .../// 获取时间戳(毫秒). /// /// &lt;param name=dateTime&gt;&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; [HttpPost] [AllowAnonymous]

    字符串文件http密码资源文件openoffice图片等工具等

    FileUtil提供获取文件后缀名、修改文件的后缀名、删除文件或目录、根据流判断流的编码格式、获取文件的编码格式、创建文件、获得文件大小、创建文件目录 方法 OpenOfficeUtil提供使用openoffice把office文件转换成...

    黎活明android教程的全程PPT

    2&gt; 网络--获取数据(图片、网页、xml、Json等) 3&gt; 如何把数据通过HTTP协议提交到网络上的Web应用(get / post ) 数据大于2k的时候 A.通过Get方式提交参数给Web应用 B.通过Post方式提交参数给Web应用 C.使用...

    C#如何解析http报文

    分析属性值,从中获取内容编码和字符集编码 将报头数据和内容进行分离 判断内容是否文本还是二进制,如果是二进制的则不进行处理 如果内容是文本,按报头中提供的内容编码和字符集编码进行解压缩和解码 目前没有找到...

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

    |--aidl之结合反射获取应用缓存大小等空间占用 |--aidl调用系统service未公开的方法挂电话 |--aidl调用系统未公开的方法代码示例2 |--android dp和px之间转换 |--android INSTALL_PARSE_FAILED_MANIFEST_MALFORMED |...

    传智播客Android视频教程-课程源码.rar

    2&gt; 网络--获取数据(图片、网页、xml、Json等) 3&gt; 如何把数据通过HTTP协议提交到网络上的Web应用(get / post ) 数据大于2k的时候 A.通过Get方式提交参数给Web应用 B.通过Post方式提交参数给Web应用 C.使用...

    java开源包4

    GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag Library 该标记库和 Google 有关。使用该标记库,利用 Google 为你的网站提供网站查询,并且可以...

    java jdk实列宝典 光盘源代码

    获取URL信息,主要是使用URLConnection类,GetUrlInfo.java; web浏览器,webbrowser.java; 获取IP地址和域名,GetIpAddress.java; Http客户端,httpClient.java; 基本socket编程,介绍socket编程的基本步骤,启动...

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

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

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

     通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,李四用张三的公钥加密信息,并发送给李四,张三用自己的私钥解密从李四处收到的信息…… Java利用DES私钥对称加密代码实例 ...

    Android静默安装常用工具类

    HttpResponse中可以获取返回内容、http响应码、http过期时间(Cache-Control的max-age和expires)等 前两个方法可以进行高级参数设置及丰富内容返回,第三个方法可以简单的传入url获取返回内容,httpPost类似。更详细...

    达内客户端+聊天室源码

    //处理源码筛选字符串,只获取含有问题标题的内容 // System.out.println(queStr);//测试标题部分字符串 String[] queArr = queStr.split("(||)"); for(int i=0;i;i++){ String msg = queArr[i]; msg = msg....

Global site tag (gtag.js) - Google Analytics