python 獲取qq群成員列表數據


前言

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM