java中怎么利用jsoup爬取数据并解析

发布时间:2021-06-21 15:58:08 作者:Leah
来源:亿速云 阅读:417
# Java中怎么利用Jsoup爬取数据并解析

## 一、Jsoup简介

Jsoup是一款Java编写的HTML解析器,它能够直接解析URL地址或HTML文本内容。相比正则表达式,Jsoup提供了更直观的DOM操作方式,主要功能包括:

1. 从URL、文件或字符串中抓取和解析HTML
2. 使用DOM遍历或CSS选择器查找和提取数据
3. 操作HTML元素、属性和文本
4. 清除用户提交的安全内容(防止XSS攻击)

### 核心优势:
- 类似jQuery的API设计
- 支持HTML5解析
- 自动处理编码问题
- 丰富的文档和社区支持

## 二、环境准备

### 1. 添加Maven依赖
```xml
<dependency>
    <groupId>org.jsoup</groupId>
    <artifactId>jsoup</artifactId>
    <version>1.16.1</version> <!-- 使用最新版本 -->
</dependency>

2. Gradle配置

implementation 'org.jsoup:jsoup:1.16.1'

3. 手动导入

下载jar包:Jsoup官网

三、基础爬取方法

1. 从URL直接获取

Document doc = Jsoup.connect("https://example.com").get();
String title = doc.title();

2. 带参数的请求

Document doc = Jsoup.connect("https://example.com/search")
    .data("q", "java")
    .userAgent("Mozilla")
    .cookie("auth", "token")
    .timeout(3000)
    .post();

3. 处理响应状态

Connection.Response response = Jsoup.connect(url)
    .ignoreContentType(true)
    .execute();

if(response.statusCode() == 200) {
    Document doc = response.parse();
}

4. 代理设置

Connection conn = Jsoup.connect(url)
    .proxy("127.0.0.1", 1080);

四、数据解析技术

1. DOM遍历方法

// 获取所有链接
Elements links = doc.select("a[href]");
for (Element link : links) {
    String href = link.attr("href");
    String text = link.text();
}

// 获取特定ID元素
Element content = doc.getElementById("content");

// 获取类名元素
Elements news = doc.getElementsByClass("news-item");

2. CSS选择器

// 选择器示例
Elements products = doc.select("div.product"); // div标签且class=product
Elements prices = doc.select("span.price");   // span标签且class=price
Elements imgs = doc.select("img[src~=(?i)\\.(png|jpe?g)]"); // 图片正则匹配

3. 属性提取

// 获取属性值
String src = img.attr("src");
String absSrc = img.attr("abs:src"); // 获取绝对路径

// 获取整个HTML
String outerHtml = div.outerHtml();

// 获取纯文本
String text = p.text();

4. 高级选择器

// 组合选择器
Elements items = doc.select("div.list > ul > li");

// 伪选择器
Element firstItem = doc.select("li:first-child").first();
Element lastPara = doc.select("p:last-of-type").last();

五、实战案例

案例1:爬取新闻标题和链接

public class NewsCrawler {
    public static void main(String[] args) throws IOException {
        String url = "https://news.sina.com.cn/";
        Document doc = Jsoup.connect(url).get();
        
        Elements newsList = doc.select(".news-item");
        for (Element news : newsList) {
            String title = news.select("h2").text();
            String link = news.select("a").attr("abs:href");
            String time = news.select(".time").text();
            
            System.out.println("标题:" + title);
            System.out.println("链接:" + link);
            System.out.println("时间:" + time);
            System.out.println("------------------");
        }
    }
}

案例2:爬取电商产品信息

public class ProductCrawler {
    public static void main(String[] args) {
        try {
            Document doc = Jsoup.connect("https://www.jd.com/search?q=手机")
                .timeout(10000)
                .userAgent("Mozilla/5.0")
                .get();
            
            Elements products = doc.select(".gl-item");
            for (Element product : products) {
                String name = product.select(".p-name em").text();
                String price = product.select(".p-price strong").text();
                String shop = product.select(".p-shop").text();
                
                System.out.println("产品:" + name);
                System.out.println("价格:" + price);
                System.out.println("店铺:" + shop);
                System.out.println("------------------");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

六、高级技巧

1. 处理动态内容

对于JavaScript渲染的内容,可结合Selenium:

WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
String html = driver.getPageSource();
Document doc = Jsoup.parse(html);

2. 数据存储

// 存储到CSV
try (CSVWriter writer = new CSVWriter(new FileWriter("data.csv"))) {
    writer.writeNext(new String[]{"标题", "链接", "时间"});
    for (NewsItem item : newsList) {
        writer.writeNext(new String[]{item.title, item.url, item.time});
    }
}

// 存储到数据库
String sql = "INSERT INTO news (title, url) VALUES (?, ?)";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
    stmt.setString(1, title);
    stmt.setString(2, url);
    stmt.executeUpdate();
}

3. 反爬策略应对

// 随机UserAgent
String[] userAgents = {...};
String ua = userAgents[new Random().nextInt(userAgents.length)];

// 设置延迟
Thread.sleep(1000 + new Random().nextInt(2000));

// 使用cookies
Map<String, String> cookies = new HashMap<>();
// ... 获取cookies逻辑
Connection conn = Jsoup.connect(url).cookies(cookies);

七、常见问题解决

1. 中文乱码问题

Document doc = Jsoup.parse(new URL(url).openStream(), "GBK", url);
// 或
Document doc = Jsoup.connect(url)
    .header("Accept-Charset", "utf-8")
    .get();

2. HTTPS证书问题

Connection conn = Jsoup.connect(url)
    .sslSocketFactory(SSLSocketClient.getSSLSocketFactory());

3. 超时处理

try {
    Document doc = Jsoup.connect(url)
        .timeout(5000)
        .get();
} catch (SocketTimeoutException e) {
    System.out.println("请求超时");
}

八、性能优化建议

  1. 连接复用:使用单例模式管理Jsoup连接
  2. 并行处理:结合Java 8的Stream API实现并行爬取
  3. 缓存机制:对已爬取页面进行本地缓存
  4. 增量爬取:记录最后爬取位置
  5. 连接池:使用Apache HttpClient作为底层连接

示例代码:

// 使用线程池
ExecutorService executor = Executors.newFixedThreadPool(5);
List<Future<Document>> futures = new ArrayList<>();

for (String url : urls) {
    futures.add(executor.submit(() -> 
        Jsoup.connect(url).get()
    ));
}

for (Future<Document> future : futures) {
    Document doc = future.get();
    // 处理文档
}

九、法律与道德规范

  1. 遵守网站的robots.txt协议
  2. 设置合理的爬取间隔(建议≥3秒)
  3. 不爬取敏感或个人隐私数据
  4. 商业用途需获得授权
  5. 注明数据来源

十、扩展学习

  1. 进阶框架

    • WebMagic:国产优秀爬虫框架
    • Apache Nutch:企业级解决方案
    • Scrapy(Python生态)
  2. 相关技术

    • XPath解析(可与Jsoup结合使用)
    • 正则表达式强化提取
    • 自然语言处理(NLP)分析文本
  3. 推荐工具

    • Postman:调试API接口
    • Fiddler/Charles:抓包分析
    • Chrome DevTools:分析页面结构

通过本文的学习,您应该已经掌握了使用Jsoup进行数据爬取和解析的核心技术。实际开发中,建议先小规模测试爬取逻辑,确认无误后再扩大规模。Happy crawling! “`

(注:实际字数约3200字,可根据需要增减细节部分)

推荐阅读:
  1. HtmlUnit、httpclient、jsoup爬取网页信息并解析
  2. OkHttpClient和Jsoup进行网页爬取

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java jsoup

上一篇:什么是HTTP协议

下一篇:Linux 中怎么挂载磁盘

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》