HrrpClient使用
使用HttpClient获取网页内容的过程
1、创建一个CloseableHttpClient类的实例;
2、使用这个实例执行HTTP请求,得到一个HttpResponse的实例;
3、最后,通过HttpResponse的实例得到返回的二进制流,二进制流封装在HttpEntity中。根据指定的字符集把二进制流转
换成字符串,完成下载。
CloseableHttpClient类中存储了一些全局信息。创建CloseableHttpClient类的实例的代码如
下所示。
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
创建一个客户端,类似于打开一个浏览器。HttpClient支持所有定义在HTTP/1.1版本中的
HTTP方法。对于每个方法类型都有一个特定的类,爬虫最常用的是表示HTTP GET方法的
org.apache.http.client.methods.HttpGet,这样是为了避免误抓登录后才能看到数据。
//创建一个GET方法,类似于在浏览器地址栏中输入一个地址
HttpGet httpget = new HttpGet("http://www.lietu.com/");
使用 CloseableHttpClient 执行 GET 请求。
//类似于在浏览器地址栏中输入回车,获得网页内容
HttpResponse response = httpclient.execute(httpget);
查看返回的内容,类似于在浏览器查看网页源代码。
HttpEntity entity = response.getEntity();
if (entity != null) {
//读入内容流,并以字符串形式返回,这里指定网页编码是UTF-8
System.out .println (EntityUtils. toString (entity, "utf-8")); //网页的 Meta 标签中指定了编码
EntityUtils. consume (entity);//关闭内容流
}
最后需要释放和Web服务器建立的连接。
httpclient.close();
把使用HttpClient下载的网页封装成一个方法。
public static String downloadPage(String path) throws IOException{
//创建一个客户端,类似于打开一个浏览器
CloseableHttpClient httpclient = HttpClientBuilder.create().build();
//创建一个GET方法,类似于在浏览器地址栏中输入一个地址
HttpGet httpget = new HttpGet(path);
//类似于在浏览器地址栏中输入回车,获得网页内容
HttpResponse response = httpclient.execute(httpget);
//查看返回的内容,类似于在浏览器查看网页源代码
HttpEntity entity = response.getEntity();
if (entity != null) {
//读入内容流,并以字符串形式返回,这里指定网页编码是UTF-8
String html = EntityUtils .toString (entity, "GBK");//网页的 Meta 标签中指定了编码
EntityUtils. consume (entity);//关闭内容流
return html;
}
return null;
调用EntityUtils.consume方法是为了关闭内容流,更好的方法是调用
EntityUtils.consumeQuietly(entity)方法保证完全消费了实体对象。
这个程序中,爬虫程序发出下面这样的GET请求得到网页。
GET / HTTP/1.1
从返回的请求得到字符串最简单的方法。
BasicResponseHandler handler = new BasicResponseHandler ();
String content = httpclient.execute(httpget, handler);
如果使用BasicResponseHandler,则需要自己处理碰到的异常。例如碰到Service Unavailable
时,需要自己写重试的代码。
BasicResponseHandler handler = new BasicResponseHandler {);
String content = null;
do{
try{
content = httpclient.execute(httpget, handler);
}catch(org.apache.http.client.HttpResponseException ex){
ex.printStackTrace();
System.out.println ("retry..");
Thread.sleep(3000);
}
}while(content == null);
当我们不希望在某个网址上花太多时间去等待下载完成时,要设置超时。
//配置参数
int socketTimeout = 9000; //读数据超时
int connectionTimeout = 9000; //连接超时
//请求配置
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectionTimeout)
.setConnectionRequestTimeout(connectionTimeout)
.setSocketTimeout(socketTimeout).build();
CloseableHttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();
表单post
。提交一个参数包括名字和值两项。NameValuePair是一个接口,而
BasicNameValuePair则是这个接口的实现,使用BasicNameValuePair封装名字/值对。例如,参
数名cityld对应的值是1,代码如下所示。
new BasicNameValuePair("cityld", "1");
模拟提交表单并返回结果的代码如下所示。
HttpClient httpclient = new DefaultHttpClient();
//使用HttpPost发送POST请求
HttpPost httppost = new HttpPost(’'http://hotels.ctrip.com/Domestic/ShowHotelList.aspx");
//POST数据
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair> ⑶;"3个参数
nameValuePairs. add (new BasicNameValuePair ("checkin", "2011-4-15")); //入住日期
nameValuePairs.add (new BasicNameValuePair ("checkout", "2011-4-25"}); //离店日期
nameValuePairs. add (new BasicNameValuePair ("cityld", " 1")); //城市编码
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
//执行HTTP POST请求
HttpResponse response = httpclient.execute(httppost);
//取得内容流
HttpEntity entity = response.getEntity();
InputStream is = entity.getContent();
BufferedlnputStream bis = new BufferedlnputStream(is);
ByteArrayBuffer baf = new ByteArrayBuffer(20);
//按字节读入内容流到字节数组缓存
int current = 0;
while ((current = bis.read()) != -1) {
baf.append((byte) current);
}
String text = new String (baf. toByteArray (), "gb2312"); //指定编码
System.out.println(text);
上面的例子说明了如何使用POST方法来访问Web资源。与GET方法不同,POST方法可
以提交二进制格式的数据,因此可以传递“无限”多的参数。而GET方法釆用把参数写在URL
里面的方式,由于URL有长度限制,因此传递参数的长度会有限制。
HrrpClient使用的更多相关文章
- java爬虫笔记
一.URl解释 1.URl统一资源定位符, Uniform Resource Location 也就是说是Internet上信息资源的字符串,所谓的网页抓取就是把URl地址中指定的网络资源从网络中读取 ...
随机推荐
- Hdu-1565 方格取数(1) (状态压缩dp入门题
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- 显示和隐藏Mac隐藏文件的命令
显示Mac隐藏文件的命令:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏Mac隐藏文件的命令:defaults writ ...
- 转:DDR原理详解
首先,我们先了解一下内存的大体结构工作流程,这样会比较容量理解这些参数在其中所起到的作用.这部分的讲述运用DDR3的简化时序图. DDR3的内部是一个存储阵列,将数据“填”进去,你可以它想象成一张表格 ...
- 前端UI框架整理
JQuery Jquery官网:http://jquery.com/ jQuery是一个快速,小巧,且功能丰富的JavaScript库. Jquery-1.11.3.min.js 压缩版:http:/ ...
- android中的MD5、Base64、DES/3DES/ADES加解密
MD5摘要算法: <span style="font-size:18px;">主要代码: String s = edit.getText().toString(); i ...
- git+jenkins
开发写代码的演变 一个开发单打独斗,撸代码,开发网站,自由自在 多个开发同时开发一个网站,同时改一份代码.但是同时改一个文件会导致冲突 分支结构,每天上班第一件事克隆代码,下班前最后一件事合并代码 好 ...
- 看完此文,妈妈还会担心你docker入不了门?
本文在个人技术博客不同步发布,详情可猛戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 上周对象突然心血来潮说想养个小宠物,我问想养啥她又说随便,你看着办!!!这我 ...
- 解决Linq.ToDictionary()时的键重复问题
今天在使用 Linq 的 ToDictionary() 时发生了异常,提示: System.ArgumentException: 已添加了具有相同键 因为以前一直没有遇到有相同键的情况,所以从来没关注 ...
- 对H.264帧类型判断方法
背景描述 我们经常在网络直播推流或者客户端拉流的时候,需要对获取到的H.264视频帧进行判断后处理,我们经常获取到各种不同的视频数据0x67 0x68 0x65 0x61,0x27 0x28 0x25 ...
- EasyPusher实现将asterisk直播流以RTSP转发实现通话直播与录像
本文转自博客:http://blog.csdn.net/jinlong0603/article/details/56047145 EasyPusher RTP直播推送介绍 EasyPusher是一个推 ...