最近需要做爬虫,研究了一下进行做http客户端的东东。
首先介绍一下http协议的工作大致原理,http协议是建立在tcp协议基础之上的一种应用层协议,tcp层的就不说了
首先web服务器在远程监听(默认80端口),由客户端发起请求,我们可以通过java提高的socket进行连接
Socket socket = new Socket("www.google.com", 80);
socket的构造有好几个方法,你可以这样最简单的方法构造,也可以指定本地地址(如果你有多个网卡或许有必要)和端口(像上面这样不指定则有操作系统随即分配)。
建立socket之后客户端将向服务器端发送数据,数据的内容就是请求的一些参数,第一行是status line,后面是http requester header, 如果是GET请求status line就是这样
GET http://wwww.google.com/ HTTP/1.1
这里GET后面的内容也可以是相对路径,那样的话就必须在后面加上Host参数了,参数怎么加呢,比如:
Host: www.google.com
User-Agent: Mozilla/5.0
Keep-Alive: 300
这样就给请求加了一些限制条件,但参数一般不是必须的,如果你请求的是相对路径,Host参数就少不了,应该像这样请求
GET / HTTP/1.1
Host: www.google.com
我们用java怎么实现呢,很简单啦,可以从socket中拿到输出流,把刚才的内容写出去就OK啦
String lineSep = System.getProperty("line.separator");
StringBuilder sb = new StringBuilder();
sb.append("GET / HTTP/1.1").append(lineSep)
.append("Host: www.google.com");
OutputStream out = socket.getOutputStream();
DataOutputStream dout = new DataOutputStream(new BufferedOutputStream(out));
dout.writeBytes(sb.toString());
dout.flush();
发送完数据后就要接收数据了,接收数据就是用socket拿到输入流,读数据了
InputStream in = socket.getInputStream();
DataInputStream din = new DataInputStream(BufferedInputStream(in));
拿到流之后爱怎么读就怎么读了,这样读的内容是不是单纯的网页内容,在网页内容的前面还包含了status line和http response header,这里的status line一般这样
HTTP/1.1 200 OK
表示协议,状态码,提示三部分,下面就header,包括一些参数,如
Date: Fri, 10 Apr 2009 03:32:50 GMT
Content-Length: 9697
以上介绍的方法比较麻烦,如果你要构建一个比较复杂的http客户端就很麻烦,想那些header都得自己解析,很烦。如果你像处理cookie就更复杂了,推荐大家使用Apache commons下的一个工具 httpclient,可以到http://hc.apache.org/downloads.cgi
去下载,目前的版本是3.1,4.0还是测试版,最上面那个httpcore4.0 GA我就搞不懂了,估计是他们想用core代替client,高手请指教,那个我用过,结构和用法跟client完全不一样,很多网站请求不了,不推荐用。我用的是3.1。
httpclient功能很强大,使用也很广泛,用法也很简单,下载之后有文档,写的很好,参考一下就好了,那里的e文很简单,个别不认识的lingoes就是了。
这里我给一个我写的用于GET请求的,没有做POST,也没处理cookie,因为我暂时还没这需求,有需要的可以下载看看啦。
httprequester.zip
需要注意的是很多网站做了限制,阻止爬虫,你需要设置User-Agent参数为firefox的或者其他浏览器,我设置成了firefox
还有一个很重要的是编码问题,header里一般会说明charset(不是一定有的),但这个charset不一定是网页内容的编码。网页内容里也可以说明是什么编码(也不是一定有的),同样这样编码也不一定是真实的编码。最牛逼的办法是用firefox提供的一个组件,叫做jchardet,它可以猜想出字节的编码,效果应该是跟firefox的一样。我这里已经把这个jar包放进去了,用了这个组件来解码,jchardet解不了的才用header里的或者网页内容声明的,测试了很多网站,没有出现解码错误,效果不错。
这个附件了有所有依赖的jar,都放在lib里了,加到你的classpath里就可以用了,httprequester-1.0.jar是我写的,打包成二进制了,源代码在src里,javadoc在doc里。
分享到:
相关推荐
利用HttpClient发送HTTP请求 利用HttpClient发送HTTP请求
httpclient的用法,发送get请求和post请求,设置header
### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...
try(CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost(url); StringEntity stringEntity = new StringEntity(params, Charset.forName("UTF-8")); ...
在Java应用中,如果你需要发送HTTP请求,HttpClient是一个非常实用的选择。本篇文章将详细介绍使用HttpClient库发送HTTP请求所需的基本知识。 首先,我们来关注"org.apache.http"这个包。这是HttpClient的核心包,...
在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求和处理响应。这个工具广泛应用于各种场景,如数据抓取、API交互等。本文将深入讲解如何使用HttpClient来发送HTTP请求,以及相关的源码分析。 ...
本篇文章将深入探讨如何使用HTTPClient发送POST请求,以及相关的项目结构和实现细节。 首先,"post-demo"项目定义了我们需要调用的接口。通常,这会是一个Web服务,可能是一个RESTful API,提供特定的功能或数据。...
不会的可以在评论区留言哈,这是我自己做项目用到的。所以绝对可用!同时共享出来给到大家
在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求。这个压缩包可能包含了实现HTTP GET和POST请求所需的jar包以及示例代码,帮助开发者理解如何使用HttpClient进行网络通信。下面将详细介绍...
HttpClient是Java中用于执行HTTP请求的一个强大库,它提供了丰富的功能,可以方便地进行GET、POST请求,并且能够处理复杂的网络交互,包括发送文件等操作。下面我们将详细讨论HttpClientUtil工具类如何实现这些功能...
在Java编程中,HTTPClient库是一个非常常用的工具,用于发送HTTP请求,包括POST方式的请求。本篇文章将详细讲解如何使用HTTPClient库以POST方式发送JSON格式的数据,并介绍相关依赖包。 首先,为了使用HTTPClient库...
本篇将详细介绍如何使用HttpClient发送HTTP请求,包括POST和GET方法,同时提供相关的jar包依赖以及Java代码示例,并对关键代码进行注解解释。 一、HttpClient库的引入 在Java项目中,首先需要添加HttpClient的jar包...
一个简单的易学的 基于HttpClient 4.3发送psot及get请求,返回数据,适合初学者,适合初学者
HttpClient是Apache基金会开发的一个HTTP客户端库,用于在Java应用程序中执行HTTP请求。它允许开发者模拟GET和POST等HTTP请求,并可以方便地发送JSON等数据作为请求参数。在本文中,我们将深入探讨如何使用...
同时,通过阅读如"HttpClient发送get请求和post请求"这样的博客,你可以获取更多关于HttpClient实战中的技巧和最佳实践。在提供的压缩包文件中,`test-demo`和`httpclient-demo`可能包含了这些示例的源码,供你...
HttpClient是Apache基金会开发的一个Java库,它允许程序员方便地向HTTP服务器发送请求并接收响应。在处理HTTPS(安全超文本传输协议)请求时,HttpClient扮演着至关重要的角色,尤其是在涉及敏感数据交换或需要验证...
封装了一些采用HttpClient发送HTTP请求的方法;httpPOST2方法HttpUtil.post(url, params)需引入jar <dependency> <groupId>...
HttpClient是.NET Framework和.NET Core中用于发送HTTP请求的标准库,它提供了异步和同步的API,适用于各种网络操作,如GET、POST、PUT等。 描述中的链接指向了一个具体的博客文章,该文章详细解释了如何在C#项目中...
### JAVA发送HttpClient请求及接收请求结果过程 #### 一、概述 在Java开发过程中,经常需要与外部系统进行HTTP通信,比如发送POST或GET请求来获取数据或提交数据。Apache HttpClient是一个强大的HTTP客户端库,提供...