使用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使用的更多相关文章

  1. java爬虫笔记

    一.URl解释 1.URl统一资源定位符, Uniform Resource Location 也就是说是Internet上信息资源的字符串,所谓的网页抓取就是把URl地址中指定的网络资源从网络中读取 ...

随机推荐

  1. Retimer、Redriver(Level Shifter)

    重定时器Retimer和驱动器Redriver9(Level Shifter) 在高速串行通道的信号传输中,需要使用Redriver 和Retimer来保证信号传输的质量. Redriver,可以重新 ...

  2. POI-----POI操作Excel-4、字体

  3. C# winform ListView 的右键菜单的下级菜单的选项视情况禁用方法

    ListView 和右键菜单例如以下图: 要实现功能是: 1.用户状态为[活动]时,改动用户状态为[活动]禁用,反之则反. 2.而且仅仅实用户状态为[非活动]时,[删除学员用户]才是可用状态. 功能非 ...

  4. cuda9,cuda8分享百度云下载

    一.文件名称: md5-cuda9cuda-repo-ubuntu1704-9-0-local_9.0.176-1_amd64.debcuda-repo-ubuntu1604-9-0-local_9. ...

  5. Java 语法清单

      Java 语法清单 Java 语法清单翻译自 egek92 的 JavaCheatSheet,从属于笔者的 Java 入门与实践系列.时间仓促,笔者只是简单翻译了些标题与内容整理,支持原作者请前往 ...

  6. 事件总线EventBus

    什么是事件总线管理? 将事件放到队列里,用于管理和分发: 保证应用的各个部分之间高效的通信及数据,事件分发: 模块间解耦: 什么是EventBus? EventBus是发布/订阅的事件总线.Event ...

  7. Java Web Start

    1. JNLP 2. Security issue: https://java.com/en/download/help/win_controlpanel.xml Windows 7, Vista C ...

  8. 关于移动端文字无法垂直居中(或line-height不起作用)的问题的解决方案(网摘)

    最近开发移动端APP,发现安卓端对于文字垂直居中的问题兼容性不好,网上也搜了很多方法,但是都比较麻烦,自己摸索出来了最终的解决方案: 1.首先在html头部把我们常用的lang="en&qu ...

  9. teradata培训文档 相关索引

    teradata培训文档 http://wenku.baidu.com/view/ec44c201cc175527072208ba.html Teradata 和Greenplum 的讨论 http: ...

  10. EasyDarwin开源手机直播方案:EasyPusher手机直播推送,EasyDarwin流媒体服务器,EasyPlayer手机播放器

    在不断进行EasyDarwin开源流媒体服务器的功能和性能完善的同时,我们也配套实现了目前在安防和移动互联网行业比较火热的移动端手机直播方案,主要就是我们的 EasyPusher直播推送项目 和 Ea ...