se7enjean

前言

  • 执行操作前得确保安装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:
        # 处理一些特殊字符‘\n’,\'\t\',替换成‘,’
        str_a = i.text.replace(\'\n\', \'\').replace(\'\t\', \',\')
        # 通过正则表达式,切割以‘,’分割的字符串组成列表
        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)

分类:

技术点:

相关文章:

  • 2021-11-16
  • 2022-12-23
  • 2021-12-04
  • 2021-11-29
  • 2019-11-15
  • 2021-10-27
  • 2021-11-26
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-03
  • 2021-10-19
  • 2021-04-02
相关资源
相似解决方案