1 Jsoup简介
Jsoup是一个Java库,它简化了使用真实世界的HTML和XML。它提供了一个易于使用的API,用于使用DOM API方法、CSS和xpath选择器进行URL获取、数据解析、提取和操作。
Jsoup实现了WHATWG HTML5规范,并将HTML解析为与现代浏览器相同的DOM。
- 从URL、文件或字符串中抓取和解析HTML
- 使用DOM遍历或CSS选择器查找和提取数据
- 操作HTML元素、属性和文本
- 根据安全列表清除用户提交的内容,以防止XSS攻击
- 输出整洁的HTML
Jsoup设计用于处理各种各样的HTML;从原始和验证,到无效标签汤;jsoup将创建一个合理的解析树。
2 爬取一个页面
创建Maven项目,并添加Jsoup依赖,内容如下。
XML
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.13.1</version>
</dependency>
我们先来爬取单个页面(王者荣耀官方网站-腾讯游戏),了解Jsoup的基本使用。
获取页面内容
java
Document doc = null;
try {
doc = Jsoup.connect("https://pvp.qq.com/index.shtml").get();
} catch (IOException e) {
e.printStackTrace();
}
String content = doc.html();
保存页面到本地
java
File file = new File("d:/pvp.qq.com");
if (!file.exists()) {
file.mkdirs();
}
try {
FileWriter writer = new FileWriter(file.getPath() + "/index.html");
writer.write(content);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
完整代码
java
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class PageFetch {
public static void main(String[] args) {
fetchPage();
}
/**
* 爬取页面并保存
*/
public static void fetchPage() {
Document doc = null;
try {
doc = Jsoup.connect("https://pvp.qq.com/index.shtml").get();
} catch (IOException e) {
e.printStackTrace();
}
String content = doc.html();
File file = new File("d:/pvp.qq.com");
if (!file.exists()) {
file.mkdirs();
}
try {
FileWriter writer = new FileWriter(file.getPath() + "/index.html");
writer.write(content);
writer.flush();
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3 保存图片
在保存的首页中找到背景图的网址
java
//436行
background-image:url(//ossweb-img.qq.com/upload/webplat/info/yxzj/20200807/9771361431874.jpg)
打开图片链接
java
URL url = new URL("https://ossweb-img.qq.com/upload/webplat/info/yxzj/20200807/9771361431874.jpg");
URLConnection conn = url.openConnection();
conn.setConnectTimeout(8 * 1000);
获取图片对应的输入流
java
InputStream in = conn.getInputStream();
保存图片到本地
java
byte[] buff = new byte[1024];
int len = 0;
File file = new File("d:/pvp.qq.com");
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream out = new FileOutputStream(file.getPath() + "/9771361431874.jpg");
while ((len = in.read(buff)) != -1) {
out.write(buff, 0, len);
}
out.close();
in.close();
完整代码
java
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
public class ImageSave {
public static void main(String[] args) {
saveImage();
parsePage();
editPage();
}
/**
* 保存图片
*/
public static void saveImage() {
try {
//首页背景图<div class="kv-bg-container"><div class="kv-bg" style="background-image:url(...
URL url = new URL("https://ossweb-img.qq.com/upload/webplat/info/yxzj/20200807/9771361431874.jpg");
URLConnection conn = url.openConnection();
conn.setConnectTimeout(8 * 1000);
InputStream in = conn.getInputStream();
byte[] buff = new byte[1024];
int len = 0;
File file = new File("d:/pvp.qq.com");
if (!file.exists()) {
file.mkdirs();
}
FileOutputStream out = new FileOutputStream(file.getPath() + "/9771361431874.jpg");
while ((len = in.read(buff)) != -1) {
out.write(buff, 0, len);
}
out.close();
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}