`
tuoxie007
  • 浏览: 162819 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

用httpclient模仿firefox发送http请求

    博客分类:
  • Java
阅读更多

 

 

最近需要做爬虫,研究了一下进行做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里。

2
0
分享到:
评论
2 楼 flyfox1982 2009-11-22  
谢谢了,想学习下爬虫相关知识,能加你聊聊吗? tanyb02@163.com
1 楼 Hooopo 2009-05-02  

相关推荐

    利用HttpClient发送HTTP请求

    利用HttpClient发送HTTP请求 利用HttpClient发送HTTP请求

    httpclient用法,发送get和post请求,设置header

    httpclient的用法,发送get请求和post请求,设置header

    java HttpClient 发送GET请求和带有表单参数的POST请求教程例子

    ### Java HttpClient 发送GET请求和带有表单参数的POST请求详解 #### 一、概述 在Java编程中,处理HTTP请求是一项常见的需求,特别是在与Web服务进行交互时。Apache HttpClient库提供了一种强大的方法来执行HTTP...

    SpringBoot使用httpclient发送Post请求时

    try(CloseableHttpClient httpClient = HttpClients.createDefault()) { HttpPost httpPost = new HttpPost(url); StringEntity stringEntity = new StringEntity(params, Charset.forName("UTF-8")); ...

    HttpClient发送http请求需要的jar包

    在Java应用中,如果你需要发送HTTP请求,HttpClient是一个非常实用的选择。本篇文章将详细介绍使用HttpClient库发送HTTP请求所需的基本知识。 首先,我们来关注"org.apache.http"这个包。这是HttpClient的核心包,...

    java使用HttpClient发送http请求

    在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求和处理响应。这个工具广泛应用于各种场景,如数据抓取、API交互等。本文将深入讲解如何使用HttpClient来发送HTTP请求,以及相关的源码分析。 ...

    httpclient发送post请求

    本篇文章将深入探讨如何使用HTTPClient发送POST请求,以及相关的项目结构和实现细节。 首先,"post-demo"项目定义了我们需要调用的接口。通常,这会是一个Web服务,可能是一个RESTful API,提供特定的功能或数据。...

    httpclient4.5发送https请求(验证证书)

    不会的可以在评论区留言哈,这是我自己做项目用到的。所以绝对可用!同时共享出来给到大家

    HttpClient发送http请求(post和get)需要的jar包+内符java代码案例+注解详解

    在Java编程中,HttpClient是一个非常重要的工具库,用于发送HTTP请求。这个压缩包可能包含了实现HTTP GET和POST请求所需的jar包以及示例代码,帮助开发者理解如何使用HttpClient进行网络通信。下面将详细介绍...

    HttpClientUtil工具类发送get和post请求,支持http和https,支持发送文件

    HttpClient是Java中用于执行HTTP请求的一个强大库,它提供了丰富的功能,可以方便地进行GET、POST请求,并且能够处理复杂的网络交互,包括发送文件等操作。下面我们将详细讨论HttpClientUtil工具类如何实现这些功能...

    httpclient post方式发送请求

    在Java编程中,HTTPClient库是一个非常常用的工具,用于发送HTTP请求,包括POST方式的请求。本篇文章将详细讲解如何使用HTTPClient库以POST方式发送JSON格式的数据,并介绍相关依赖包。 首先,为了使用HTTPClient库...

    HttpClient发送http请求(post+get)需要的jar包+内符java代码案例+注解详解

    本篇将详细介绍如何使用HttpClient发送HTTP请求,包括POST和GET方法,同时提供相关的jar包依赖以及Java代码示例,并对关键代码进行注解解释。 一、HttpClient库的引入 在Java项目中,首先需要添加HttpClient的jar包...

    HttpClient 发送get和post请求

    一个简单的易学的 基于HttpClient 4.3发送psot及get请求,返回数据,适合初学者,适合初学者

    HttpClient模拟get,post请求并发送请求参数(json等)

    HttpClient是Apache基金会开发的一个HTTP客户端库,用于在Java应用程序中执行HTTP请求。它允许开发者模拟GET和POST等HTTP请求,并可以方便地发送JSON等数据作为请求参数。在本文中,我们将深入探讨如何使用...

    httpclient发送get请求和post请求demo

    同时,通过阅读如"HttpClient发送get请求和post请求"这样的博客,你可以获取更多关于HttpClient实战中的技巧和最佳实践。在提供的压缩包文件中,`test-demo`和`httpclient-demo`可能包含了这些示例的源码,供你...

    httpClient发送HTTP请求

    HttpClient是Apache基金会开发的一个Java库,它允许程序员方便地向HTTP服务器发送请求并接收响应。在处理HTTPS(安全超文本传输协议)请求时,HttpClient扮演着至关重要的角色,尤其是在涉及敏感数据交换或需要验证...

    封装采用HttpClient发送HTTP请求的方法

    封装了一些采用HttpClient发送HTTP请求的方法;httpPOST2方法HttpUtil.post(url, params)需引入jar <dependency> <groupId>...

    对于C#(HttpClient)方式网络请求的封装

    HttpClient是.NET Framework和.NET Core中用于发送HTTP请求的标准库,它提供了异步和同步的API,适用于各种网络操作,如GET、POST、PUT等。 描述中的链接指向了一个具体的博客文章,该文章详细解释了如何在C#项目中...

    JAVA发送HttpClient请求及接收请求结果过程

    ### JAVA发送HttpClient请求及接收请求结果过程 #### 一、概述 在Java开发过程中,经常需要与外部系统进行HTTP通信,比如发送POST或GET请求来获取数据或提交数据。Apache HttpClient是一个强大的HTTP客户端库,提供...

Global site tag (gtag.js) - Google Analytics