前言
- 执行操作前得确保安装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)