第一节: HttpClient 简介
HttpClient 是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。
最新版本4.5 http://hc.apache.org/httpcomponents-client-4.5.x/
官方文档: http://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html/index.html
maven地址:
1 <dependency> 2 <groupId>org.apache.httpcomponents</groupId> 3 <artifactId>httpclient</artifactId> 4 <version>4.5.2</version> 5 </dependency>
HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient。现在HttpClient最新版本为 HttpClient 4.5 (GA) (2015-09-11)
我们搞爬虫的,主要是用HttpClient模拟浏览器请求第三方站点url,然后响应,获取网页数据,然后用Jsoup来提取我们需要的信息;
第二节: HttpClient HelloWorld 实现
HttpClient HelloWorld实现
前面我们介绍了HttpClient 这个框架主要用来请求第三方服务器,然后获取到网页,得到我们需要的数据;
所以今天搞个简单实例,让大家体验一把。
首先建一个Maven项目,然后添加httpClient依赖,版本是4.5
1 <dependency> 2 <groupId>org.apache.httpcomponents</groupId> 3 <artifactId>httpclient</artifactId> 4 <version>4.5.2</version> 5 </dependency>
1 package com.javaxk.httpclient; 2 3 import java.io.IOException; 4 5 import org.apache.http.HttpEntity; 6 import org.apache.http.ParseException; 7 import org.apache.http.client.ClientProtocolException; 8 import org.apache.http.client.methods.CloseableHttpResponse; 9 import org.apache.http.client.methods.HttpGet; 10 import org.apache.http.impl.client.CloseableHttpClient; 11 import org.apache.http.impl.client.HttpClients; 12 import org.apache.http.util.EntityUtils; 13 14 public class HelloWorld { 15 16 public static void main(String[] args) { 17 CloseableHttpClient httpClient=HttpClients.createDefault(); // 创建httpClient实例 18 HttpGet httpGet=new HttpGet("http://www.javaxk.com/"); // 创建httpget实例 19 CloseableHttpResponse response = null; 20 try { 21 response = httpClient.execute(httpGet); // 执行http get请求 22 } catch (ClientProtocolException e) { //http协议异常 23 // TODO Auto-generated catch block 24 e.printStackTrace(); 25 } catch (IOException e) { //io异常 26 // TODO Auto-generated catch block 27 e.printStackTrace(); 28 } 29 HttpEntity entity=response.getEntity(); // 获取返回实体 30 try { 31 System.out.println("网页内容:"+EntityUtils.toString(entity, "utf-8"));// 指定编码打印网页内容 32 } catch (ParseException e) { //解析异常 33 // TODO Auto-generated catch block 34 e.printStackTrace(); 35 } catch (IOException e) { //io异常 36 // TODO Auto-generated catch block 37 e.printStackTrace(); 38 } 39 try { 40 response.close(); // response关闭 41 } catch (IOException e) { // io异常 42 // TODO Auto-generated catch block 43 e.printStackTrace(); 44 } 45 try { 46 httpClient.close(); // httpClient关闭 47 } catch (IOException e) { 48 // TODO Auto-generated catch block 49 e.printStackTrace(); 50 } 51 } 52 53 }
运行输出:
这里得到了网站首页源码,当然要获得具体数据的话,要用到Jsoup,我们后面会讲解该技术;
假如你对这些异常都熟悉 我们可以简化下,异常抛出,这样代码可读性好点。
1 package com.javaxk.httpclient; 2 3 import java.io.IOException; 4 5 import org.apache.http.HttpEntity; 6 import org.apache.http.client.ClientProtocolException; 7 import org.apache.http.client.methods.CloseableHttpResponse; 8 import org.apache.http.client.methods.HttpGet; 9 import org.apache.http.impl.client.CloseableHttpClient; 10 import org.apache.http.impl.client.HttpClients; 11 import org.apache.http.util.EntityUtils; 12 13 public class HelloWorld2 { 14 15 public static void main(String[] args) throws ClientProtocolException, IOException { 16 CloseableHttpClient httpClient=HttpClients.createDefault(); // 创建httpClient实例 17 HttpGet httpGet=new HttpGet("http://www.javaxk.com/"); // 创建httpget实例 18 CloseableHttpResponse response=httpClient.execute(httpGet); // 执行http get请求 19 HttpEntity entity=response.getEntity(); // 获取返回实体 20 System.out.println("网页内容:"+EntityUtils.toString(entity, "utf-8")); // 获取网页内容 21 response.close(); // response关闭 22 httpClient.close(); // httpClient关闭 23 } 24 25 }
但是实际开发的话,我们对于每一种异常的抛出,catch里都需要做一些业务上的操作,所以以后用的话,还是第一种,假如爬虫任务很简单,容易爬取,并且量小,那就第二种。还是要根据具体情况来。