目录
爬虫简介
常用的工具框架
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