hutool或者jsoup爬取群成员信息

该博客介绍了如何利用Java的Hutool库进行网络爬虫,结合EasyPoi库导出QQ群成员的详细信息到Excel文件。首先,设置好依赖包,然后通过分析接口获取群成员数据,使用循环遍历分页获取所有成员。接着,对获取的数据进行时间戳转换,并去重,最后利用EasyPoi将数据导出到Excel,实现群成员信息的批量导出。
摘要由CSDN通过智能技术生成

目的:爬取成员信息,并导出

此处用的是hutool爬取+easy-poi导出,jsoup同理
相关jia包

  <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.12</version>
        </dependency>
        
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.2</version>
        </dependency>
        
        <!--easypoi-->
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>3.2.0</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>3.2.0</version>
        </dependency>

群成员相关接口:

https://qun.qq.com/member.html#gid=(qq群号码,直接写群号码)

进入F12看到相关信息
在这里插入图片描述
在这里插入图片描述

然后把url和相关参数放到postman测试一下:
注意cookie不要忘记了
在这里插入图片描述
在这里插入图片描述

可以得到json数据:
在这里插入图片描述

直接上代码:

  @Test
    void testGetQQInfoHutool() throws IOException {

        /**
         * 按照F12得出结论 群员数量66 以及相关 st end的取值
         * st    0     21     42      63
         * end   20    41     62      66
         */
        List<QQMember> listEnd = new ArrayList<>();
        //通过循环改变分页查询条件,获取所有的群成员信息
        //i的值是 群成员数量/分页数  
        for (int i = 0; i < 4; i++) {
            int st = (20 * i) + i;
            if (i == 0) {
                st = 0;
            }
            int end = st + 20;
//            String url = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members?gc=438672685&sort=0&bkn=47110324&end=20&st=0";
            String url = "https://qun.qq.com/cgi-bin/qun_mgr/search_group_members?gc=438672685&sort=0&bkn=1414405685&" + "end=" + end + "&st=" + st;
            String cookie = "pgv_pvid=7740519374; RK=3asJQf311j; ptcz=ce3c723b8b1ea9b5f6284b1b4a79766a7905de9ff4c04cdbd7221ddc9b57cecb; luin=o2517865739; lskey=0001000097cfa5444e34636bee5b837ee6d899da77a7b37b0c9359cba6b099f2cb0001c15020791e01ffa7bc; uin=o2517865739; p_uin=o2517865739; traceid=0b047ebf48; pgv_info=ssid=s7328931644; fqm_pvqid=757f1925-5961-4478-8ba3-47167d3ff801; fqm_sessionid=47fd6f8c-9d34-41fe-a87f-7a2fe0f6f599; skey=@GoPVTRbdH; pt4_token=paLWXr2lT6J*VVAKnFzmPwbpV40mSCyFRt*k4U2WWlg_; p_skey=8saip9YaONClsvQQVQgeJAhWFg-9XzUnZi49CToqEas_";

            String accept = HttpRequest.post(url)
                    .header("accept", "*/*")
                    .header("accept-encoding", "gzip, deflate, br")
                    .header("accept-language", "zh-CN,zh;q=0.9")
                    .header("content-length", "45")
                    .header("content-type", "application/x-www-form-urlencoded; charset=UTF-8")
                    .header("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36")
                    .header("cookie", cookie)
                    .timeout(10000)
                    .execute()
                    .body();
            //将数据转换成list
            JSONObject jsonObject = JSONUtil.parseObj(accept);
            JSONArray mems = jsonObject.getJSONArray("mems");
            List<QQMember> list1 = mems.toList(QQMember.class);
            //通过接口知道时间是: 时间戳少了3位,我默认加上了3个0,测试是正常时间,转换yyyy-MM-dd 格式输出打印 具体打印成什么样,自定义
            List<QQMember> list = list1.stream().map(t -> {
                t.setJoinTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Long.valueOf(t.getJoinTime() + "000")));
                t.setLastSpeakTime(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Long.valueOf(t.getLastSpeakTime() + "000")));
                return t;
            }).collect(Collectors.toList());
            listEnd.addAll(list);
        }

        //控制台打印语句 无用
        listEnd.stream().forEach(t -> System.out.println("QQ号是:" + t.getUin() +
                "   昵称是:" + t.getCard() +
                "   入群时间:" + t.getJoinTime() + "最后一次说话时间:" + t.getLastSpeakTime()));

        //这边可以不用写,我为了预防重复数据,用于去重的
        ArrayList<QQMember> listEnd1 = listEnd.stream().collect(
                Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(tc -> tc.getUin()))), ArrayList::new)
        );

        Workbook workbook =
                ExcelExportUtil.exportExcel(new ExportParams("内 卷群", "群员信息"), QQMember.class, listEnd1);
        FileOutputStream os = new FileOutputStream("src/main/resources/别卷了4.xlsx");
        workbook.write(os);
        os.close();

    }

最终,查看Excel数据
在这里插入图片描述
完美,成功获取群成员信息了

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值