用 Java 实现爬虫 (爬取本地html中的人物信息并可视化人物关系)

目录

爬虫简介

常用的工具框架

selenium + Jsoup

Jsoup介绍

Jsoup的主要功能如下:

HTML 相关知识

通过Jsoup元素获取

案例 爬取本地html中的角色信息

HtmlParseUtil

可以利用relation-graph 将人物关系可视化

使用爬虫要注意

查看网站的爬虫协议


爬虫简介

网络爬虫是数据采集的一种方法,实际项目开发中,通过爬虫做数据采集一般只有以下几种情况:

1) 搜索引擎

2) 竞品调研

3) 舆情监控

4) 市场分析

网络爬虫的整体执行流程:

1) 确定一个(多个)种子网页

2) 进行数据的内容提取

3) 将网页中的关联网页连接提取出来

4) 将尚未爬取的关联网页内容放到一个队列中

5) 从队列中取出一个待爬取的页面,判断之前是否爬过。

6) 把没有爬过的进行爬取,并进行之前的重复操作。

7) 直到队列中没有新的内容,爬虫执行结束。

引自:
Java实现爬虫_马小屑的博客-CSDN博客_java爬虫

常用的工具框架

使用的技术可以有以下几类

1) 原生代码实现:

  a) URL类

2) 使用第三方的URL库

  a) HttpClient库

3) 开源爬虫框架

  a) Heritrix

  b) Nutch

selenium + Jsoup

本例采用框架 selenium 来模拟访问浏览器,并且爬取页面源代码,然后使用Jsoup进行解析并抓取相关信息。

相关pom

       <!--爬虫相关-->
        <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.2</version>
        </dependency>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/io.github.bonigarcia/webdrivermanager -->
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.0.3</version>
        </dependency>

Jsoup介绍

我们抓取到页面之后,还需要对页面进行解析。可以使用字符串处理工具解析页面,也可以使用正则表达式,但是这些方法都会带来很大的开发成,所以我们需要使用一款专门解析html页而的技术。

 jsoup是一款ava的HTML解析器,可直接解析某个URL地址、HTML文木内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。


Jsoup的主要功能如下:


1.从一个URL,文件或字符串中解析HTML:
2.使用DOM或CSS选择器来查找、取出数据:
3.可操作HTML元素、属性、文本:

Ps:虽然使用Jsoup可以替代HttpClient直接发起请求解析数据,但是往往
不会这样用,因为实际的开发过程中,需要使用到多线程,连接池,代理等等方
式,而jsoup对这些的支持并不是很好,所以我们一般把jsoup仅仅作为Html
解析工具使用,而且有时候不能抓取所有的页面源代码

HTML 相关知识

只需要了解dom即可,dom是一棵多叉树。

通过Jsoup元素获取


1.根据id查询元素 getElementByld()
2.根据标签获取元素 getElementsByTag()
3.根据class获取元素 getElementsByClass()
4.根据属性获取元素 getElementsByAttribute()

案例 爬取本地html中的角色信息

可以获得角色的姓名,介绍,头像,海报,语音等信息。

 

HtmlParseUtil

public class HtmlParseUtil {
    static WebDriver driver;
    static {
        // 使用 web驱动来模拟试用浏览器
        WebDriverManager.chromedriver().setup();
        driver = new ChromeDriver(); // 可以使用多种浏览器的驱动
    }
    static int idx = 1;

    /**
     * 下载miHoYo 角色页面的源码并且解析
     *
     * @param Country 国家
     * @param id      人物id
     * @return {@link Character}
     * @throws Exception 异常
     */
    public Character parsemiHoYo(String Country, int id) throws Exception {
        String url = 网站链接 + Country + "?char=" + id;
        driver.get(url);
        Document document = Jsoup.parse(driver.getPageSource()); // 拿到对应页面的document

        String intro = document.getElementsByClass("character__intro-content").eq(id).text();
        String posterImg = document.getElementsByClass("character__person animated").attr("src");

        Elements charPage = document.getElementsByClass("character__page");
        Elements elements = charPage.first().getElementsByTag("li");
        Element el = elements.get(id);
        String name = el.getElementsByTag("p").text();
        String headImg = el.getElementsByTag("img").attr("src");

        Character character = new Character(idx++, name, intro, headImg, posterImg, "",Country);
        return character;
    }

}

package com.PaiMon.Pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Character implements Serializable {

    /**
     * id
     */
    int id;
    /**
     * 名字
     */
    String name;
    /**
     * 介绍
     */
    String intro;
    /**
     * 头像
     */
    String headImg;
    /**
     * 海报
     */
    String posterImg;
    /**
     * 属性
     */
    String attribute;
    /**
     * 国家
     */
    String country;
}

可以利用relation-graph 将人物关系可视化

https://github.com/VeniVeci/Paimon

使用爬虫要注意

查看网站的爬虫协议

网站 + /robots.txt

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

trigger333

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值