哈嘍大家好,我是鵬哥。
今天我想與記錄的是 —— python爬蟲及文本情感分析。
~~~上課鈴~~~
1
寫在前面
最近家裏裝修進度將近,因此家電採購的挑選就成了我空閒時間的填塞物。要買什麼牌子的冰箱?哪些功能比較關鍵?……一開始是聽從我爸的意見,想買卡薩帝BCD-520WICHUI,但是有一天心血來潮,想看看網上對這款冰箱的評價,所以就來一波python爬蟲網友們的評論及自動完成相關的情感分析,讓數據告訴你網友們對卡薩帝的評價。
2
效果展示
1、知乎話題(“卡薩帝冰箱怎麼樣”)的爬蟲上千評論描述:
2、詞雲圖分析
3、基於SnowNLP的情感分析
3
知識串講(敲黑板啦)
(1)selenium爬蟲
這裏 selenium爬蟲對象,我選擇的是知乎。當然淘寶、京東等網站也是一樣能爬蟲的,只是這些網站上一般真實的差評會很少,經常會被店家各種處理,所以我選擇知乎,至少我個人認爲相當真實些。
爬蟲流程:cookies保存、selenium庫使用(登錄知乎網站、爬取各類評價)。整體來說沒有什麼新的內容,所以我不再複述了,可以參考:
【Python成長之路】Boss直聘爬蟲第2彈:selenium找不到元素的常見問題
當然,如果想要我的源碼,可以到github上下載:
https://github.com/yuzipeng05/zhihu_spider.git
這裏可能會有一個坑:如何將中文轉成url碼
因爲訪問知乎url時,如下:
但是複製後會變成:
https://www.zhihu.com/search?q=%E5%8D%A1%E8%90%A8%E5%B8%9D%E5%86%B0%E7%AE%B1%E6%80%8E%E4%B9%88%E6%A0%B7&utm_content=search_history&type=content
因此實際url是將“卡薩帝冰箱怎麼樣”進行了url轉義。解決方法是用urllib庫:
# 錯誤用法,會報找不到quote方法
urllib.quote(question)
# 正確用法
urllib.parse.quote(question)
(2)詞雲圖分析
詞雲圖分析,之前也已經寫過文章了,可以參考:
其實從效果來看,詞雲圖需要對數據要求比較高,像爬蟲的上千條評論進行繪製詞雲圖是看不出什麼內容的,只是看上去花裏胡哨而已。如果是關鍵詞和頻率明確的話,效果纔好。
(3)基於snownlp的情感分析
正是由於詞雲圖無法幫助我快速從評價中得到結論:這款冰箱質量到底行不行啊?所以我這邊又利用了snownlp庫。
使用方法很簡單,將comment文本作爲 入參傳給snownlp類,然後就會得到0-1的情感分析,其中0表示評價極差,1表示評價極好。
s = SnowNLP(comment)
print(s.sentiments)
從這張情感分析的直方圖數據來看,多數評價其實是0.5,這裏是因爲爬取到的內容中,有很多文字是單獨地介紹產品信息,包括和其他產品的對比,因此判斷爲中性評價。下面我簡單地列幾條差評截圖。
(4)繪圖
繪圖這塊,可以用matplotlib庫,也可以pyecharts庫。
其中在使用pyecharts 庫有3個坑:
(1)通過pip install pyecharts庫經常超時
規避方法:通過清華大學的鏡像下載,會加速很多,親測有效
pip install --index https://mirrors.ustc.edu.cn/pypi/web/simple/ pyecharts
(2)在如示例代碼進行調用 Pie方法時,會報無法導入Bar、Pie、Map等。這裏主要是因爲新版本pyecharts庫重構了方法,需要如下使用。
# 老版本pyecharts
from pyecharts import Pie
# 新版本pyecharts,但這條命令仍然有坑,看第3條
from pyecharts.charts import Pie
(3)新版本Pyecharts用以下命令時,
from pyecharts.charts import Pie
會報AttributeError: 'str' object has no attribute 'get'
規避方法:在一開始安裝pyecharts時,要明確版本號,如pyecharts==0.1.9.4
4
示例代碼
(1) snownlp情感分析的示例代碼:
# coding=utf-8
# @公衆號 : "鵬哥賊優秀"
# @Date : 2020/5/15
# @Software : PyCharm
# @Python version: Python 3.7.2
from snownlp import SnowNLP
from pyecharts import Pie
import matplotlib.pyplot as plt
import numpy as np
def emotion_analysis(file):
f = open(file, "r")
comments = f.readlines()
sentimentslist = []
for comment in comments:
s = SnowNLP(comment)
print(s.sentiments)
sentimentslist.append(s.sentiments)
# 繪製直方圖
# plt.hist(sentimentslist, bins=np.arange(0, 1, 0.01), facecolor='red')
# plt.xlabel('Sentiments Probability')
# plt.ylabel('Quantity')
# plt.title('Emotion Analysis')
# plt.show()
# 繪製圓餅圖
attr = ["很差", "較差", "一般", "較好", "很好"]
v1 = [0 for i in range(5)]
for i in sentimentslist:
if i <= 0.2:
v1[0] = v1[0] + 1
elif 0.2 < i <= 0.4:
v1[1] = v1[1] + 1
elif 0.4 < i <= 0.6:
v1[2] = v1[2] + 1
elif 0.6 < i <= 0.8:
v1[3] = v1[3] + 1
else:
v1[4] = v1[4] + 1
pie = Pie('商品評價圓餅圖')
pie.add("", attr, v1,is_label_show=True)
pie.render()
if __name__ == "__main__":
emotion_analysis("卡薩帝冰箱怎麼樣_內容.txt")
(2)知乎爬蟲示例代碼(cookies記錄的相關代碼就不附了):
# coding=utf-8
# @公衆號 : "鵬哥賊優秀"
# @Date : 2020/5/15
# @Software : PyCharm
# @Python version: Python 3.7.2
from record_cookies import *
import urllib
def zhihu(question):
url = 'https://www.zhihu.com/search?type=content&q={}'.format(urllib.parse.quote(question))
option = webdriver.ChromeOptions()
option.add_experimental_option('excludeSwitches', ['enable-automation'])
driver = webdriver.Chrome('F:\\Python成長之路\\chromedriver.exe', options=option)
driver.maximize_window()
driver.get(url)
time.sleep(3)
# 加載cookies
cookies = Cookies(driver)
cookies.add_cookies()
driver.get(url)
time.sleep(3)
# 加載所有搜索結果
for i in range(5):
js = 'var action=document.documentElement.scrollTop=50000'
driver.execute_script(js)
time.sleep(3)
titles = driver.find_elements_by_xpath('//h2[@class="ContentItem-title"]/div/a')
hrefs = []
for title in titles:
hrefs.append(title.get_attribute('href'))
print(hrefs)
# 對每一篇文章進行爬取評論
for href in hrefs:
driver.get(href)
for i in range(5):
try:
comment_btn = driver.find_element_by_xpath \
('//a[@class="QuestionMainAction ViewAll-QuestionMainAction"]')
comment_btn.click()
time.sleep(3)
except:
pass
finally:
js = 'var action=document.documentElement.scrollTop=50000'
driver.execute_script(js)
time.sleep(1)
contents = driver.find_elements_by_xpath('//p')
with open(question + '_內容.txt', 'a') as f:
for content in contents:
try:
f.write(content.text+'\n')
except:
pass
driver.close()
if __name__ == "__main__":
question = '卡薩帝冰箱怎麼樣'
zhihu(question)
5
總結
下面我總結下自己這一週看冰箱下來的心得。
【參考】:https://zhuanlan.zhihu.com/p/136074643
~~~下課鈴~~~
【往期熱門文章】:
【Python成長之路】10行代碼教你免費觀看無廣告版的《慶餘年》騰訊視頻
【Python成長之路】如何用python開發自己的iphone應用程序,並添加至siri指令
【Python成長之路】從 零做網站開發 -- 基於Flask和JQuery,實現表格管理平臺
點擊下方詩句,可以留言互動喔
【關注“鵬哥賊優秀”公衆號,回覆“python學習材料”,將會有python基礎學習、機器學習、數據挖掘、高級編程教程等100G視頻資料,及100+份python相關電子書免費贈送!】
掃描二維碼
與鵬哥一起
學python吧!