您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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>
implementation 'org.jsoup:jsoup:1.16.1'
下载jar包:Jsoup官网
Document doc = Jsoup.connect("https://example.com").get();
String title = doc.title();
Document doc = Jsoup.connect("https://example.com/search")
.data("q", "java")
.userAgent("Mozilla")
.cookie("auth", "token")
.timeout(3000)
.post();
Connection.Response response = Jsoup.connect(url)
.ignoreContentType(true)
.execute();
if(response.statusCode() == 200) {
Document doc = response.parse();
}
Connection conn = Jsoup.connect(url)
.proxy("127.0.0.1", 1080);
// 获取所有链接
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");
// 选择器示例
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)]"); // 图片正则匹配
// 获取属性值
String src = img.attr("src");
String absSrc = img.attr("abs:src"); // 获取绝对路径
// 获取整个HTML
String outerHtml = div.outerHtml();
// 获取纯文本
String text = p.text();
// 组合选择器
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();
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("------------------");
}
}
}
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();
}
}
}
对于JavaScript渲染的内容,可结合Selenium:
WebDriver driver = new ChromeDriver();
driver.get("https://example.com");
String html = driver.getPageSource();
Document doc = Jsoup.parse(html);
// 存储到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();
}
// 随机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);
Document doc = Jsoup.parse(new URL(url).openStream(), "GBK", url);
// 或
Document doc = Jsoup.connect(url)
.header("Accept-Charset", "utf-8")
.get();
Connection conn = Jsoup.connect(url)
.sslSocketFactory(SSLSocketClient.getSSLSocketFactory());
try {
Document doc = Jsoup.connect(url)
.timeout(5000)
.get();
} catch (SocketTimeoutException e) {
System.out.println("请求超时");
}
示例代码:
// 使用线程池
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();
// 处理文档
}
进阶框架:
相关技术:
推荐工具:
通过本文的学习,您应该已经掌握了使用Jsoup进行数据爬取和解析的核心技术。实际开发中,建议先小规模测试爬取逻辑,确认无误后再扩大规模。Happy crawling! “`
(注:实际字数约3200字,可根据需要增减细节部分)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。