java http 源码_httpclient下载网页源码---java基础爬虫
有关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基础爬虫相关推荐
- java毕业生设计学习资源下载管理计算机源码+系统+mysql+调试部署+lw
java毕业生设计学习资源下载管理计算机源码+系统+mysql+调试部署+lw java毕业生设计学习资源下载管理计算机源码+系统+mysql+调试部署+lw 本源码技术栈: 项目架构:B/S架构 开 ...
- urllib库下载网页源码,图片,视频测试
测试代码: import urllib.request # 导入库 # url url_page ='http://www.baidu.com' 下载网页源码 # 下载网页的HTML文件 urllib ...
- 纯JavaScript二维码在线生成网页源码
介绍: 纯JavaScript实现二维码生成的网页源码,各位技术爱好者可以拿去研究, 支持设置二维码的各项具体内容,适合专业人士使用. 网盘下载地址: https://zijiewangpan.com ...
- 素材模板源码资源下载站源码-带用户中心和VIP充值系统等
介绍: 多功能素材模板源码资源下载站源码,带用户中心和VIP充值系统,后台管理+素材下载+积分金币下载 服务器操作系统用Linux centos 7.2 先安装宝塔,宝塔官网(https://www. ...
- Android源码 —— 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16)
Android源码 -- 构建下载Android源码的虚拟机环境(Win7+VMware12+Ubuntu16) 本文将介绍从Win7系统开始一步步构建下载Android源码的虚拟机环境: **1.使 ...
- 高端大气仿A8源码素材下载站源码+基于织梦CMS
正文: 高端大气仿A8源码素材下载站源码+基于织梦CMS,这源码的前端UI看着还是非常不错的,高端大气响应式,且程序亲测没有问题,下载,发布,支付,都是正常的. 安装教程: 程序: lanzou.co ...
- java计算机毕业设计学习资源下载管理源码+mysql数据库+lw文档+系统+调试部署
java计算机毕业设计学习资源下载管理源码+mysql数据库+lw文档+系统+调试部署 java计算机毕业设计学习资源下载管理源码+mysql数据库+lw文档+系统+调试部署 本源码技术栈: 项目架构 ...
- vue生成二维码并下载二维码
首先安装一下面这个插件 cnpm install vue-qr -S 接下来在需要生产并下载二维码的页面引入 import VueQr from 'vue-qr' 并在components中注册为组件 ...
- PHP -----微擎内置方法生成二维码和下载二维码
1.新建一个类文件code.php,主要用于处理二维码的方法: 在页面的 顶部引用: load()->library('qrcode'); class code{//方法写在这 } 2.生成二维 ...
最新文章
- c语言用链表的方式实现多项式加减,如何实现C语言单链表多项式相加的操作
- 用C语言解“混合类型数据格式化输出”题
- 将unicode编码的txt文件转为utf-8编码
- 周报速递丨《网络安全审查办法》修订发布;微信支持数字人民币支付
- ASIHTTP 框架,同步、 异步请求、 上传 、 下载
- error: Refusing toundefine while domain managed save image exists
- 4.nslookup
- https默认端口_Java企业信息化平台O2OA如何配置服务器来启用HTTPS(SSL)
- android imageview实现点击图片放大,Android 点击图片放大方法
- 利用ESP8266与米思齐从零制作模拟温室大棚--程序篇
- 一文学懂risc-v汇编操作
- 轻松制作美容美发线下门店电子优惠券的实用方法分享
- 大疆精灵4航测输出正摄影和三维模型教程
- java 1 9随机数_Java-随机数详解
- SFFAI分享 | 张杰:针对图像处理网络的模型水印【附PPT与视频资料】
- 论文翻译:Learning Representations and Generative Models for 3D Point Clouds
- 【ELT.ZIP】OpenHarmony啃论文俱乐部——人工智能短字符串压缩
- 计算机单机游戏c0005错误,单机游戏安装中出现的错误,我教你解决它!
- Electron系列教程——第一篇:入门
- 如何把多张图片做成gif动图?
热门文章
- PAT --- 1037.在霍格沃茨找零钱 (20 分)
- spring schedule定时任务详解
- 性能测试 架构层(二) 从性能测试层面了解架构设计 分布式项目实施过程中的常见难点,测试架构层面思考性能测试应该如何做?自行思考解决方案是什么?
- 多任务学习原理与优化
- source insight设置
- ${0##*/}的意思
- python爬虫之-斗图网爬取
- C#界面里的winform AutoValidate和CausesValidation属性
- 学好新三科计算机英语,学英语专业新高考选科要求:英语专业高考选哪三科?...
- 奢侈品养护平台包大师获3000万元A轮融资,投资方青松基金、不惑创投