日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

巧用Python爬取QQ空间好友信息,生成词云

發布時間:2023/12/16 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 巧用Python爬取QQ空间好友信息,生成词云 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?????? ? ?

前言

隨著大數據時代的到來,個人的日常生活總是會與各種各樣的推送聯系在一起。而這些符合你特性的推送正是對你以往的信息進行分析后得出的結論,因此爬蟲變成了許多編程愛好者的利器。但學習爬蟲時,一些熱門的網頁不斷在更新反扒措施,而許多書籍和網上的文章還停留在以前的版本,本人在使用爬蟲時遇到了各種各樣的坑,尤其是在爬取QQ空間時,許多文章都是兩年前的。因此,爬完后就想寫篇博客來給正在迷茫路上的朋友一點指引。(結尾有彩蛋)

開始

軟件環境:Python3.6+selenium包+火狐瀏覽器(selenium和火狐版本要對應)+pymysql包

準備工作就到這,先說下爬取思路:、

1.先使用selenium登錄自己的QQ獲取cookies

2.將cookies傳給自己構造的requests,接下來就用這個構造的session

為所欲為


3.找到所有好友的QQ號

4.通過構造url對好友的信息進行爬取

~~~Show my code

第一步登錄QQ空間,獲取Cookies

def login():driver=webdriver.Firefox()#打開QQ網頁driver.get("https://qzone.qq.com/")driver.switch_to_frame('login_frame')driver.find_element_by_id('switcher_plogin').click()driver.find_element_by_id('u').clear()driver.find_element_by_id('u').send_keys('QQ賬號')driver.find_element_by_id('p').clear()driver.find_element_by_id('p').send_keys('QQ密碼')driver.find_element_by_id('login_button').click()time.sleep(5)#得把Frame的定位換回來,否則可能會出錯driver.switch_to.default_content()return driver


selenium本質其實就是模仿人做事,上面的代碼也就是模仿人的動作,對于selenium不太熟悉的可以去百度一下selenium文檔,里面解釋的很詳細,很容易懂。


第二步,成功登錄后,將cookies賦給requests

#獲取cookies,返回帶cookies的requests def back_session(driver):mysession=requests.session()cookies=driver.get_cookies()cookie={}#將cookies轉換成字典格式for elem in cookies:cookie[elem['name']] = elem['value']headers={ 'host': 'h5.qzone.qq.com','accept-encoding':'gzip, deflate, br','accept-language':'zh-CN,zh;q=0.8','accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8','user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0','connection': 'keep-alive'}c = requests.utils.cookiejar_from_dict(cookie,cookiejar=None,overwrite=True)mysession.headers=headersmysession.cookies.update(c) return mysession

通過上述操作,我們的工作量就已經完成了一半。是不是有點小激動

第三步,找到好友列表——

說起來QQ空間真的是一個神奇的地方,明明爬取的東西沒有知乎上的問題有深度,但人家的反扒措施就是讓你琢磨不透,各種文件的網址構造更是一個比一個奇葩。可能你會有點不理解,看下面你就懂了。


F12爬蟲黨必備按鈕--然后點擊圖片中



你會發現形如這樣的網址


復制網址在瀏覽器中打開,你就會看到你所有好友的信息:

然后就是對這一奇葩網址的


經過多次的測試,發現3處地方是需要重點注意的uin=需要填寫你自己的QQ號,而g_tk=""(這是空間的加密算法)需要你傳入cookies后生成的,你要是感興趣的話,可以去JS里面找找看

#g_tk算法 def get_g_tk(cookie):hashes = 5381for letter in cookie['p_skey']:hashes += (hashes << 5) + ord(letter) # ord()是用來返回字符的ascii碼return hashes & 0x7fffffff還有一個qzonetoken參數,這是在原來登錄網頁中獲取的可以通過正則表達式構造獲得

這兩個參數挺重要,在后面的爬取好友的信息構造網址時,同樣會用到。

成功得到這兩個參數后,我們就可以構造正則表達式來獲取所有好友的QQ號代碼如下:


這樣你就得到了所有好友的QQ號,


然后,就來到了最后一步:第四步---獲取好友說說內容信息

點開隨機一個好友的網頁,可以看到查看他或她的說說有兩種類型,一種是動態加載,另一種是按頁數加載

由于動態的構造網址會復雜一點,所以我做的是另一種。

??????????????????????????????????? 點 擊

?????????

然后就可以看到

老規矩F12--


然后復制網址,打開


就是說說的內容,和創建時間。說明我們的思路沒毛病,接下來就是分析網址,并構造。


多次試驗后,發現有五處是需要注意的uin和hostuin需要填寫好友的QQ號 ,g_tk和qzonetoken兩個參數就是前面提到的。那么怎么跳到下一頁信息呢POS參數就很重要了,它所存儲的信息一般以20條說說為一頁,也就是是說pos=0代表著第一頁,pos=20代表第二頁。

那么總頁數怎么知道呢?在說說內容的那個網站就有說說總數。由于每一頁的都會有,所以我們只用爬一頁的就可以,然后換算一下。就可以得到總頁數

通過上述就能對QQ好友的說說進行爬取

show my code

#對信息進行爬取 def get_spider(mysession,qq,g_tk,qzonetoken):#這個url是存儲的是好友說說的內容和時間url='https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin='+str(qq)+'&inCharset=utf-8&outCharset=utf-8&hostUin='+str(qq)+'&notice=0&sort=0&pos=0&num=20&cgi_host=http://taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6&code_version=1&format=jsonp&need_private_comment=1&g_tk='+str(g_tk)+'&qzonetoken='+str(qzonetoken)#內容cpat='"certified".*?"conlist":(.*?),'#時間tpat='"certified".*?"createTime":"(.*?)"'#獲取總說說數,由于每個網頁都會有,只爬取一次就好shuoshuo_number_pat='"total":(.*?),'?? ?resp=mysession.get(url)shuoshuo_number=re.compile(shuoshuo_number_pat).findall(resp.text)[0]?? ??? ?content_list=re.compile(cpat,re.S).findall(resp.text)#用來檢查是否可以爬取if len(content_list)==0 :print("該好友說說為0,或你被禁止查看此好友的空間")return False#算出頁數if int(shuoshuo_number)%20==0:page=int(shuoshuo_number)/20else:page=int(shuoshuo_number)/20+1print("一共有"+str(shuoshuo_number)+"條說說")#爬取接下幾頁的說說for i in range(0,int(page)):#和上面的網址一樣,只不過改頁數需要變動pos這個參數pos=i*20try:url='https://h5.qzone.qq.com/proxy/domain/taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6?uin='+str(qq)+'&inCharset=utf-8&outCharset=utf-8&hostUin='+str(qq)+'&notice=0&sort=0&pos='+str(pos)+'&num=20&cgi_host=http://taotao.qq.com/cgi-bin/emotion_cgi_msglist_v6&code_version=1&format=jsonp&need_private_comment=1&g_tk='+str(g_tk)+'&qzonetoken='+qzonetokenresp=mysession.get(url)content_list=re.compile(cpat,re.S).findall(resp.text)time_list=re.compile(tpat,re.S).findall(resp.text)print("正在爬取第"+str(i+1)+"頁信息----------")?? ?for c,t in zip(content_list,time_list):try:c=c.replace('[{"con":','')in_mysql(t,c,conn)except Exception as e:print("有一條說說數據無法寫入")except Exception as e:?? ??? ??? ?print("第"+str(i+1)+"頁信息爬取失敗")

最終就得到了空間所有好友的說說信息。。。

用的是單線程,不知道用多線程爬取,速度過快會不會被封IP,反正我是沒遭遇過。爬取大概了20多分鐘吧,一共爬取了空間好友了4W多條說說。


本著不秀不是好carry的心態,我也試了把用Python將文字變成文字云的玩法

直接代碼伺候

#coding:utf-8 import matplotlib.pyplot as plt from wordcloud import WordCloud,ImageColorGenerator,STOPWORDS import jieba import numpy as np from PIL import Image#讀入背景圖片 abel_mask = np.array(Image.open("輸入背景圖片路徑"))#讀取要生成詞云的文件 text_from_file_with_apath = open('輸入存儲文字的文件路徑',encoding='gbk').read()my_wordcloud = WordCloud(background_color='white', # 設置背景顏色mask = abel_mask, # 設置背景圖片max_words = 200, # 設置最大現實的字數stopwords = STOPWORDS, # 設置停用詞width=1600,height=800,font_path = 'C:/Users/Windows/fonts/simkai.ttf',# 設置字體格式,如不設置顯示不了中文max_font_size = 200, # 設置字體最大值random_state = 30, # 設置有多少種隨機生成狀態,即有多少種配色方案scale=.5).generate(text_from_file_with_apath)# 根據圖片生成詞云顏色 image_colors = ImageColorGenerator(abel_mask)# 以下代碼顯示圖片 plt.imshow(my_wordcloud) plt.axis("off") plt.show()

結果就變成了這樣


想著我這么辛苦,就為了這么個玩意。

悄悄是別離的笙簫;

沉默是今晚的康橋!

哎,那就處理數據吧。終于


說多了都是淚啊。。。。。。。。

??????????????????????????????????????????????????????????? (Game Over)

Github代碼傳送門:完整代碼

??????

總結

以上是生活随笔為你收集整理的巧用Python爬取QQ空间好友信息,生成词云的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。