爬蟲筆記:抓取qq群成員的頭像和昵稱生成詞雲(十)


爬蟲實戰:抓取某個qq群的所有群成員昵稱、頭像,然后把所有人的頭像拼到一個圖片里,所有人的昵稱,生成一個詞雲圖片

分析步驟:

1.分析qq群的請求

2.使用requests模塊發送請求,下載qq頭像

3.獲取每個人的qq號,昵稱

4.使用wordcloud模塊生成昵稱詞雲

5.使用pillow模塊拼接頭像

從第一步開始,先分析下qq群的請求,打開https://qun.qq.com/member.html,這個url是qq群的網頁管理版,可以選擇一個你加入的任意一個qq群,看到所有成員的信息,然后選擇一個qq群,抓包,可以看到它是請求了一個search_group_members的接口,傳入群號,返回了群里的一些成員信息

請求頭信息:

請求分析完,現在能獲取到每個群成員的信息了,返回的mems這個list里面存的是所有qq成員的信息,每個信息是一個字典,nick這個是qq昵稱,uin這個key是每個人的qq號。

通過上面的請求也拿到了獲取頭像的url,就是qq號不一樣而已,https://q4.qlogo.cn/g?b=qq&nk=498201529&s=140,nk這個是qq號,想獲取誰的頭像,換個qq號就可以了

用postman請求一下這個搜索接口,看下返回數據的格式,因為這個qq群管理的網頁必須得登錄才能看到群信息,所以調用這個接口的時候,要傳入cookie,所以直接從瀏覽器里面把cookie復制過來拿進去

url:https://qun.qq.com/cgi-bin/qun_mgr/search_group_members,post請求,把headers里面的請求數據拿過來

上面的分析已經完成了,知道了通過search_mems這個接口可以獲取到所有群成員信息,還有下載qq頭像的url。

import requests,random
from os import listdir
import os,re
from PIL import Image
import math
from wordcloud import WordCloud
import urllib3
class GenQQMem:
    group_url='https://qun.qq.com/cgi-bin/qun_mgr/search_group_members'#獲取群信息的url,這里用類變量,因為他不會變
    def __init__(self,qq_num,group_name='',mem_count=20):
        self.qq_num=qq_num #qq號碼,這里綁定之后,下面就可以self使用了
        self.mem_count=mem_count #成員數量,默認獲取20個
        self.dir_name=qq_num+'_'+group_name #這個是每個群的文件夾,用群號+群名字做文件夾的名字,存放每個群里人的頭像

    def Foma(self,data):#將data格式變成字典格式
        dic = {}
        dat = data.split('&')
        for d in dat:
            d = d.replace('=', ':')
            d1 = d.split(':')[0]
            dic[d1] = d.split(':')[1]
        return dic
    def get_mems(self):
        #這個函數用來下載所有的頭像,獲取所有的qq成員信息
        #發送post請求,獲取到所有群成員信息
        all_nicks=[]

        data='gc=%s&st=0&end=%s&sort=0&bkn=1828438990'%(self.qq_num,self.mem_count)#這個是請求數據
        m=self.Foma(data)
        cookies={
            'Cookie': 'RK=RbcWsEnLM7; pgv_pvi=6162510848; pgv_pvid=3721560373; ptcz=9798ef4a481b00be429978523f36bf55a8ba136786e163956f53cb68945e8da7; tvfe_boss_uuid=7a26071928349f48; o_cookie=812850788; pac_uid=1_812850788; ue_uk=a4af0d6184a86ae4166560709ba31783; ue_uid=fd661495567e1f0184368388fba401d9; LW_pid=7912f88bc83769398d43039a416e5e0e; ue_ts=1550902178; ue_skey=b4c59a1426e1fbd14b252af98ebfc643; ts_uid=1346166200; mobileUV=1_16edbcf6e4c_65bde; eas_sid=51K5D8g7N8A2U4P689I0y3I8s2; ptui_loginuin=812850788@qq.com; _qpsvr_localtk=0.09521351065015837; pgv_si=s2111662080; p_uin=o0812850788; traceid=45e74bd00a; uin=o0812850788; skey=@J6lLo0QoR; pt4_token=-MTXVLvdsPtkxrx1yHDddHI5tcCdP3jNmy9I6-L5wjw_; p_skey=79fRjcT2WHV5pKwkJsi*pwUrspinS7*NFuMbhro69Zo_'
        }#cookie信息,瀏覽器里面復制的
        requests.packages.urllib3.disable_warnings()
        res=requests.post(self.group_url,data=m,headers=cookies,verify=False).json()##發送post請求,傳入cookie和data
        print(res)
        mems=res.get('mems')#mems這個key里面存的是一個list,所有的qq群成員在這里
        if not os.path.isdir(self.dir_name):#判斷這個群的文件夾是否存在,如果不存的話,創建
            os.mkdir(self.dir_name)
        for m in mems:
            url='https://q4.qlogo.cn/g?b=qq&nk={}&s=140'.format(m.get('uin')) #通過替換qq號,生成每個qq成員的頭像url
            abs_path = os.path.join(self.dir_name, '%s.jpg' % m.get('uin'))  # 拼好每個圖片的絕對路徑,以qq號命名
            open(abs_path, 'wb').write(requests.get(url, verify=False).content)  # 打開文件,因為是圖片,所以wb,二進制模式打開
            # content這個在requests模塊的博客里面說過了
            nick_name = m.get('nick')  # 昵稱
            print('下載完成【%s】' % nick_name)  # 打印提示
            all_nicks.append(nick_name)  # 把所有的昵稱保存到一個list里面,用來做詞雲
        return all_nicks  # 返回所有的昵稱list

    def clear_nicks(self, nicks):

        return [re.sub('&.*?;', '', nick) for nick in nicks]
        # 因為有的人昵稱里面有空格,空格是html標簽
        # 出來就是這樣的 快樂  小豬
        # 或者有大於號的就是這樣的 天天>開心
        # 這里用正則表達式,把&xx;這樣的字符串都替換成空

    def gen_wrodcloud(self, words):
        # 生成詞雲
        words = ' '.join(words)  # 傳過來的是一個list,給變成字符串,每個名字用逗號隔開,因為每個昵稱就是一個詞語了,所以不用jieba分詞了
        wordcloud = WordCloud(width=1000,  # 圖片的寬度
                              height=860,  # 高度
                              margin=2,  # 邊距
                              background_color='black',  # 指定背景顏色
                              font_path='C:\Windows\Fonts\Sitka Banner\msyh.ttc'  # 指定字體文件,要有這個字體文件,自己隨便想用什么字體,就下載一個,然后指定路徑就ok了
                              )
        wordcloud.generate(words)  # 分詞
        wordcloud.to_file(self.dir_name + '_' + 'wordcloud' + '.jpg')  # 保存到圖片

    def gen_pic(self):
        # 拼接圖片的函數,這個在拼接圖片那個博客里寫有
        user = self.dir_name
        pics = listdir(user)
        random.shuffle(pics)
        numPic = len(pics)
        size = 760
        eachsize = int(math.sqrt(float(size * size) / numPic))
        numline = int(size / eachsize)
        toImage = Image.new('RGBA', (size, size))
        x = 0
        y = 0
        for i in pics:
            try:
                # 打開圖片
                img = Image.open(user + "/" + i)
            except IOError:
                print("Error: 沒有找到文件或讀取文件失敗")
            else:
                # 縮小圖片
                img = img.resize((eachsize, eachsize), Image.ANTIALIAS)
                # 拼接圖片
                toImage.paste(img, (x * eachsize, y * eachsize))
                x += 1
                if x == numline:
                    x = 0
                    y += 1
        toImage.save(user + str(size) + ".png")

    def main(self):
        # 入口
        all_nicks = self.get_mems()  # 調用獲取獲取成員信息、下載圖片接口
        all_nicks = self.clear_nicks(all_nicks)
        print(all_nicks)
        self.gen_wrodcloud(all_nicks)  # 調用生成詞雲函數
        self.gen_pic()
if __name__=='__main__':
    q = GenQQMem('202830590', 'jmeter')#實例化
    q.main()#調用

 同時這段代碼出現的問題:1. 存在一個cookie失效的問題,嘗試使用了selenium重新登錄獲取cookie,但是是使用掃描二維碼登錄,所以我也沒有辦法解決,如果有小伙伴有解決辦法,麻煩留言告訴我,萬分感謝;2. 還存在一個證書驗證的設置問題,這個已解決:

import requests
from requests.packages import urllib3

urllib3.disable_warnings()  #從urllib3中消除警告
response = requests.get('https://www.12306.cn',verify=False)  #證書驗證設為FALSE
print(response.status_code)

打印結果:200

  附上執行完畢后的兩張圖片:


免責聲明!

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



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