java|JAVA爬虫(二)(哔哩哔哩动画搞笑排行榜爬取)


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的文件里,如下图所示:
java|JAVA爬虫(二)(哔哩哔哩动画搞笑排行榜爬取)
文章图片

然后点击Headers,查看相应网页url地址以及获取方式。经过多次尝试发现,url有两个参数需要改变:一个是当前页数,另一个是当前日期。而相应获取方式是requests的get方法,同时我们可以看见关于host,user-agent参数的说明。参见下图:
java|JAVA爬虫(二)(哔哩哔哩动画搞笑排行榜爬取)
文章图片

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; } }

    推荐阅读