本代码需要在运行后 先进行登录 然后进行选择群聊 之后程序会自动对群信息进行处理 该过程中无需点击浏览器窗口
代码如下:
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)