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

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 网页源代码解析

由上文可知,爬取下来的信息是json格式的。要实现可视化,我们需要对数据进行解析。用getJSONArray方法解析第一层数组,再用getString方法解析第二层对象,可得到title。大家可以根据自己想要的信息类型,解析更多的数据。需要说明的是,由于result里面的数据(video_data)包含多个视频数据,所以我们需要写一个for循环进行单个视频信息的解析。片段代码如下:

public void onFinsh(String response) {
                    try {
                        // 解析JSON格式
                        JSONObject video_data = 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<String> 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 = 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,爬虫)