Java爬虫入门简介(一) —— HttpClient请求及其使用方法

原创 2017年07月27日 21:06:48

原文地址:http://www.datalearner.com/blog/1051501160659926

数据是科研活动重要的基础。本系列博客将讲述如何使用Java工具获取网络的数据。


博客系列

Java爬虫入门简介(一) —— HttpClient请求(本文)
Java爬虫入门简介(二) —— Jsoup解析HTML页面


首先,我们讲述一下爬虫的基本原理。爬虫的基本原理很简单,就是利用程序访问互联网,然后将数据保存到本地中。我们都知道,互联网提供的服务大多数是以网站的形式提供的。我们需要的数据一般都是从网站中获取的,如电商网站商品信息、商品的评论、微博的信息等。爬虫和我们手动将看到的数据复制粘贴下来是类似的,只是获取大量的数据靠人工显然不太可能。因此,需要我们使用工具来帮助获取知识。使用程序编写爬虫就是使用程序编写一些网络访问的规则,将我们的目标数据保存下来。接下来,让我们开始从头搭建一个爬虫的案例。

一、环境的准备

这里的环境就是指开发环境,本博客将使用Java编写爬虫程序,因此,需要构建Java的编程环境。需要安装的软件包括(注意,我的电脑使用的是windows X64的程序,请选择对应的JDK版本,要使用8.0及以上):
1、JDK 8.0: http://download.oracle.com/otn-pub/java/jdk/8u144-b01/090f390dda5b47b9b721c7dfaa008135/jdk-8u144-windows-x64.exe
2、IntelliJ IDEA: https://download.jetbrains.8686c.com/idea/ideaIC-2017.2.exe

JDK的安装和环境变量的配置网上有很多,就不说了。IntelliJ IDEA是个傻瓜式的安装,基本不会有问题。也不说了。

二、创建工程

安装好环境后,我们打开IntelliJ IDEA,然后创建一个Maven工程,Group Id和Artifact Id自己随便写没关系的。创建完之后我们的目录就如下图所示了。




好了,下面我们就开始编写爬虫了。

三、第一个示例

首先,假设我们需要爬取数据学习网站上第一页的博客(http://www.datalearner.com/blog )。首先,我们需要使用maven导入HttpClient 4.5.3这个包(这是目前最新的包,你可以根据需要使用其他的版本)。那么,我们在pom.xml中添加如下语句:

<dependencies>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.3</version>
    </dependency>
</dependencies>

Java本身提供了关于网络访问的包,在java.net中,然后它不够强大。于是Apache基金会发布了开源的http请求的包,即HttpClient,这个包提供了非常多的网络访问的功能。在这里,我们也是使用这个包来编写爬虫。好了,使用pom.xml下载完这个包之后我们就可以开始编写我们的第一个爬虫例子了。其代码如下(注意,我们的程序是建立在test包下面的,因此,需要在这个包下才能运行):

package test;

import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;

import java.io.IOException;

/**
 * 第一个爬虫测试
 * Created by DuFei on 2017/7/27.
 */
public class FirstTest {

  public static void main(String[] args) {

    //建立一个新的请求客户端
    CloseableHttpClient httpClient = HttpClients.createDefault();

    //使用HttpGet方式请求网址
    HttpGet httpGet = new HttpGet("http://www.datalearner.com/blog");

    //获取网址的返回结果
    CloseableHttpResponse response = null;
    try {
      response = httpClient.execute(httpGet);
    } catch (IOException e) {
      e.printStackTrace();
    }

    //获取返回结果中的实体
    HttpEntity entity = response.getEntity();

    //将返回的实体输出
    try {
      System.out.println(EntityUtils.toString(entity));
      EntityUtils.consume(entity);
    } catch (IOException e) {
      e.printStackTrace();
    }

  }
}

如上面的代码所示,爬虫的第一步需要构建一个客户端,即请求端,我们这里使用CloseableHttpClient作为我们的请求端,然后确定使用哪种方式请求什么网址,再然后使用HttpResponse获取请求的地址对应的结果即可。最后取出HttpEntity转换一下就可以得到我们请求的网址对应的内容了。上述程序对应的输出如下图所示:


显然,这就是我们需要的网址对应的页面的源代码。于是我们的第一个爬虫就成功的将网门需要的页面的内容下载下来了。

四、HttpClient的详细使用

在上篇博客里面,我们讲述了如何使用HttpClient请求一个简单的网页。但是,在实际中,有很多网页的请求需要附带许多参数设置。主要包括请求的Header设置以及路径参数。在HttpClient 4.3及以上的版本中,这个过程主要包含如下步骤:

使用List<NameValuePair>添加路径参数(请求参数)
使用URI对请求路径及其参数进行设置
使用List<Header>设置请求的头部
初始化自定义的HttpClient客户端,并设置头部
使用HttpUriRequest设置请求
使用HttpClient请求上述步骤中的HttpUriRequest对象

我们看一个代码示例

import com.google.common.collect.Lists;
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicHeader;
import org.apache.http.message.BasicNameValuePair;

import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;

/************
 * HttpClient 使用示例
 * ***********/

public class HttpClientTest {

  public static void main(String[] args) throws URISyntaxException, IOException {

    String url = "";    //请求路径

    //构造路径参数
    List<NameValuePair> nameValuePairList = Lists.newArrayList();
    nameValuePairList.add(new BasicNameValuePair("username","test"));
    nameValuePairList.add(new BasicNameValuePair("password","password"));

    //构造请求路径,并添加参数
    URI uri = new URIBuilder(url).addParameters(nameValuePairList).build();

    //构造Headers
    List<Header> headerList = Lists.newArrayList();
    headerList.add(new BasicHeader(HttpHeaders.ACCEPT_ENCODING,"gzip, deflate"));
    headerList.add(new BasicHeader(HttpHeaders.CONNECTION, "keep-alive"));

    //构造HttpClient
    HttpClient httpClient = HttpClients.custom().setDefaultHeaders(headerList).build();

    //构造HttpGet请求
    HttpUriRequest httpUriRequest = RequestBuilder.get().setUri(uri).build();

    //获取结果
    HttpResponse httpResponse = httpClient.execute(httpUriRequest);

    //获取返回结果中的实体
    HttpEntity entity = httpResponse.getEntity();

    //查看页面内容结果
    String rawHTMLContent = EntityUtils.toString(entity);

    System.out.println(rawHTMLContent);

    //关闭HttpEntity流
    EntityUtils.consume(entity);

  }

}

这种方式可以使我们一次性构造一个统一头部的HttpClient,后面所有的请求都可以使用带有这个Headers的HttpClient。非常简单方便。

关于下载的网页如何解析,转换成结构化数据,请看下一篇博客。


博客系列

Java爬虫入门简介(一) —— HttpClient请求(本文)
Java爬虫入门简介(二) —— Jsoup解析HTML页面


Java爬虫,信息抓取的实现

今天公司有个x
  • lmj623565791
  • lmj623565791
  • 2014年04月09日 15:50
  • 183277

基于java的网络爬虫框架(实现京东数据的爬取,并将插入数据库)

目录网络爬虫框架 网络爬虫的逻辑顺序 网络爬虫实例教学 model main util parse db 再看main方法 爬虫效果展示网络爬虫框架写网络爬虫,一个要有一个逻辑顺序。本文主要讲解我自己...
  • qy20115549
  • qy20115549
  • 2016年08月14日 11:40
  • 32092

JAVA网页爬虫(全)

  • 2010年01月08日 09:45
  • 2KB
  • 下载

java爬虫程序

  • 2007年09月02日 22:28
  • 22KB
  • 下载

Java也可以爬虫了

目前市面上流行的爬虫以python居多,简单了解之后,觉得简单的一些页面的爬虫,主要就是去解析目标页面(html)。那么就在想,java有没有用户方便解析html页面呢?找到了一个jsoup包,一个非...
  • lzy_lizhiyang
  • lzy_lizhiyang
  • 2017年03月14日 10:09
  • 1594

如何使用Java语言实现一个网页爬虫

网络上有许多信息,我们如何自动的获取这些信息呢?没错,网页爬虫~! 在这篇博文中,我将会使用java语言一步一步的编写一个原型的网页爬虫,其实网页爬虫并没有它听起来那么难。紧跟我的教程,我相...
  • uniquewonderq
  • uniquewonderq
  • 2016年02月02日 22:29
  • 6412

网络爬虫讲解(附java实现的实例)

网络蜘蛛即Web Spider,是一个很形象的名字。把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从 网站某一个页面(通常是首页)开始,读...
  • luojinping
  • luojinping
  • 2011年10月13日 17:43
  • 68268

Java实现爬虫给App提供数据(Jsoup 网络爬虫)

需求 ##最近基于 Material Design 重构了自己的新闻 App,数据来源是个问题。有前人分析了知乎日报、凤凰新闻等 API,根据相应的 URL 可以获取新闻的 JSON 数据。为了锻炼写...
  • never_cxb
  • never_cxb
  • 2016年01月24日 18:04
  • 12143

Java爬虫入门笔记

今天一天都在想怎么爬到我需要的数据,然后用Java代码实现了一下。以前只是知道正则表达式很强大,但是看起来头晕,所以也懒得去看。然后突然要爬数据,看到别人写的例子,一大堆的正则表达式,所以硬着头皮也去...
  • sinat_25295611
  • sinat_25295611
  • 2017年03月14日 20:55
  • 3684

零基础写java网络爬虫

说到爬虫,使用Java本身自带的URLConnection可以实现一些基本的抓取页面的功能,但是对于一些比较高级的功能,比如重定向的处理,HTML标记的去除,仅仅使用URLConnection还是不够...
  • zhihui1017
  • zhihui1017
  • 2016年01月13日 15:50
  • 20903
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java爬虫入门简介(一) —— HttpClient请求及其使用方法
举报原因:
原因补充:

(最多只允许输入30个字)