前言
- 執行操作前得確保安裝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)