title: springboot批量爬取微信公众号信息及视频下载
date: 2022-10-18 22:19:33.719
updated: 2023-11-15 19:09:05.394
url: /archives/20221018springbootgetvideo
categories:

  • 项目大集合
    tags:
  • Spring Boot
  • JAVA
  • 批量爬取微信视频

springboot批量爬取微信公众号信息及视频下载

1. 准备需要爬取的公众号链接(例如:https://mp.weixin.qq.com/s/GPz-w3_gS8jsgINJH9t6vw).下面的是整合了160多个公众号文章的地址.

b2

2. 你们应该知道需要获取160个视频,先需要知道这160视频文章的地址.

<!-- 这个是爬取网页地址 -->
    <dependency>
            <groupId>org.jsoup</groupId>
            <artifactId>jsoup</artifactId>
            <version>1.10.2</version>
        </dependency>
<!-- 这个主要数据解析存储用到-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

3.获取每个视频文章的地址

String url="https://mp.weixin.qq.com/s/GPz-w3_gS8jsgINJH9t6vw";
        Document document = Jsoup.parse(new URL(url), 30000);
        Elements section = document.getElementsByTag("a");
        StringBuffer stringBuffer = new StringBuffer();
        for (Element s:section){ //遍历每个视频文章集数
            VideoInfo videoInfo = new VideoInfo();
            String href = s.attr("href");//获取每个文章的地址
            String name = s.text();//获取每个文章的文本
}

4.每个的文章的视频,是需要再次请求微信服务器才会给你的 (获取的每个文章地址的mpvip的值替换下面这个地址的vid的地址才会返回真正的视频地址给你,就是文章mpcid替换途中红色部分再次请求,返回的才是视频地址)

https://mp.weixin.qq.com/mp/videoplayer?action=get_mp_video_play_url&preview=0&__biz=&mid=&idx=&vid=1070106698888740864&uin=&key=&pass_ticket=&wxtoken=&appmsg_token=&x5=0&f=json
```
if (href.contains("http")){
                Document parse = Jsoup.parse(new URL(href), 30000);
                String mpvid=parse.getElementsByTag("iframe").attr("data-mpvid");
                String sun="https://mp.weixin.qq.com/mp/videoplayer?action=get_mp_video_play_url&preview=0&__biz=&mid=&idx=&vid=1070106698888740864&uin=&key=&pass_ticket=&wxtoken=&appmsg_token=&x5=0&f=json";
                sun=sun.replace("1070106698888740864",mpvid);
                String s1 = sendGet(sun,"");
                String videourl=JSONObject.parseObject(s1).getJSONArray("url_info").getJSONObject(0).get("url").toString();
                String title=JSONObject.parseObject(s1).get("title").toString();
                String sss="<tr>\n" +
                        "        <td>"+name+"</td>\n" +
                        "        <td>"+title+"</td>\n" +
                        "        <td><a href='"+videourl.replace("http://","https://")+"'  target=\"_blank\">"+title+"视频地址点击下载</a></td>\n" +
                        "    </tr>";
                stringBuffer.append(sss);
            }

5.出来的效果.(每个视频地址就整理出来了)

b2

6.完整的源码

public static void main(String[] args) throws Exception {
        String url="https://mp.weixin.qq.com/s/GPz-w3_gS8jsgINJH9t6vw";
        Document document = Jsoup.parse(new URL(url), 30000);
        Elements section = document.getElementsByTag("a");
        StringBuffer stringBuffer = new StringBuffer();
        for (Element s:section){
            VideoInfo videoInfo = new VideoInfo();
            String href = s.attr("href");
            String name = s.text();
            if (href.contains("http")){
                Document parse = Jsoup.parse(new URL(href), 30000);
                String mpvid=parse.getElementsByTag("iframe").attr("data-mpvid");
                String sun="https://mp.weixin.qq.com/mp/videoplayer?action=get_mp_video_play_url&preview=0&__biz=&mid=&idx=&vid=1070106698888740864&uin=&key=&pass_ticket=&wxtoken=&appmsg_token=&x5=0&f=json";
                sun=sun.replace("1070106698888740864",mpvid);
                String s1 = sendGet(sun,"");
                String videourl=JSONObject.parseObject(s1).getJSONArray("url_info").getJSONObject(0).get("url").toString();
                String title=JSONObject.parseObject(s1).get("title").toString();
                String sss="<tr>\n" +
                        "        <td>"+name+"</td>\n" +
                        "        <td>"+title+"</td>\n" +
                        "        <td><a href='"+videourl.replace("http://","https://")+"'  target=\"_blank\">"+title+"视频地址点击下载</a></td>\n" +
                        "    </tr>";
                stringBuffer.append(sss);
            }
        }
        System.out.println(stringBuffer.toString());
    }

    public static String sendGet(String url, String param) {
        String result = "";
        BufferedReader in = null;
        try {
            String urlNameString = url + "?" + param;
            URL realUrl = new URL(urlNameString);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();
            // 获取所有响应头字段
            Map<String, List<String>> map = connection.getHeaderFields();
            // 遍历所有的响应头字段
            for (String key : map.keySet()) {
                System.out.println(key + "--->" + map.get(key));
            }
            // 定义 BufferedReader输入流来读取URL的响应
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            System.out.println("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                e2.printStackTrace();
            }
        }
        return result;
    }