有关httpclient:

HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性,它不仅使客户端发送Http请求变得容易,而且也方便开发人员测试接口(基于Http协议的),提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。

org.apache.commons.httpclient.HttpClient与org.apache.http.client.HttpClient的区别

Commons的HttpClient项目现在是生命的尽头,不再被开发,  已被Apache HttpComponents项目HttpClient和HttpCore  模组取代,提供更好的性能和更大的灵活性。

一、简介

HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。

那么这里就简单写写如何获取网页源码:

maven依赖:

org.apache.httpcomponents

httpclient

4.5.2

这里最大的问题就是编码的问题,如果编码不是合适的话,就会出现中文乱码情况。

一般是通过两种方式来获取编码,一种是从响应头获取,一种是从网页源码的meta中获取。

这两种方法要结合使用。一般步骤是先从响应头获取,如果响应头没有,就要到网页源码meta中获取,如果还没有,就要设置默认编码。

我的代码如下:

packagehttpclient.download;importjava.io.BufferedReader;importjava.io.ByteArrayOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.StringReader;importjava.util.regex.Matcher;importjava.util.regex.Pattern;importorg.apache.http.HttpEntity;importorg.apache.http.client.methods.CloseableHttpResponse;importorg.apache.http.client.methods.HttpGet;importorg.apache.http.impl.client.CloseableHttpClient;importorg.apache.http.impl.client.HttpClients;importorg.apache.http.util.EntityUtils;/*** httpclient来下载网页源码。

*

*@author徐金仁

*

*关于网页下载最大的问题是编码的问题

**/

public classDownload {publicString getHtmlSource(String url){

String htmlSource= null;

String finallyCharset= null;//使用httpclient下载//创建一个httpclient的引擎

CloseableHttpClient httpClient =HttpClients.createDefault();//创建一个httpGet对象,用于发送get请求,如果要发post请求,就创建一个post对象

HttpGet get = newHttpGet(url);try{//发送get请求,获取一个响应

CloseableHttpResponse response=httpClient.execute(get);//获取这次响应的实体,接下来所有的操作都是基于此实体完成,

HttpEntity entity =response.getEntity();//方法还是两个,先从header里面来查看,如果没有,再从meta里面查看//这个方法主要是从header里面来获取,如果没有,会返回一个null

finallyCharset =EntityUtils.getContentCharSet(entity);

System.out.println("编码如下:");

System.out.println("charset1 = " +finallyCharset);byte[] byteArray = null;if(finallyCharset == null){//如果header里面没有,则要从meta里面来获取,为了节约网络资源,网页只读取一次,

/** 那么,就有几个关系 :url->字符流->子节流->字符串

* 这里可以用子节数组来作为中间的过渡,从字节数组这里获取到编码,再通过正确的编码变为字符串*/byteArray=convertInputStreamToByteArray(entity.getContent());if(byteArray == null){throw new Exception("字节数组为空");

}//接下来要从字节数组中获取到meta里面的chatset

finallyCharset =getCharsetFromMeta(byteArray);

System.out.println("charset2 = " +finallyCharset);if(finallyCharset == null){//如果没有找到

finallyCharset = "UTF-8"; //则等于默认的

System.out.println("charset3 = " +finallyCharset);

}//如果找到了就更好

}

System.out.println("charset = " +finallyCharset);

htmlSource= newString(byteArray, finallyCharset);

}catch(IOException e) {

e.printStackTrace();

}catch(Exception e) {

e.printStackTrace();

}returnhtmlSource;

}/*** 将一个输入流转化为一个字节数组

*@paramcontent

*@paramdefaultCharset

*@return*@throwsIOException*/

public byte[] convertInputStreamToByteArray(InputStream content) throwsIOException {//输入流转化为一个字节数组

byte[] by = new byte[4096];

ByteArrayOutputStream bos= newByteArrayOutputStream();int l = -1;while((l = content.read(by)) > 0){

bos.write(by,0, l);

}byte[] s =bos.toByteArray();returns;

}/*** 从字节数组中获取到meta里面的charset的值

*@parambyteArray

*@return*@throwsIOException*/

public String getCharsetFromMeta(byte[] byteArray) throwsIOException {//将字节数组转化为bufferedReader,从中一行行的读取来,再判断

String htmlSource = newString(byteArray);

StringReader in= newStringReader(htmlSource);

BufferedReader reader= newBufferedReader(in);

String line= null;while((line = reader.readLine()) != null){

line=line.toLowerCase();if(line.contains("

String regex = "\"text/html;[\\s]*?charset=([\\S]*?)\"";

Pattern pattern=Pattern.compile(regex);if(pattern != null){

Matcher matcher=pattern.matcher(htmlSource);if(matcher != null){if(matcher.find()){return matcher.group(1);

}

}

}

}else{continue;

}

}return null;

}//测试:

public static voidmain(String[] args) {

String htmlsource= new Download().getHtmlSource("http://news.youth.cn/gn/");

System.out.println("源码:");

System.out.println(htmlsource);

}

}

结果:

收藏的相关博客:

java http 源码_httpclient下载网页源码---java基础爬虫相关推荐

  1. java毕业生设计学习资源下载管理计算机源码+系统+mysql+调试部署+lw

    java毕业生设计学习资源下载管理计算机源码+系统+mysql+调试部署+lw java毕业生设计学习资源下载管理计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...

  2. urllib库下载网页源码,图片,视频测试

    测试代码: import urllib.request # 导入库 # url url_page ='http://www.baidu.com' 下载网页源码 # 下载网页的HTML文件 urllib ...

  3. 纯JavaScript二维码在线生成网页源码

    介绍: 纯JavaScript实现二维码生成的网页源码,各位技术爱好者可以拿去研究, 支持设置二维码的各项具体内容,适合专业人士使用. 网盘下载地址: https://zijiewangpan.com ...

  4. 素材模板源码资源下载站源码-带用户中心和VIP充值系统等

    介绍: 多功能素材模板源码资源下载站源码,带用户中心和VIP充值系统,后台管理+素材下载+积分金币下载 服务器操作系统用Linux centos 7.2 先安装宝塔,宝塔官网(https://www. ...

  5. Android源码 —— 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16)

    Android源码 -- 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16) 本文将介绍从Win7系统开始一步步构建下载Android源码的虚拟机环境: **1.使 ...

  6. 高端大气仿A8源码素材下载站源码+基于织梦CMS

    正文: 高端大气仿A8源码素材下载站源码+基于织梦CMS,这源码的前端UI看着还是非常不错的,高端大气响应式,且程序亲测没有问题,下载,发布,支付,都是正常的. 安装教程: 程序: lanzou.co ...

  7. java计算机毕业设计学习资源下载管理源码+mysql数据库+lw文档+系统+调试部署

    java计算机毕业设计学习资源下载管理源码+mysql数据库+lw文档+系统+调试部署 java计算机毕业设计学习资源下载管理源码+mysql数据库+lw文档+系统+调试部署 本源码技术栈: 项目架构 ...

  8. vue生成二维码并下载二维码

    首先安装一下面这个插件 cnpm install vue-qr -S 接下来在需要生产并下载二维码的页面引入 import VueQr from 'vue-qr' 并在components中注册为组件 ...

  9. PHP -----微擎内置方法生成二维码和下载二维码

    1.新建一个类文件code.php,主要用于处理二维码的方法: 在页面的 顶部引用: load()->library('qrcode'); class code{//方法写在这 } 2.生成二维 ...

最新文章

  1. c语言用链表的方式实现多项式加减,如何实现C语言单链表多项式相加的操作
  2. 用C语言解“混合类型数据格式化输出”题
  3. 将unicode编码的txt文件转为utf-8编码
  4. 周报速递丨《网络安全审查办法》修订发布;微信支持数字人民币支付
  5. ASIHTTP 框架,同步、 异步请求、 上传 、 下载
  6. error: Refusing toundefine while domain managed save image exists
  7. 4.nslookup
  8. https默认端口_Java企业信息化平台O2OA如何配置服务器来启用HTTPS(SSL)
  9. android imageview实现点击图片放大,Android 点击图片放大方法
  10. 利用ESP8266与米思齐从零制作模拟温室大棚--程序篇
  11. 一文学懂risc-v汇编操作
  12. 轻松制作美容美发线下门店电子优惠券的实用方法分享
  13. 大疆精灵4航测输出正摄影和三维模型教程
  14. java 1 9随机数_Java-随机数详解
  15. SFFAI分享 | 张杰:针对图像处理网络的模型水印【附PPT与视频资料】
  16. 论文翻译:Learning Representations and Generative Models for 3D Point Clouds
  17. 【ELT.ZIP】OpenHarmony啃论文俱乐部——人工智能短字符串压缩
  18. 计算机单机游戏c0005错误,单机游戏安装中出现的错误,我教你解决它!
  19. Electron系列教程——第一篇:入门
  20. 如何把多张图片做成gif动图?

热门文章

  1. PAT --- 1037.在霍格沃茨找零钱 (20 分)
  2. spring schedule定时任务详解
  3. 性能测试 架构层(二) 从性能测试层面了解架构设计 分布式项目实施过程中的常见难点,测试架构层面思考性能测试应该如何做?自行思考解决方案是什么?
  4. 多任务学习原理与优化
  5. source insight设置
  6. ${0##*/}的意思
  7. python爬虫之-斗图网爬取
  8. C#界面里的winform AutoValidate和CausesValidation属性
  9. 学好新三科计算机英语,学英语专业新高考选科要求:英语专业高考选哪三科?...
  10. 奢侈品养护平台包大师获3000万元A轮融资,投资方青松基金、不惑创投