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