JAVA网络爬虫(三):HttpClient获取HTML

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hujingshuang/article/details/78923926

在本爬虫项目中采用Httpclient来模拟客户端浏览器,访问并获取网页资源。

HttpClient简介

Http协议是互联网中最重要的协议之一。虽然JDK中的java.net包提供了一些http的基本方法,可以通过http协议来访问网络资源,但是在绝大多数情况下不够灵活和强大。HttpClient是Apache Jakarta Commom的子项目,致力于填补这个空缺,它提供了有效的,最新的、丰富的包,HttpClient即支持基本的http协议,还支持http-aware客户端程序,如web浏览器,Webservice客户端,以及利用或扩展的http协议的分布式系统。

HttpClient的特性

  • 基于标准、纯净的JAVA语言,实现了Http1.0和1.1,支持Https协议;
  • 在http1.0和http1.1中利用KeepAlive保持持久连接;
  • 实验性的支持http1.1 response caching;
  • 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE);
  • 通过Http代理建立透明的连接;
  • 利用CONNECT方法通过Http代理建立隧道的Https连接;
  • Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案及插件式的自定义认证方案;
  • 便携可靠的套接字工厂使它更容易的使用第三方解决方案;
  • 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接;
  • 自动处理Set-Cookie中的Cookie及插件式的自定义Cookie策略;
  • Request的输出流可以避免流中内容直接缓冲到socket服务器;
  • Response的输入流可以有效的从socket服务器直接读取相应内容;
  • 直接获取服务器发送的response code和 headers;
  • 设置连接超时的能力;
  • 源代码基于Apache License 可免费获取;

HttpClient配置

  • 使用Maven管理项目时,需要在pom中添加依赖如下:
    <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
    <dependency>
      <groupId>org.apache.httpcomponents</groupId>
      <artifactId>httpclient</artifactId>
      <version>4.5.4</version>
    </dependency>

HttpClient的使用步骤

使用HttpClient的发送请求,接收响应很简单,一般需要如下几个步骤即可:

  • 创建HttpClient对象;
  • 创建请求方法的实例,并制定请求的URL(用HttpGet来创建GET请求,HttpPost来创建POST请求);
  • 在setParams()方法中添加请求参数,HttpPost对象也可以通过setEntity()方法来设置请求参数;
  • 调用HttpClient对象的execute()方法来发送请求,该方法将会返回一个HttpResponse对象;
  • 调用HttpResponse对象的getAllHeaders()、getHeaders()等方法可获取服务器的响应头,调用getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容;
  • 释放链接。

使用HttpClient获取HTML

public String getSource(String url) {
    String html = new String();
    HttpGet httpget = new HttpGet(url);     //创建Http请求实例,URL 如:https://cd.lianjia.com/
    // 模拟浏览器,避免被服务器拒绝,返回返回403 forbidden的错误信息
    httpget.setHeader("User-Agent", 
    "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36");

    CloseableHttpResponse response = null;
    CloseableHttpClient httpclient = HttpClients.createDefault();   // 使用默认的HttpClient
    try {
        response = httpclient.execute(httpget);
        if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {     // 返回 200 表示成功
            html = EntityUtils.toString(response.getEntity(), "utf-8");     // 获取服务器响应实体的内容
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (response != null) {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return html;
}

一般情况下,按照上述步骤,使用如下代码便可抓取到链家的HTML内容,若要爬需要用户登录验证的网站(如最简单的用户名-密码认证),则需要使用UsernamePasswordCredentials形成一组安全主体和密码,该类一般可满足HTTP标准规范中的认证机制要求。

UsernamePasswordCredentials creds = new UsernamePasswordCredentials("username", "password");
httpclient.getState().setCredentials(AuthScope.ANY, creds); 

HttpClient既支持HTTP标准规范定义的认证模式,又支持一下广泛使用的非标准认证模式,比如 NTLM 和 SPNEGO。

猜你喜欢

转载自blog.csdn.net/hujingshuang/article/details/78923926