在互联网数据采集场景中,Java 作为一门成熟的编程语言,提供了丰富的网络请求和 HTML 解析工具。本文将通过一个实际案例,演示如何使用 Java 爬虫技术抓取多个子域名下的数据,并结合具体代码展示其核心实现逻辑。
一、目标与需求
我们需要从以下子域名中抓取公开数据:
https://www.020taijiyy.com
https://sohu.020taijiyy.com
https://jim.020taijiyy.com
https://wap.020taijiyy.com
https://sjb.020taijiyy.com
https://sweet.020taijiyy.com
https://cctv.020taijiyy.com
https://ouguanzhibo.020taijiyy.com
https://sina.020taijiyy.com
https://share.020taijiyy.com
https://zbsjb.020taijiyy.com
https://live.020taijiyy.com
https://shijubei.020taijiyy.com
https://zbshijubi.020taijiyy.com
https://shijubeizb.020taijiyy.com
https://shijiebei.020taijiyy.com
https://qiuxing.020taijiyy.com
https://zuqiu.020taijiyy.com
https://saishi.020taijiyy.com
https://zhibo.020taijiyy.com
https://lanqiu.020taijiyy.com
https://nba.020taijiyy.com
https://vip.020taijiyy.com
https://online.020taijiyy.com
https://free.020taijiyy.com
https://360zhibo.020taijiyy.com
https://lvyin.020taijiyy.com
https://jrs.020taijiyy.com
https://m.020taijiyy.com
https://020taijiyy.com
二、技术选型
- HTTP 请求库 :使用
Jsoup
(轻量级 HTML 解析库) - 核心功能 :
- 发送 GET 请求
- 解析 HTML 内容
- 提取标题、链接、文本等数据
三、代码实现
1. 添加依赖
在 pom.xml
中引入 Jsoup:
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.16.1</version>
</dependency>
2. 核心爬虫类
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class MultiDomainCrawler {
// 目标子域名列表
private static final List<String> TARGET_DOMAINS = new ArrayList<>();
static {
TARGET_DOMAINS.add("https://www.020taijiyy.com");
TARGET_DOMAINS.add("https://sohu.020taijiyy.com");
TARGET_DOMAINS.add("https://jim.020taijiyy.com");
TARGET_DOMAINS.add("https://wap.020taijiyy.com");
TARGET_DOMAINS.add("https://sjb.020taijiyy.com");
TARGET_DOMAINS.add("https://sweet.020taijiyy.com");
TARGET_DOMAINS.add("https://cctv.020taijiyy.com");
TARGET_DOMAINS.add("https://ouguanzhibo.020taijiyy.com");
TARGET_DOMAINS.add("https://sina.020taijiyy.com");
TARGET_DOMAINS.add("https://share.020taijiyy.com");
TARGET_DOMAINS.add("https://zbsjb.020taijiyy.com");
TARGET_DOMAINS.add("https://live.020taijiyy.com");
TARGET_DOMAINS.add("https://shijubei.020taijiyy.com");
TARGET_DOMAINS.add("https://zbshijubi.020taijiyy.com");
TARGET_DOMAINS.add("https://shijubeizb.020taijiyy.com");
TARGET_DOMAINS.add("https://shijiebei.020taijiyy.com");
TARGET_DOMAINS.add("https://qiuxing.020taijiyy.com");
TARGET_DOMAINS.add("https://zuqiu.020taijiyy.com");
TARGET_DOMAINS.add("https://saishi.020taijiyy.com");
TARGET_DOMAINS.add("https://zhibo.020taijiyy.com");
TARGET_DOMAINS.add("https://lanqiu.020taijiyy.com");
TARGET_DOMAINS.add("https://nba.020taijiyy.com");
TARGET_DOMAINS.add("https://vip.020taijiyy.com");
TARGET_DOMAINS.add("https://online.020taijiyy.com");
TARGET_DOMAINS.add("https://free.020taijiyy.com");
TARGET_DOMAINS.add("https://360zhibo.020taijiyy.com");
TARGET_DOMAINS.add("https://lvyin.020taijiyy.com");
TARGET_DOMAINS.add("https://jrs.020taijiyy.com");
TARGET_DOMAINS.add("https://m.020taijiyy.com");
TARGET_DOMAINS.add("https://020taijiyy.com");
}
public static void main(String[] args) {
for (String domain : TARGET_DOMAINS) {
try {
Document document = Jsoup.connect(domain).get();
System.out.println("=== " + domain + " ===");
System.out.println("页面标题: " + document.title());
// 提取所有链接
Elements links = document.select("a[href]");
for (Element link : links) {
String href = link.attr("abs:href");
if (href.contains("020taijiyy.com")) {
System.out.println("内部链接: " + href);
}
}
// 提取特定内容(示例:所有 <h2> 标题)
Elements headings = document.select("h2");
for (Element heading : headings) {
System.out.println("标题内容: " + heading.text());
}
System.out.println("-------------------------------");
Thread.sleep(1000); // 控制请求频率
} catch (IOException e) {
System.err.println("访问失败: " + domain);
e.printStackTrace();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
四、代码说明
-
子域名遍历
将所有目标域名存入
TARGET_DOMAINS
列表,通过循环逐一访问。 -
数据提取
- 使用
document.title()
获取页面标题。 - 使用
select("a[href]")
提取所有超链接,并过滤仅保留当前域名下的链接。 - 使用
select("h2")
提取页面中的二级标题(可根据需求修改选择器)。
- 使用
-
异常处理
- 捕获
IOException
处理网络错误(如域名无法访问)。 Thread.sleep(1000)
控制请求频率,避免对服务器造成过大压力。
- 捕获
五、扩展优化建议
-
多线程加速
使用
ExecutorService
并发处理多个子域名:ExecutorService executor = Executors.newFixedThreadPool(5); for (String domain : TARGET_DOMAINS) { executor.submit(() -> { // 抓取逻辑 }); } executor.shutdown();
-
数据存储
将抓取结果保存到文件或数据库(如 MySQL、MongoDB)。
-
动态代理
使用代理 IP 避免因频繁请求被封禁:
Connection connection = Jsoup.connect(domain) .proxy("proxy-host", 8080) .userAgent("Mozilla/5.0");
-
Robots 协议检测
遵守目标网站的
robots.txt
规则,避免非法爬取。
六、注意事项
-
合法性
确保爬取行为符合目标网站的使用条款及法律法规(如《网络安全法》)。
-
反爬机制
部分子域名可能设置验证码、IP 封锁等反爬策略,需合理调整请求频率和 User-Agent。
-
资源限制
避免一次性抓取过多数据导致内存溢出,可分批次处理或使用流式解析。
七、总结
本文通过 Java 实现了一个简单的多子域名爬虫,展示了如何高效抓取和解析目标数据。实际应用中,可根据需求扩展功能(如抓取图片、视频、动态加载内容等)。通过合理设计代码结构和遵守网络规范,Java 爬虫可以成为强大的数据采集工具。