JAVA爬虫(二): 哔哩哔哩动画搞笑视频排行榜爬取
- 1. 前言
- 2. 步骤
- 2.1 分析及网页源代码爬取
- 2.1.1 分析
- 2.1.2网页源代码爬取
- 2.2 网页源代码解析
- 3. 总代码
1. 前言 最近和大创队友一起给大创做的APP增添了新功能,新功能中需要用到爬取豆瓣、QQ音乐、哔哩哔哩等网站。所以写下博客记录这一过程,也算是和大家分享一些经验。
2. 步骤 2.1 分析及网页源代码爬取 2.1.1 分析
打开哔哩哔哩动画网站,查看鬼畜视频排行榜对应网页。再用谷歌开发者工具进行分析。发现每一个视频信息存储以json格式存储在一个叫region的文件里,如下图所示:
文章图片
然后点击Headers,查看相应网页url地址以及获取方式。经过多次尝试发现,url有两个参数需要改变:一个是当前页数,另一个是当前日期。而相应获取方式是requests的get方法,同时我们可以看见关于host,user-agent参数的说明。参见下图:
文章图片
2.1.2网页源代码爬取
由上文我们已经知道了爬取此源代码的方法,那我们可以开始爬取啦!片段代码如下:
// 以下两个参数是url中需要改变的参数
int num = 1;
// 当前页数
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String currentDate = dateFormat.format(new Date());
// 当前日期
// 循环用于爬取所有页面
for (num = 1;
num < 10;
num++) {
String video_url =
"https://s.search.bilibili.com/cate/search?main_ver=v3&search_type=video&view_type=hot_rank&order=click©_right=-1&cate_id=22&page=" + String.valueOf(num) + "&pagesize=20&jsonp=jsonp&time_from=20190224&time_to=" + currentDate;
get_json(video_url, new HttpCallbackListener()
}
2.2 网页源代码解析 【java|JAVA爬虫(二)(哔哩哔哩动画搞笑排行榜爬取)】由上文可知,爬取下来的信息是json格式的。要实现可视化,我们需要对数据进行解析。用getJSONArray方法解析第一层数组,再用getString方法解析第二层对象,可得到title。大家可以根据自己想要的信息类型,解析更多的数据。需要说明的是,由于result里面的数据(video_data)包含多个视频数据,所以我们需要写一个for循环进行单个视频信息的解析。片段代码如下:
public void onFinsh(String response) {
try {
// 解析JSON格式
JSONObject video_data = https://www.it610.com/article/new JSONObject(response);
JSONArray video_data1 = video_data.getJSONArray("result");
Message msg2 = new Message();
// 循环用于对爬下来的每一条信息进行解析
for (int j = 0;
j < video_data1.length();
j++) {String v_url = video_data1.getJSONObject(j).getString("arcurl");
msg2.obj = v_url;
mhandler.sendMessage(msg2);
//Log.e("TAG",v_url);
String title = video_data1.getJSONObject(j).getString("title");
}
} catch (Exception e) {}
3. 总代码
import org.json.JSONArray;
import org.json.JSONObject;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
public static ArrayList> getvideos() {
// 以下两个参数是url中需要改变的参数
int num = 1;
// 当前页数
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
String currentDate = dateFormat.format(new Date());
// 当前日期
// 循环用于爬取所有页面
for (num = 1;
num < 10;
num++) {
String video_url =
"https://s.search.bilibili.com/cate/search?main_ver=v3&search_type=video&view_type=hot_rank&order=click©_right=-1&cate_id=22&page=" + String.valueOf(num) + "&pagesize=20&jsonp=jsonp&time_from=20190224&time_to=" + currentDate;
get_json(video_url, new HttpCallbackListener() {
@Override
public void onFinsh(String response) {
try {
// 解析JSON格式
JSONObject video_data = https://www.it610.com/article/new JSONObject(response);
JSONArray video_data1 = video_data.getJSONArray("result");
Message msg2 = new Message();
// 循环用于对爬下来的每一条信息进行解析
for (int j = 0;
j < video_data1.length();
j++) {
String v_url = video_data1.getJSONObject(j).getString("arcurl");
msg2.obj = v_url;
mhandler.sendMessage(msg2);
//Log.e("TAG",v_url);
String title = video_data1.getJSONObject(j).getString("title");
}
} catch (Exception e) {
}
}
@Override
public void onError(Exception e) {
}
});
}
return emotion_videos;
}
}
推荐阅读
- Java|Java基础——数组
- 人工智能|干货!人体姿态估计与运动预测
- java简介|Java是什么(Java能用来干什么?)
- Java|规范的打印日志
- Linux|109 个实用 shell 脚本
- 程序员|【高级Java架构师系统学习】毕业一年萌新的Java大厂面经,最新整理
- Spring注解驱动第十讲--@Autowired使用
- SqlServer|sql server的UPDLOCK、HOLDLOCK试验
- jvm|【JVM】JVM08(java内存模型解析[JMM])
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)