用selenium获取QQ群成员信息(QQ号 名称 性别等...)

本文介绍了一段Python代码,使用Selenium库进行网页自动化操作,登录QQ群后自动处理群信息,包括群名称、成员数据抓取,并将结果保存为Excel文件。
摘要由CSDN通过智能技术生成

本代码需要在运行后 先进行登录 然后进行选择群聊 之后程序会自动对群信息进行处理 该过程中无需点击浏览器窗口

代码如下:

import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
import pandas as pd
from bs4 import BeautifulSoup
import string
# 创建 WebDriver 对象
driver = webdriver.Chrome()

# 打开网页
driver.get('https://qun.qq.com/member.html')

# 等待元素存在,然后等待元素不可见,然后进行下一步操作
try:
    # 等待元素存在  数字为最长等待时间
    login_win = WebDriverWait(driver, 100).until(
        EC.presence_of_element_located((By.ID, "loginWin"))
    )

    # 等待元素不可见
    WebDriverWait(driver, 100).until_not(
        EC.visibility_of_element_located((By.ID, "loginWin"))
    )
    print("登录成功")
    try:  #群选择成功
        # 等待元素出现
        dialog = WebDriverWait(driver, 100).until(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".ui-dialog.on"))
        )

        # 等待元素消失
        WebDriverWait(driver, 100).until_not(
            EC.presence_of_element_located((By.CSS_SELECTOR, ".ui-dialog.on"))
        )
    except:  # 跳过群选择
        pass
    print("群聊已确认")
    print("正在进行数据处理")
    # 使用XPath提取元素内容
    element = driver.find_element(By.XPATH, '//span[@id="groupTit"]')
    text = element.text
    print(f"群名称:{text}")
    # 模拟滚动
    SCROLL_PAUSE_TIME = 0.5  # 滚动间隔时间
    # 获取页面初始高度
    number = 0
    last_height = driver.execute_script("return document.body.scrollHeight")
    while True:
        number = number + 1
        # 模拟滚动到页面底部
        driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

        # 等待页面加载
        time.sleep(SCROLL_PAUSE_TIME)

        # 计算新高度并判断是否到达页面底部
        new_height = driver.execute_script("return document.body.scrollHeight")
        print("\r正在处理第{}个页面".format(number), end="")
        if new_height == last_height:
            break
        last_height = new_height

    # 等待页面加载完全
    time.sleep(2)

    # 获取整个网页的 HTML 内容
    html_content = driver.page_source

    # 将 HTML 内容保存到文件
    with open('page_content.html', 'w', encoding='utf-8') as file:
        file.write(html_content)

    # 关闭浏览器
    driver.quit()

    # 处理特殊字符(非法字符)
    def remove_nonprintable_chars(text):
        cleaned_text = ''
        for char in text:
            if char.isalnum() or char in string.printable or char.isspace():
                cleaned_text += char
        return cleaned_text


    # 从本地文件中读取HTML内容(将 'your_file.html' 替换为你的文件路径)
    with open('page_content.html', 'r', encoding='utf-8') as file:
        html_content = file.read()

    # 创建 BeautifulSoup 对象
    soup = BeautifulSoup(html_content, 'html.parser')

    # 找到具有指定 id 的表格元素
    table = soup.find('table', {'id': 'groupMember'})

    # 在表格中找到所有包含 'list' 类的 tbody 元素

    tbody_elements = table.find_all('tbody', class_='list')

    data = []  # 列表用于存储提取的数据

    for tbody in tbody_elements:
        # 在每个 tbody 中找到具有 'mb' 类的元素并提取信息
        elements = tbody.find_all(class_=lambda x: x and 'mb' in x)
        for element in elements:
            try:
                # 提取并清理(或处理)数据
                gender = remove_nonprintable_chars(element.find_all('td')[1].text.strip())  # 序号
                name = remove_nonprintable_chars(element.find_all('td')[2].text.strip())  # 名称
                group_name = remove_nonprintable_chars(element.find_all('td')[3].text.strip())  # 群名称
                Qid = remove_nonprintable_chars(element.find_all('td')[4].text.strip())  # QQ号
                sex = remove_nonprintable_chars(element.find_all('td')[5].text.strip())  # 性别
                QQ_year = remove_nonprintable_chars(element.find_all('td')[6].text.strip())  # QQ年龄
                join_date = remove_nonprintable_chars(element.find_all('td')[7].text.strip())  # 进群日期
                group_lv = remove_nonprintable_chars(element.find_all('td')[8].text.strip())  # 群等级
                send_date = remove_nonprintable_chars(element.find_all('td')[9].text.strip())  # 最后发言日期

                # 以字典格式存储提取的数据
                data.append({
                    "序号": gender,
                    '名称': name,
                    '群名称': group_name,
                    'QQ号': Qid,
                    '性别': sex,
                    'QQ年龄': QQ_year,
                    '进群日期': join_date,
                    '群等级': group_lv,
                    '最后发言日期': send_date
                })
            except:
                pass

    df = pd.DataFrame(data)
    df.to_excel(f'{text}.xlsx', index=False)
    print("文件保存成功")

except Exception as e:  #登录窗口打开失败
    print("登录失败")
    print(e)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值