jieba 分詞 生成詞雲
阿新 • • 發佈:2018-11-08
今天我們要做的事情是使用動態爬蟲來爬取QQ空間的說說,並把這些內容存在txt中,然後讀取出來生成雲圖,這樣可以清晰的看出朋友的狀況。
這是好友的QQ空間10年說說內容,基本有一個大致的印象了。
爬取動態內容
-
因為動態頁面的內容是動態加載出來的,所以我們需要不斷下滑,載入頁面
-
切換到當前內容的frame中,也有可能不是frame,這裡需要檢視具體情況
-
獲取頁面源資料,然後放入xpath中,然後讀取
# 下拉滾動條,使瀏覽器加載出動態載入的內容, # 我這裡是從1開始到6結束 分5 次載入完每頁資料 for i in range(1,6): height = 20000*i#每次滑動20000畫素 strWord = "window.scrollBy(0,"+str(height)+")" driver.execute_script(strWord) time.sleep(4) # 很多時候網頁由多個<frame>或<iframe>組成,webdriver預設定位的是最外層的frame, # 所以這裡需要選中一下說說所在的frame,否則找不到下面需要的網頁元素 driver.switch_to.frame("app_canvas_frame") selector = etree.HTML(driver.page_source) divs = selector.xpath('//*[@id="msgList"]/li/div[3]')
所有的註釋都在程式碼中,所以也就不作詳情說明,
昨天的模擬登入大家都應該掌握了,沒有掌握的自己再去複習一下
.Python爬蟲:學習Selenium並使用Selenium模擬登入知乎
爬取說說的完整程式碼
#coding:utf-8 import time from selenium import webdriver from lxml import etree #這裡一定要設定編碼格式,防止後面寫入檔案時報錯 import sys reload(sys) sys.setdefaultencoding( "utf-8" ) friend = 'XXX' # 朋友的QQ號,朋友的空間要求允許你能訪問 user = 'XXX' # 你的QQ號 pw = 'XXXX' # 你的QQ密碼 #獲取瀏覽器驅動 driver = webdriver.Firefox() # 瀏覽器視窗最大化 driver.maximize_window() # 瀏覽器地址定向為qq登陸頁面 driver.get("http://i.qq.com") # 所以這裡需要選中一下frame,否則找不到下面需要的網頁元素 driver.switch_to.frame("login_frame") # 自動點選賬號登陸方式 driver.find_element_by_id("switcher_plogin").click() # 賬號輸入框輸入已知qq賬號 driver.find_element_by_id("u").send_keys(user) # 密碼框輸入已知密碼 driver.find_element_by_id("p").send_keys(pw) # 自動點選登陸按鈕 driver.find_element_by_id("login_button").click() # 讓webdriver操縱當前頁 driver.switch_to.default_content() # 跳到說說的url, friend你可以任意改成你想訪問的空間 driver.get("http://user.qzone.qq.com/" + friend + "/311") next_num = 0 # 初始“下一頁”的id while True: # 下拉滾動條,使瀏覽器加載出動態載入的內容, # 我這裡是從1開始到6結束 分5 次載入完每頁資料 for i in range(1,6): height = 20000*i#每次滑動20000畫素 strWord = "window.scrollBy(0,"+str(height)+")" driver.execute_script(strWord) time.sleep(4) # 很多時候網頁由多個<frame>或<iframe>組成,webdriver預設定位的是最外層的frame, # 所以這裡需要選中一下說說所在的frame,否則找不到下面需要的網頁元素 driver.switch_to.frame("app_canvas_frame") selector = etree.HTML(driver.page_source) divs = selector.xpath('//*[@id="msgList"]/li/div[3]') #這裡使用 a 表示內容可以連續不清空寫入 with open('qq_word.txt','a') as f: for div in divs: qq_name = div.xpath('./div[2]/a/text()') qq_content = div.xpath('./div[2]/pre/text()') qq_time = div.xpath('./div[4]/div[1]/span/a/text()') qq_name = qq_name[0] if len(qq_name)>0 else '' qq_content = qq_content[0] if len(qq_content)>0 else '' qq_time = qq_time[0] if len(qq_time)>0 else '' print qq_name,qq_time,qq_content f.write(qq_content+"\n") # 當已經到了尾頁,“下一頁”這個按鈕就沒有id了,可以結束了 if driver.page_source.find('pager_next_' + str(next_num)) == -1: break # 找到“下一頁”的按鈕,因為下一頁的按鈕是動態變化的,這裡需要動態記錄一下 driver.find_element_by_id('pager_next_' + str(next_num)).click() # “下一頁”的id next_num += 1 # 因為在下一個迴圈裡首先還要把頁面下拉,所以要跳到外層的frame上 driver.switch_to.parent_frame()
這樣所有的說說內容就可以爬取到了。並且存到了同級目錄中
生成詞雲
生成詞雲需要用到的庫:
wordcloud, 生成詞雲
matplotlib, 生成詞雲圖片
jieba ,這個庫可用可不用,但我因為中文一直顯示不出來,後來加上了這個庫,就能顯示中文了。
#coding:utf-8 """ 使用結巴分詞生成雲圖 說明這裡 1.生成詞雲一定要設定字型樣式,否則漢字出現亂碼或者不顯示 2.我不知道為什麼本機一直顯示不了中文,後面我加了jieba分詞詞庫就可以顯示中文了 """ from wordcloud import WordCloud import matplotlib.pyplot as plt import jieba #生成詞雲 def create_word_cloud(filename): text= open("{}.txt".format(filename)).read() # 結巴分詞 wordlist = jieba.cut(text, cut_all=True) wl = " ".join(wordlist) # 設定詞雲 wc = WordCloud( # 設定背景顏色 background_color="white", # 設定最大顯示的詞雲數 max_words=2000, # 這種字型都在電腦字型中,一般路徑 font_path='C:\Windows\Fonts\simfang.ttf', height= 1200, width= 1600, # 設定字型最大值 max_font_size=100, # 設定有多少種隨機生成狀態,即有多少種配色方案 random_state=30, ) myword = wc.generate(wl) # 生成詞雲 # 展示詞雲圖 plt.imshow(myword) plt.axis("off") plt.show() wc.to_file('py_book.png') # 把詞雲儲存下 if __name__ == '__main__': create_word_cloud('word_py')
另外:回覆關鍵詞:京東圖書評價,獲取京東圖書評論內容,看看一本圖書是否值得購買。
推薦閱讀: