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)

原文地址:https://www.cnblogs.com/se7enjean/p/13177077.html