深入理解Java爬虫:Jsoup

Jsoup是一款用于在Java中处理HTML的开源库。它提供了灵活且易于使用的API,使得从HTML文档中提取数据变得相对简单。以下是一些深入理解Jsoup并使用Java示例代码的重要概念:

  1. 引入Jsoup库:首先,你需要将Jsoup库添加到你的Java项目中。你可以通过Maven或Gradle添加依赖,或者手动下载JAR文件并将其包含在项目中。
<!-- Maven 依赖 -->
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.14.3</version> <!-- 请检查最新版本 -->
</dependency>
  1. 连接到网页:使用Jsoup可以轻松地连接到一个URL,获取整个HTML文档。
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.IOException;

public class WebScraper {
    public static void main(String[] args) {
        String url = "https://example.com";
        
        try {
            Document document = Jsoup.connect(url).get();
            System.out.println(document.outerHtml());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
  1. 选择器:Jsoup使用类似于CSS选择器的语法,允许你按照元素的标签、类、ID等选择元素。
// 选择所有带有"classname"类的元素
Elements elements = document.select(".classname");

// 选择所有a标签下的直接子元素
Elements links = document.select("a");
  1. 获取元素的文本和属性:通过Jsoup,你可以轻松地获取元素的文本内容或属性。
// 获取第一个a标签的文本内容
String linkText = document.select("a").first().text();

// 获取所有a标签的href属性值
Elements links = document.select("a");
for (Element link : links) {
    String href = link.attr("href");
    System.out.println("Href: " + href);
}
  1. 处理HTML表单:Jsoup还提供了用于处理HTML表单的方法,可以方便地模拟用户在网页上的交互。
// 模拟提交表单
Connection.Response response = Jsoup.connect("https://example.com/login")
    .data("username", "yourUsername", "password", "yourPassword")
    .method(Connection.Method.POST)
    .execute();

// 获取登录后的文档
Document loggedInDocument = response.parse();
  1. 代理IP:若遇到需要爬取的网址对IP进行封禁可以使用代理IP的方式进行爬取数据,其中proxyIpList是IP和端口的集合。
/**
     * 功能描述:设置动态代理
     *
     * @param url 请求地址
     * @param url 请求类型:1-POST,2-GET
     * @param map 请求参数
     * @return 结果
     * @author dxq
     * @date 2023/11/20 16:37
     */
    private Document setProxyIp(String url, Integer methodType, Map<String, String> map, List<String> proxyIpList) {
        // 查询系统配置代理IP
        Document document = null;
        // 查询设置的代理IP
        Connection connection = Jsoup.connect(url)
                .ignoreHttpErrors(true)
                .ignoreContentType(true)
                .timeout(30 * 1000)
                .userAgent("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
                .header("accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
                .header("accept-encoding", "gzip, deflate, br")
                .header("accept-language", "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7");
        if (CollUtil.isNotEmpty(map)) {
            connection.data(map);
        }
        if (CollUtil.isEmpty(proxyIpList)) {
            try {
                if (methodType == 1) {
                    document = connection.post();
                } else {
                    document = connection.get();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return document;
        }
        String ip;
        Integer port;
        for (int i = 0; i < proxyIpList.size(); i++) {
            ip = proxyIpList.get(i).split(":")[0];
            port = Integer.valueOf(proxyIpList.get(i).split(":")[1]);
            Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(ip, port));
            connection = connection.proxy(proxy);
            try {
                if (methodType == 1) {
                    document = connection.post();
                } else {
                    document = connection.get();
                }
            } catch (IOException e) {
                document = null;
                e.printStackTrace();
            }

            if (Objects.nonNull(document)) {
                return document;
            }
        }
        return document;
    }

这只是Jsoup的一些基本用法,你可以根据具体需求进一步深入学习。请注意,网络爬取应该遵循网站的使用条款,并且尊重网站的隐私政策。在实际使用中,要确保你的爬取活动是合法和合规的。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值