Java爬虫-使用HttpClient+Jsoup实现简单的爬虫爬取文本

一、工具介绍

  HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
HttpClient下载地址:http://hc.apache.org/downloads.cgi
  Jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
Jsoup下载地址:https://jsoup.org/download

二、使用方法

1.HttpClient的使用步骤:
(1) 创建HttpClient对象;
(2) 创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象;
(3) 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数;
(4) 调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse;
(5) 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容;
(6) 释放连接。无论执行方法是否成功,都必须释放连接;
2.Jsoup的常用方法(Jsoup很强大,我只列出来一部分):

方法 作用
Connection connect(String url) 根据给定的url(必须是http或https)来创建连接
Connection cookie(String name, String value) 发送请求时放置cookie
Connection userAgent(String userAgent) 发送请求时设置User-Agent
Connection header(String name, String value) 发送请求时添加请求头
Connection data(Object data) 发送请求时传递请求参数,Object为Map或String
Connection get() 以get方式发送请求并对返回结果进行解析
Connection post() 以post方式发送请求并对返回结果进行解析
Document parse(…)
Document parseBodyFragment(…)
Document getElementById(String id) 根据id获得元素
Document getElementsByTag(String tag) 根据标签获得元素
Document getElementsByClass(String className) 根据class获得元素
Document getElementsByAttribute(String key) 根据属性获得元素
Document select(String key) 用jquery/css选择器获得元素
Element attr(String key) 获得元素的数据
Element attr(String key, String value) 设置元素数据
Element text() 获得文本值
Element text(String value) 设置文本值
Element html() 获取html
Element html(String value) 设置html
Element data() 获得数据内容

三、实例

  列了这么多,现在我们开始实例部分。我们要获取网站的指定文本信息,与获取网站全部链接是一样的,我们先来看看获取全部链接的代码。
  首先我们先用只用Jsoup来获取网站全部有用的链接:

package com.httpclient;

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MyJsoup {

    /**
     * 需求:使用Jsoup解析网页源码
     * @author ouyang
     * @since 20180630
     * @param args
     */
    public static void main(String[] args) {

        String url = "http://www.xaufe.edu.cn";

        //使用Jsoup向http://www.xaufe.edu.cn/发送请求
        Document doc = null;
        try {
            doc = Jsoup.connect(url)
                    .userAgent("Mozilla")
                    .cookie("auth", "token")
                    .timeout(3000)
                    .get();
        } catch (IOException e) {
            e.printStackTrace();
        }

        //Jsoup使用类型css,jquery选择器的方式获取元素节点
        Elements elements = doc.select("#top2_23 a");

        for(Element element : elements ) {
            System.out.println(element.text() + ": " + url+element.attr("href"));
        }

    }

}

  HttpClient+Jsoup获取网站的全部有用的链接,直接附上代码:

package com.httpclient;

import java.io.IOException;

import org.apache.http.HttpHost;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class MyHttpClient {

    /**
     * 需求:使用httpClient爬取网站数据
     * @author ouyang
     * @since 20180630
     * @param args
     */
    public static void main(String[] args) {
        try {
            getTagA();
        } catch (ParseException | IOException e) {
            e.printStackTrace();
        }
    }

    public static void getTagA() throws ParseException, IOException {
        //要爬取的网站
        String url = "http://www.xaufe.edu.cn";

        //创建HttpClient对象
        HttpClient httpClient = HttpClients.createDefault();

        //大部分爬虫url都是get请求,创建get请求对象
        HttpGet httpGet = new HttpGet(url);

        /*
         * 设置响应时间,设置请求超时,设置代理服务器,
         * 防止网站识别你是爬虫软件进而拉黑禁止访问
         */
        RequestConfig requestConfig = RequestConfig.custom()
                .setConnectTimeout(5000)            //设置响应时间
                .setConnectionRequestTimeout(5000)  //设置请求超时
                .setProxy(new HttpHost("222.182.56.29", 8118))   //设置代理服务器(网上有)
                .build();
        httpGet.setConfig(requestConfig);

        //设置头信息,不然请求不到网页
        httpGet.setHeader("Accept-Language", "zh-CN,zh;q=0.8");
        httpGet.setHeader("User-Agent", 
                "Mozilla/5.0 (Windows NT 6.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2");  


        //向http://www.xaufe.edu.cn/发起请求,获取网页信息
        String content = "";
        HttpResponse httpResponse = httpClient.execute(httpGet);
        content = EntityUtils.toString(httpResponse.getEntity(), "GB2312");

        //System.out.println(content);

        //加上用Jsoup解析网页
        Document doc = Jsoup.parse(content);

        //Jsoup使用类型css,jquery选择器的方式获取元素节点
        Elements elements = doc.select("a"); //获取页面上所有a标签

        for(Element element : elements ) {
            String target = element.text();
            String src = element.attr("href");
            if(target != null && !"".equals(target) && !"".equals(src)) {
                if(src.contains("http")) {
                    System.out.println(target + ": " + src);
                } else {
                    System.out.println(target + ": " + url+src);
                }

            }

        }
    }

}

四、学有所思,欢迎大家评论留言

1、怎么获取列表的数据,因为列表有分页?

2、抓取的url是文件流(图片,视频),应该要怎样做处理?

3、怎么时爬虫一直爬下去,其中怎么让爬取效率更高?

HttpClient详细解释:https://blog.csdn.net/zhuwukai/article/details/78644484
Jsoup常用方法功能介绍:https://blog.csdn.net/key_mql/article/details/55522325

猜你喜欢

转载自blog.csdn.net/qq_24598601/article/details/81134818