zoukankan      html  css  js  c++  java
  • python 获取qq群成员列表数据

    前言

    • 执行操作前得确保安装selenium和webdriver的驱动,还有第三方库的安装。
    • 实现思路:
      1、通过selenium操作浏览器,加载页面html全部代码,并保存
      2、通过BeautifulSoup解析数据,并清洗合并所需要的数据。
      3、通过xlsxwriter写入表格。

    代码实现

    • 以下是全部代码,每一步都写好了备注方便理解,可能不是最好的代码,但能实现需求,供大家参考。
    • 测试之前,先登录电脑版qq方便网页版授权,遇到报红的库没有导入的,请百度搜索一下安装就行。
    #!/usr/bin/python
    # -*- coding: utf-8 -*-
    import re
    import time
    import xlsxwriter
    from selenium import webdriver
    from bs4 import BeautifulSoup
    import io
    import sys
    
    
    def qq_login(gid):
        """
        通过selenium模拟登录,获取群成员信息
        :param gid: 群号
        :return: 页面源码
        """
        driver = webdriver.Chrome()
        driver.get('https://qun.qq.com/member.html#gid=%s' % gid)
        driver.maximize_window()
        time.sleep(3)
        # 切换iframe授权登录
        driver.switch_to_frame('login_frame')
        driver.find_element_by_class_name('img_out_focus').click()
    
        # 拉动滑动条加载剩余数据
        for i in range(1000):
            js = "window.scrollTo(0,document.body.scrollHeight)"
            driver.execute_script(js)
    
        # 获取页面源码并写入缓存
        res = driver.page_source
        driver.close()
        return res
    
    
    def dispose(res):
        """
        处理页面源码数据,提取群成员信息
        :param res: 页面源码
        :return: 处理后的list_a列表
        """
        # 改变标准输出的默认编码
        sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
    
        soup = BeautifulSoup(res, 'lxml')
    
        # 查找tr标签下的class属性包含‘mb’的节点树
        c = soup.find_all('tr', attrs={"class": re.compile('mb')})
        list_a = []
        for i in c:
            # 处理一些特殊字符‘
    ’,'	',替换成‘,’
            str_a = i.text.replace('
    ', '').replace('	', ',')
            # 通过正则表达式,切割以‘,’分割的字符串组成列表
            data = re.split(r',', str_a)
            # 去除空字符""
            data_list = [i for i in data if i != '']
            # 获取头像地址并插入列表
            img = "https:" + i.img.get('src')
    
            # 将头像地址插入列表中第3个位置的元素
            data_list.insert(2, img)
            # 删除列表中的序号
            del data_list[0]
            # 由于前面删除了空字符"",导致有些人的群昵称为空也删除,这里手动添加进去。
            if len(data_list) < 9:
                data_list.insert(2, '')
    
            # 每一个成员信息为一个列表,添加到list_a作为元素
            list_a.append(data_list)
        return list_a
    
    
    def write_execl(list_a):
        """
        写入execl表格
        :param list_a: 数据列表
        :return:
        """
        if len(list_a) > 2:
    
            # 创建execl
            new_time = time.strftime("%Y-%m-%d %H_%M_%S", time.localtime())
            workbook = xlsxwriter.Workbook('{}.xlsx'.format(new_time))  # 新建excel表
            worksheet = workbook.add_worksheet('sheet1')  # 新建sheet(sheet的名称为"sheet1")
    
            bold = workbook.add_format({
                                'bold': 1,  # 字体加粗
                                'fg_color': 'green',  # 单元格背景颜色
                                'align': 'center',  # 对齐方式
                                'valign': 'vcenter',  # 字体对齐方式
                                })
    
            # 写表头
            work_header = ['QQ昵称', '头像地址', '群昵称', 'QQ号', '性别', 'Q龄', '入群时间', '等级(积分)', '最后发言']
            worksheet.write_row('A1', work_header, bold)
    
            # 遍历多少条数据就写入多少行数据到execl,表头已经占了A1,所以从A2开始写入,index从0开始遍历(2+index)
            for index in range(len(list_a)):
                worksheet.write_row('A%s' % (2 + index), list_a[index])
    
            # 最后关闭workbook,否则不会产生execl文件
            workbook.close()
        else:
            print('请检查群号是否有误,没有获取到群成员信息,放弃写入execl')
    
    
    if __name__ == '__main__':
        res = qq_login('填写群号')
        list_a = dispose(res)
        write_execl(list_a)
    
    
  • 相关阅读:
    提升PHP执行效率的一些小细节
    linux文件处理命令
    C# file操作
    C# MD5
    C# guid
    C# Path类 Directory类
    MarkDown学习
    从GitHub建站迁移到服务器(Java环境)
    sonarqube在windows上软件安装,配置及使用
    【优化】记录一次方法性能优化
  • 原文地址:https://www.cnblogs.com/se7enjean/p/13177077.html
Copyright © 2011-2022 走看看