Jsoup是一款用于在Java中处理HTML的开源库。它提供了灵活且易于使用的API,使得从HTML文档中提取数据变得相对简单。以下是一些深入理解Jsoup并使用Java示例代码的重要概念:
- 引入Jsoup库:首先,你需要将Jsoup库添加到你的Java项目中。你可以通过Maven或Gradle添加依赖,或者手动下载JAR文件并将其包含在项目中。
<!-- Maven 依赖 -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.14.3</version> <!-- 请检查最新版本 -->
</dependency>
- 连接到网页:使用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();
}
}
}
- 选择器:Jsoup使用类似于CSS选择器的语法,允许你按照元素的标签、类、ID等选择元素。
// 选择所有带有"classname"类的元素
Elements elements = document.select(".classname");
// 选择所有a标签下的直接子元素
Elements links = document.select("a");
- 获取元素的文本和属性:通过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);
}
- 处理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();
- 代理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的一些基本用法,你可以根据具体需求进一步深入学习。请注意,网络爬取应该遵循网站的使用条款,并且尊重网站的隐私政策。在实际使用中,要确保你的爬取活动是合法和合规的。