HttpClient的使用-爬虫学习(一)
Apache真是伟大,为我们提供了HttpClient.jar,这个HttpClient是客户端的http通信实现库,这个类库的作用是接受和发送http报文,引进这个类库,我们对于http的操作会变得简单一些,事不宜迟,赶快介绍。
在将这个HttpClient之前,我们必须弄清两个概念:URL和URI
URI(Universal Resource Identify),通用资源标识符,而URL(Uniform Resource Locator),统一资源定位符,两个有什么区别,其实就是范围大小的问题,URI是包含URL的,URI由访问资源的命名机制、存放资源的主机名、资源自身的路径组成,而URL由协议、资源的主机IP地址、主机资源的具体地址组成,有他们两个的组成我们可以清楚的看出,其实URL就是我们平时输入浏览器的地址,如“http://www.hao123.com”,URL是URI的具体表现形式而已,URI是包含URL的。
下面正式学习HttpClient:
我讲解的这个HttpClient版本是4.0以上的,如果要运行我的代码的话就要引用4.0以上的jar包。
1.创建一个客户端,使用HttpClient,用它来处理与http相关的操作,我们可以理解为创建一个浏览器那样:
HttpClient httpClient = new DefaultHttpClient();
2.创建一个HttpGet类,相当于与在浏览器中打开一个URL,该类的构造接受一个String类型的参数,就是我们要输入的URL了:
HttpGet httpGet = new HttpGet("http://www.hao123.com");
3.通过HttpClient的execute方法,参数为HttpGet类型的参数,相当于打进网址后回车,这个我们可以得到HttpResponse,这个是代表请求后对应的响应:
HttpResponse response = httpClient.execute(httpGet);
4.通过这个response我们可以拿到一个HttpEntity类的实体,这个实体里面有着Http报文的许多信息,当然包括我们想要的内容:
HttpEntity entity = response.getEntity();
5.通过entity这个实体,我们可以调用它的getContent方法,拿到的就是网页的内容,但这个内容是InputStream,不过有了InputStearm,什么都好办了:
InputStream instream = entity.getContent();
下面我们来看看一个完整的抓取www.hao123.com内容的实例:
@Test
public void testGet() throws Exception {
HttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://www.hao123.com");
HttpResponse response = httpClient.execute(httpGet);
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
int l;
byte[] tmp = new byte[2048];
while ((l = instream.read(tmp)) != -1) {
System.out.println(new String(tmp, 0, l, "utf-8"));
}
}
}
下面具体一点来介绍:
1.Http请求
HttpClient支持所有定义在Http/1.1版本中的的方法:get、post、head、put、delete、trace和options,对应每个方法都有一个类:HttpGet、HttpPost、HttpHead、HttpPut、HttpDelete、HttpTrace和HttpOptions
上面这些方法类中,除了可以有String参数的构造方法外,还有一个URI参数的构造方法,通过这个uri就发出请求,这个URI类其实我们jdk自带的,但是Apache真是为我们着想,提供了URIUtils类帮助我们,有兴趣可以去了解一下。
2.Http响应
HttpResponse是HttpClient提供给我们的响应类,响应是服务器发给客户端的报文,报文中包含了各种信息,通过下列方法我们可以拿到这些信息:
getProtocolVersion():返回报文的协议版本
getStatusLine():返回响应报文的第一行内容
getStatusLine().getStatusCode():返回报文的状态码
示例:
@Test
public void testResponseMethod() {
//模拟一个响应
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
System.out.println("协议版本:" + response.getProtocolVersion());
System.out.println("协议信息:" + response.getStatusLine());
System.out.println("协议状态码:" + response.getStatusLine().getStatusCode());
}
3.Http报文头部:
一个http报文头部可以包含很多信息,如内容的长度、内容的类型等等各种各样的信息。HttpResponse有着很多方法处理头部的信息:
addHeader(String name, String value):增加一个头部信息,一个key,一个value
getFirstHeader(String name):拿到第一个header
getLastHeader(String name):拿到最后一个header
getHeads(String name):拿到一个head数组
headerIterator(String name):拿到一个数组的迭代器
不仅如此,通过HeaderElementIterator我们还可以迭代出里面value的信息,看示例:
@Test
public void testHeadMethod() {
HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");
response.addHeader("cookie", "c1=a;path=/;domain=localhost");
response.addHeader("cookie", "c2=b;path=/guo;domain=localhost:8080");
response.addHeader("cookie", "path=/ray;domain=localhost:3306");
System.out.println(response.getFirstHeader("cookie"));
System.out.println(response.getLastHeader("cookie"));
System.out.println("---------------------------------------------"); Header[] heads = response.getHeaders("cookie");
for(Header head : heads)
System.out.println(head);
System.out.println("---------------------------------------------"); HeaderIterator it = response.headerIterator();
while(it.hasNext())
System.out.println(it.next());
System.out.println("---------------------------------------------"); HeaderElementIterator hei = new BasicHeaderElementIterator(response.headerIterator());
while(hei.hasNext()) {
HeaderElement element = hei.nextElement();
System.out.println(element.getName() + "=" + element.getValue());
NameValuePair[] params = element.getParameters();
for(NameValuePair name : params)
System.out.println(name);
}
}
4.Http实体
实体是响应请求成功发送到客户端时创建的,通过Entity我们可以拿到很多信息,看看下面的方法:
getContent():这个拿到响应的内容,前面我们就用过了
getContentType():拿到content的类型信息
getContentLength():拿到content的长度
通过EntityUtils类我们可以更加方法的拿到一些信息,看下面:
@Test
public void testEntityMethod() throws Exception {
StringEntity entity = new StringEntity("username=xujianguo", "utf-8");
System.out.println(entity.getContentType());
System.out.println(entity.getContentLength());
System.out.println(EntityUtils.toString(entity));
}
5.Http状态码
| 状态码 | 描述 |
| 200 | 请求成功 |
| 201 | 请求完成,结果是创建了新资源 |
| 202 | 请求被接受,但处理还没完成 |
| 204 | 服务器已经完成了请求,但是没有返回新的信息 |
| 300 | 存在多个可用的被请求资源 |
| 301 | 请求道的资源都会分配一个永久的url |
| 302 | 请求道的资源放在一个不同的url中临时保存 |
| 304 | 请求的资源未更新 |
| 400 | 非法请求 |
| 401 | 未授权 |
| 403 | 禁止 |
| 404 | 找不到页面 |
HttpClient的使用-爬虫学习(一)的更多相关文章
- HttpClient的使用-爬虫学习1
HttpClient的使用-爬虫学习(一) Apache真是伟大,为我们提供了HttpClient.jar,这个HttpClient是客户端的http通信实现库,这个类库的作用是接受和发送http报文 ...
- 半途而废的Java爬虫学习经历
最近在面试,发现Java爬虫对于小数据量数据的爬取的应用还是比较广,抽空周末学习一手,留下学习笔记 Java网络爬虫 简单介绍 爬虫我相信大家都应该知道什么,有什么用,主要的用途就是通过程序自动的去获 ...
- python爬虫学习(1) —— 从urllib说起
0. 前言 如果你从来没有接触过爬虫,刚开始的时候可能会有些许吃力 因为我不会从头到尾把所有知识点都说一遍,很多文章主要是记录我自己写的一些爬虫 所以建议先学习一下cuiqingcai大神的 Pyth ...
- python爬虫学习 —— 总目录
开篇 作为一个C党,接触python之后学习了爬虫. 和AC算法题的快感类似,从网络上爬取各种数据也很有意思. 准备写一系列文章,整理一下学习历程,也给后来者提供一点便利. 我是目录 听说你叫爬虫 - ...
- 爬虫学习之基于Scrapy的爬虫自动登录
###概述 在前面两篇(爬虫学习之基于Scrapy的网络爬虫和爬虫学习之简单的网络爬虫)文章中我们通过两个实际的案例,采用不同的方式进行了内容提取.我们对网络爬虫有了一个比较初级的认识,只要发起请求获 ...
- 爬虫学习之基于Scrapy的网络爬虫
###概述 在上一篇文章<爬虫学习之一个简单的网络爬虫>中我们对爬虫的概念有了一个初步的认识,并且通过Python的一些第三方库很方便的提取了我们想要的内容,但是通常面对工作当作复杂的需求 ...
- Python爬虫学习:三、爬虫的基本操作流程
本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:三.爬虫的基本操作与流程 一般我们使用Python爬虫都是希望实现一套完整的功能,如下: 1.爬虫目标数据.信息: 2.将 ...
- Python爬虫学习:四、headers和data的获取
之前在学习爬虫时,偶尔会遇到一些问题是有些网站需要登录后才能爬取内容,有的网站会识别是否是由浏览器发出的请求. 一.headers的获取 就以博客园的首页为例:http://www.cnblogs.c ...
- Python爬虫学习:二、爬虫的初步尝试
我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...
随机推荐
- Nyoj 吝啬的国度(图论&&双DFS)
描述在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你 ...
- 从头开始学JavaScript (十)——垃圾收集
原文:从头开始学JavaScript (十)--垃圾收集 一.垃圾收集 1.1javascript垃圾收集机制: 自动垃圾收集,执行环境会负责管理代码执行过程中的使用的内存.而在C和C++之类的语言中 ...
- iOS开发分析"秘密"App内容页面的效果(两)
@我前几天写的"秘密"的Cell制品的效果,想要的效果还是有差距,并且扩展性非常不好,于是重写封装,把总体视图都放到scrollView中,基本是和secret app 一模一样的 ...
- 在VirtualBox安装OS X 10.10
下面将指导介绍了如何引入自由和强大VirtualBox安装在虚拟机上OS X Yosemite 10.10 法律免责声明:本指南旨在说明如何在定期购买的苹果电脑上创建一个虚拟机执行真正的Mac OS ...
- windows7股票的,win8残疾人,安装Han澳大利亚sinoxn个时间,sinox它支持大多数windows软体
腾讯科技: 正如先前所宣布,微软,10一个月31迄今,Windows 7家庭基础版.家庭高级版和旗舰版盒装版本将不再销售.而微软是不会再OEM制造商授予许可数量的三个版本. windows7股票的.由 ...
- 一个大浪Java罢工(一个)安装JDK和环境变量配置
一个.基础知识 (一)什么是Java? Java是一种能够撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台( ...
- 一个意想不到的CDO.Message 错误
原文:一个意想不到的CDO.Message 错误 几个月之前,写了一个服务从MSMQ取消息发群发邮件的程序,一直也没时间测试,今日一试,出现发送邮件时报错,异常情况如下: "Syst ...
- InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布
原文:InstallShield集成安装MSDE2000最小版本(二) fishout特许授权发布 原帖地址:http://blog.csdn.net/fishout/archive/2009/10/ ...
- Linux C语言操作MySQL
原文:Linux C语言操作MySQL 1.MySQL数据库简介 MySQL是一个开源码的小型关系数据库管理系统,体积小,速度快,总体成本低,开源.MySQL有以下特性: (1) 使用C和C++编写, ...
- 【Android开发日记】第一个任务Android Service!Service靴+重力感应器+弹出窗口+保持执行
前言: 近期在写一个小程序,需求是手机摇一摇就弹窗出来.第一次使用了Service,学习了两天,实现了Service弹窗,开机启动,Service启动和销毁,Service保持一直执行. 满足了自己的 ...