巧用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
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里面找找看
這兩個參數挺重要,在后面的爬取好友的信息構造網址時,同樣會用到。
成功得到這兩個參數后,我們就可以構造正則表達式來獲取所有好友的QQ號代碼如下:
這樣你就得到了所有好友的QQ號,
然后,就來到了最后一步:第四步---獲取好友說說內容信息
點開隨機一個好友的網頁,可以看到查看他或她的說說有兩種類型,一種是動態加載,另一種是按頁數加載
由于動態的構造網址會復雜一點,所以我做的是另一種。
??????????????????????????????????? 點 擊
?????????
然后就可以看到
老規矩F12--
然后復制網址,打開
就是說說的內容,和創建時間。說明我們的思路沒毛病,接下來就是分析網址,并構造。
多次試驗后,發現有五處是需要注意的uin和hostuin需要填寫好友的QQ號 ,g_tk和qzonetoken兩個參數就是前面提到的。那么怎么跳到下一頁信息呢POS參數就很重要了,它所存儲的信息一般以20條說說為一頁,也就是是說pos=0代表著第一頁,pos=20代表第二頁。
那么總頁數怎么知道呢?在說說內容的那個網站就有說說總數。由于每一頁的都會有,所以我們只用爬一頁的就可以,然后換算一下。就可以得到總頁數
通過上述就能對QQ好友的說說進行爬取
show my code
最終就得到了空間所有好友的說說信息。。。
用的是單線程,不知道用多線程爬取,速度過快會不會被封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空间好友信息,生成词云的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python显示invalid char
- 下一篇: python中cls和self的区别