B站峰哥亡命天涯视频评论分析报告
1. 项目概述
- 视频UP主:峰哥亡命天涯
- 视频数量:25
- 评论总数:约24,000条
2. 数据收集
- 使用Java编写爬虫
3. 结果展示
- 使用图表展示分析结果。
3.1 男女比图表
男女比例高达9:1,其中男生9253人,女生1011人,保密不计
3.2 视频播放排行
3.3 每条视频点赞最高的评论
4.代码
由于单线程爬取数据比较慢,因此需要开启多线程进行爬取,以下是多线程模板,单线程爬取数据耗时20几分钟(因为有反爬机制,爬取太快会触发安全风控,所以每次循环都会设置等待1s),使用多线程后2分钟获取完数据。
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import java.util.List;
import java.util.ArrayList;
import java.util.Random;
// ...
public class BiliMemberService {
// ...
public void processAidList(List<String> aidList) throws InterruptedException {
// 定义线程池的大小,可以根据你的硬件配置和需求来设置
int threadPoolSize = 20; // 例如创建20个线程
ExecutorService executorService = Executors.newFixedThreadPool(threadPoolSize);
// 为每个aid创建并提交任务到线程池
for (String aid : aidList) {
executorService.submit(() -> processAid(aid));
}
// 关闭线程池,不再接受新任务,等待现有任务完成
executorService.shutdown();
try {
// 等待所有任务完成,超时则中断
if (!executorService.awaitTermination(60, TimeUnit.MINUTES)) {
executorService.shutdownNow(); // 取消所有未完成的任务
}
} catch (InterruptedException e) {
executorService.shutdownNow(); // 线程被中断时取消所有任务
Thread.currentThread().interrupt(); // 重新设置中断状态
}
}
private void processAid(String aid) {
// 这里是原来for循环中的处理逻辑,现在为每个aid单独执行
// ...
// 示例:随机休眠,模拟耗时操作
Random random = new Random();
try {
Thread.sleep(random.nextInt(1000));
} catch (InterruptedException e) {
Thread.currentThread().interrupt(); // 重新设置中断状态
}
// 处理完成后的逻辑,例如保存数据等
// ...
}
}