巧用Python爬取QQ空间好友信息,生成词云
?????? ? ?
前言
隨著大數(shù)據(jù)時代的到來,個人的日常生活總是會與各種各樣的推送聯(lián)系在一起。而這些符合你特性的推送正是對你以往的信息進行分析后得出的結(jié)論,因此爬蟲變成了許多編程愛好者的利器。但學(xué)習(xí)爬蟲時,一些熱門的網(wǎng)頁不斷在更新反扒措施,而許多書籍和網(wǎng)上的文章還停留在以前的版本,本人在使用爬蟲時遇到了各種各樣的坑,尤其是在爬取QQ空間時,許多文章都是兩年前的。因此,爬完后就想寫篇博客來給正在迷茫路上的朋友一點指引。(結(jié)尾有彩蛋)
開始
軟件環(huán)境:Python3.6+selenium包+火狐瀏覽器(selenium和火狐版本要對應(yīng))+pymysql包
準備工作就到這,先說下爬取思路:、
1.先使用selenium登錄自己的QQ獲取cookies
2.將cookies傳給自己構(gòu)造的requests,接下來就用這個構(gòu)造的session
為所欲為
3.找到所有好友的QQ號
4.通過構(gòu)造url對好友的信息進行爬取
~~~Show my code
第一步登錄QQ空間,獲取Cookies
selenium本質(zhì)其實就是模仿人做事,上面的代碼也就是模仿人的動作,對于selenium不太熟悉的可以去百度一下selenium文檔,里面解釋的很詳細,很容易懂。
第二步,成功登錄后,將cookies賦給requests
#獲取cookies,返回帶cookies的requests def back_session(driver):mysession=requests.session()cookies=driver.get_cookies()cookie={}#將cookies轉(zhuǎn)換成字典格式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通過上述操作,我們的工作量就已經(jīng)完成了一半。是不是有點小激動
第三步,找到好友列表——
說起來QQ空間真的是一個神奇的地方,明明爬取的東西沒有知乎上的問題有深度,但人家的反扒措施就是讓你琢磨不透,各種文件的網(wǎng)址構(gòu)造更是一個比一個奇葩。可能你會有點不理解,看下面你就懂了。
F12爬蟲黨必備按鈕--然后點擊圖片中
你會發(fā)現(xiàn)形如這樣的網(wǎng)址
復(fù)制網(wǎng)址在瀏覽器中打開,你就會看到你所有好友的信息:
然后就是對這一奇葩網(wǎng)址的
經(jīng)過多次的測試,發(fā)現(xiàn)3處地方是需要重點注意的uin=需要填寫你自己的QQ號,而g_tk=""(這是空間的加密算法)需要你傳入cookies后生成的,你要是感興趣的話,可以去JS里面找找看
這兩個參數(shù)挺重要,在后面的爬取好友的信息構(gòu)造網(wǎng)址時,同樣會用到。
成功得到這兩個參數(shù)后,我們就可以構(gòu)造正則表達式來獲取所有好友的QQ號代碼如下:
這樣你就得到了所有好友的QQ號,
然后,就來到了最后一步:第四步---獲取好友說說內(nèi)容信息
點開隨機一個好友的網(wǎng)頁,可以看到查看他或她的說說有兩種類型,一種是動態(tài)加載,另一種是按頁數(shù)加載
由于動態(tài)的構(gòu)造網(wǎng)址會復(fù)雜一點,所以我做的是另一種。
??????????????????????????????????? 點 擊
?????????
然后就可以看到
老規(guī)矩F12--
然后復(fù)制網(wǎng)址,打開
就是說說的內(nèi)容,和創(chuàng)建時間。說明我們的思路沒毛病,接下來就是分析網(wǎng)址,并構(gòu)造。
多次試驗后,發(fā)現(xiàn)有五處是需要注意的uin和hostuin需要填寫好友的QQ號 ,g_tk和qzonetoken兩個參數(shù)就是前面提到的。那么怎么跳到下一頁信息呢POS參數(shù)就很重要了,它所存儲的信息一般以20條說說為一頁,也就是是說pos=0代表著第一頁,pos=20代表第二頁。
那么總頁數(shù)怎么知道呢?在說說內(nèi)容的那個網(wǎng)站就有說說總數(shù)。由于每一頁的都會有,所以我們只用爬一頁的就可以,然后換算一下。就可以得到總頁數(shù)
通過上述就能對QQ好友的說說進行爬取
show my code
最終就得到了空間所有好友的說說信息。。。
用的是單線程,不知道用多線程爬取,速度過快會不會被封IP,反正我是沒遭遇過。爬取大概了20多分鐘吧,一共爬取了空間好友了4W多條說說。
本著不秀不是好carry的心態(tài),我也試了把用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', # 設(shè)置背景顏色mask = abel_mask, # 設(shè)置背景圖片max_words = 200, # 設(shè)置最大現(xiàn)實的字數(shù)stopwords = STOPWORDS, # 設(shè)置停用詞width=1600,height=800,font_path = 'C:/Users/Windows/fonts/simkai.ttf',# 設(shè)置字體格式,如不設(shè)置顯示不了中文max_font_size = 200, # 設(shè)置字體最大值random_state = 30, # 設(shè)置有多少種隨機生成狀態(tài),即有多少種配色方案scale=.5).generate(text_from_file_with_apath)# 根據(jù)圖片生成詞云顏色 image_colors = ImageColorGenerator(abel_mask)# 以下代碼顯示圖片 plt.imshow(my_wordcloud) plt.axis("off") plt.show()結(jié)果就變成了這樣
想著我這么辛苦,就為了這么個玩意。
悄悄是別離的笙簫;
沉默是今晚的康橋!
哎,那就處理數(shù)據(jù)吧。終于
說多了都是淚啊。。。。。。。。
??????????????????????????????????????????????????????????? (Game Over)
Github代碼傳送門:完整代碼
??????
總結(jié)
以上是生活随笔為你收集整理的巧用Python爬取QQ空间好友信息,生成词云的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python显示invalid char
- 下一篇: 微信小程序中使用wx.showToast