[Java爬虫] 使用 Jsoup+HttpClient 爬取网站基本信息

一、前言

说起爬虫,很多人第一反应是使用 Python 语言。但是 Java 爬虫方面也是相当成熟的,使用 Jsoup、HttpClient、HtmlUnit 就可以实现基本的需求。

【爬虫商业应用】
①爬虫还是一个可以盈利的技术,很多网站的收集的内容的重要来源就是使用爬虫技术。
②内容丰富后,可以大大提高个人网站的日流量,通过帮Google等打广告获取资金。
③收集各种优质的资源,聚合在一起,还可以拿出来在淘宝、个人网站等拍卖获利
④等等…

说到底,爬虫是一个实实在在地可以用来赚钱的技术。
当然在做项目的时候,也是有帮助的,比如做一篇文章的缩略图,就可以使用 Java爬虫的图片爬取技术。

二、代码测试

1、写在前面

下面列举一个 Jsoup+HttpClient 爬虫的简单的例子,
注意 ①HttpClient请求、②IP代理、③模拟浏览器、④超时处理 的简单应用即可

先创建一个 SpringBoot 工程,当然创建一个Java工程/Maven工程也可以的

2、简单的需求

① 现在要爬出 CSDN 一个菜单栏的信息(当然,实际应用肯定不会像我这么无聊,应是爬虫一些url、文件、图片等资源点)
② CSDN 首页图、爬取的目标(红色边框的内容)
[Java爬虫] 使用 Jsoup+HttpClient 爬取网站基本信息_第1张图片

3、实现

①代码
package com.cun.test;

import java.io.IOException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.config.RequestConfig;
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 org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * 1、使用 HttpClient 获取网页文档对象
 * 2、使用 Jsoup 获取所需的信息
 * 3、注意事项:
 * ① 设置连接超时:其实就是让它不再继续,做无意义的尝试
 * ② 爬虫时被屏蔽了,就更换代理 IP
 * ③ 有些网站是设置只能浏览器才能访问的,这时候就要模拟浏览器
 * ④ 有些网站的编码不一定是UTF-8,也有可能是GBK
 * @author linhongcun
 *
 */
public class JsoupHttpClient {
    public static void main(String[] args) throws ClientProtocolException, IOException {
        // ============================= 【HttpClient】 ====================================
        // 创建httpclient实例
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 创建httpget实例
        HttpGet httpget = new HttpGet("https://www.csdn.net/");

        // 模拟浏览器 ✔
        httpget.setHeader("User-Agent",
                "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0");

        // 使用代理 IP ✔
        HttpHost proxy = new HttpHost("118.114.77.47", 8080);
        RequestConfig config = RequestConfig.custom().setProxy(proxy)
                //设置连接超时 ✔
                .setConnectTimeout(10000) // 设置连接超时时间 10秒钟
                .setSocketTimeout(10000) // 设置读取超时时间10秒钟
                .build();

        httpget.setConfig(config);

        // 执行get请求
        CloseableHttpResponse response = httpclient.execute(httpget);
        HttpEntity entity = response.getEntity();
        // 获取返回实体
        String content = EntityUtils.toString(entity, "utf-8");

        // ============================= 【Jsoup】 ====================================
        //获取响应类型、内容
        System.out.println("Status:"+response.getStatusLine().getStatusCode());
        System.out.println("Content-Type:"+entity.getContentType().getValue());
        // 解析网页 得到文档对象
        Document doc = Jsoup.parse(content);
        Elements elements = doc.getElementsByTag("a"); // 获取tag是a的所有DOM元素,数组

        for (int i = 3; i < 17; ++i) {
            Element element = elements.get(i); // 获取第i个元素
            String title = element.text(); // 返回元素的文本
            System.out.println(":" + title);
        }

        response.close(); // response关闭
        httpclient.close(); // httpClient关闭

    }

}
②效果

[Java爬虫] 使用 Jsoup+HttpClient 爬取网站基本信息_第2张图片

三、小结

1、Java爬虫使用技术主要是 HttpClient+Jsoup 组合,或者是使用 HtmlUnit
前者在爬取网站的速度一般比后者快,
因为不解析 JS、Ajax 等,这也是前者的缺点,也是后者有优点

2、爬虫方面,是必须使用缓存技术的,如使用 Ehcache/Redis(推荐),因为有一些 url 爬出过了就不要再爬取了。

3、动态代理 IP,百度一下,就有很多网站了,上面的 代理IP 就是去网上获取
比如这个 专为爬虫而生

4、以后去别人的 网站上爬取信息,可以先爬取这类网站的 代理IP、端口号 到数据库中,如果作废了一个,就替换另外一个 IP、端口号

你可能感兴趣的:(网络爬虫)