Python《海上牧云記》騰訊視頻評論爬蟲&情感分析

本節(jié)內(nèi)容實現(xiàn)對《海上牧云記》騰訊視頻的評論進行批量爬取并自動加載新評論,然后將爬取到的評論內(nèi)容存儲到mongodb數(shù)據(jù)庫。

分析網(wǎng)頁

我們爬取的視頻網(wǎng)址為:https://v.qq.com/x/cover/qg67m04ckextp6j.html,該頁面為《海上牧云記》視頻網(wǎng)址,可以看到每頁只有20條評論,要看到新評論還需點擊“加載更多”,則新評論會在當前頁面中加載出來后顯示。首先用Fiddler對該網(wǎng)址進行分析,可以在此處下載:https://www.telerik.com/download/fiddler。
打開Fiddler,將網(wǎng)頁拖至評論處,點擊“加載更多”。切換到Fiddler會話頁面,找到觸發(fā)的真實網(wǎng)址。

評論

Fiddler截獲會話信息

在Fiddler可以看到該會話頭部請求詳情。將觸發(fā)的網(wǎng)址url復(fù)制出來,再次點擊“加載更多”,截獲下一頁會話信息,復(fù)制url,將兩次網(wǎng)址對比分析。
url

可以發(fā)現(xiàn),commentid字段表示評論id,reqnum=20表示每次加載20條評論,2242304383為《海上牧云記》這部視頻的編號,后續(xù)的字段“&tag=&callback=jQuery11240522367052619634_1511758225427&_=1511758225429”可以省略,省略后打開網(wǎng)址驗證。
打開網(wǎng)址

分析網(wǎng)頁,有一些unicode編碼后才會顯示的內(nèi)容??梢园l(fā)現(xiàn)“content”即為評論內(nèi)容,“nick”即為用戶名。找到評論內(nèi)容后就可以構(gòu)造正則表達式來定向爬取評論內(nèi)容了。
unicode編碼

字段驗證

爬蟲編寫

首先因為一些發(fā)爬蟲機制,要設(shè)置頭信息偽裝成瀏覽器進行爬取。在python中可以通過opener.addheaders為爬蟲添加Headers信息,可以在Fiddler截獲到的會話信息中查看Headers信息,也可以在瀏覽器中按F12,點進網(wǎng)址查看Headers信息。 "User-Agent"即為模擬瀏覽器所需的字段。

#導(dǎo)入所需庫
import urllib.request
import http.cookiejar
import re
#視頻編號
vid="2242304383"
#評論起始ID
comid="6340772257283452000"
#構(gòu)造真實評論請求網(wǎng)址
url= "http://coral.qq.com/article/"+vid+"/comment?commentid="+comid+"&reqnum=20"
#設(shè)置頭信息偽裝成瀏覽器進行爬取
headers={ "Accept":" text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                        "Accept-Encoding":" gb2312,utf-8",
                        "Accept-Language":" zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
                        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36",
                        "Connection": "keep-alive",
                        "referer":"qq.com"}

涉及到登錄的操作,會用到Cookie。HTTP協(xié)議為無狀態(tài)協(xié)議,無法維持會話之間的狀態(tài),如果涉及網(wǎng)頁的更新就要反復(fù)登錄,但是Cookie可以保存會話信息,在爬取網(wǎng)頁時,設(shè)置好Cookie就會保持登錄狀態(tài)進行爬取。

#設(shè)置cookie,使用http.cookiejar.CookieJar()創(chuàng)建CookieJar對象
cjar=http.cookiejar.CookieJar()
#使用HTTPCookieProcessor創(chuàng)建cookie處理器,并以其為參數(shù)構(gòu)建opener對象
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
#建立空鏈表,以指定格式存儲頭信息
headall=[]
#構(gòu)造出指定的headers信息
for key,value in headers.items():
    item=(key,value)
    headall.append(item)
#將opener安裝為全局
opener.addheaders = headall
urllib.request.install_opener(opener)

建立一個自定義函數(shù)craw(vid,comid),實現(xiàn)自動抓取對應(yīng)評論網(wǎng)頁并返回抓取數(shù)據(jù),然后構(gòu)建爬取內(nèi)容的正則表達式。

def craw(vid,comid):
    url= "http://coral.qq.com/article/"+vid+"/comment?commentid="+comid+"&reqnum=20"
    data=urllib.request.urlopen(url).read().decode("utf-8")
    return data
#分別構(gòu)建id、用戶名、評論內(nèi)容等信息的正則表達式
idpat='"id":"(.*?)"'
userpat='"nick":"(.*?)",'
conpat='"content":"(.*?)",'

實現(xiàn)爬取評論內(nèi)容并存儲到.txt文件,爬取共20頁的評論內(nèi)容。保存時因為有一些無用的特殊字符或者表情,在寫入文件時會出現(xiàn)無法編譯的錯誤,用errors='ignore'可以忽略這些錯誤,只保存文字。

f=open("D:\\Learn\\python\\web\\testresult\\commend.txt","w+",errors='ignore')
#第一層循環(huán),代表抓取多少頁,每一次外層循環(huán)抓取一頁
for i in range(1,20):
    data=craw(vid,comid)
    #第二層循環(huán),根據(jù)抓取的結(jié)果提取并處理每條評論的信息,一頁20條評論
    for j in range(0,20):
        idlist=re.compile(idpat,re.S).findall(data)
        userlist=re.compile(userpat,re.S).findall(data)
        conlist=re.compile(conpat,re.S).findall(data)
        #eval()將字符串str當成有效的表達式來求值并返回計算結(jié)果
        print(eval('u"'+conlist[j]+'"'),file=f)
    #將comid改變?yōu)樵擁摰淖詈笠粭l評論id,實現(xiàn)不斷自動加載
    comid=idlist[19]
f.close()

然后就可以爬取到評論內(nèi)容了,生成的文件如下所示:


.txt

MongoDB數(shù)據(jù)庫存儲

可以把爬取到的評論內(nèi)容保存到mongodb數(shù)據(jù)庫中,MongoDB提供了一個面向文檔存儲的數(shù)據(jù)庫,操作起來比較簡單和容易。這里只爬取到約400條新評論做簡單存儲分析,讀者自己寫爬蟲時可增加爬取頁數(shù),爬取千條評論樣本作存儲分析。
mongodb可以在官網(wǎng)下載,安裝后將其設(shè)置為服務(wù),可以參考該條經(jīng)驗。

import pymongo
client = pymongo.MongoClient('localhost',27017)
#給數(shù)據(jù)庫命名
commend = client['commend']
#在文件下創(chuàng)建表單
sheet_tab = commend['sheet_tab']
#往數(shù)據(jù)庫中寫入數(shù)據(jù)
path = 'D:\\Learn\\python\\web\\testresult\\commend.txt'
with open(path,'r') as f:
    lines=f.readlines()
    for index,line in enumerate(lines):
        data = {
            'index':index,
            'line':line,
            'words':len(line.split())
        }
        sheet_tab.insert_one(data)
#展示數(shù)據(jù)庫中的數(shù)據(jù)
for item in sheet_tab.find():
    print(item)

情感分析

然后可以對評論做后續(xù)的處理和研究了,比如說情感分析。

import codecs
import matplotlib.pyplot as plt
import numpy as np
from snownlp import SnowNLP
from snownlp import sentiment
from snownlp.sentiment import Sentiment

comment=[]
path = 'D:\\Learn\\python\\web\\testresult\\commend.txt'
with open(path,'r') as f:
    rows=f.readlines()
    for row in rows:
        if (row != '\n'):
            if row not in comment:
                comment.append(row.strip('\n'))
print(comment)
def snowanalysis(self):
    sentimentslist = []
    num=0
    for li in self:
        s = SnowNLP(li)
        if(s.sentiments>0.5):
            num+=1
        sentimentslist.append(s.sentiments)
    print(float(num/len(sentimentslist)))
    plt.hist(sentimentslist,bins=np.arange(0,1,0.01))
    plt.show()

snowanalysis(comment)

通過SnowNLP對短評進行積極和消極情感分類,該庫可以在cmd下用“pip install snownlp”安裝。讀取每段評論依次進行分析,返回一個0~1之間的值,大于0.5代表句子的情感性偏向積極;小于0.5代表情感偏向消極。統(tǒng)計發(fā)現(xiàn)約有67.3%的評論偏向積極和好評。情感偏向分布如下圖所示,可以看出偏向積極的評論多于消極評論,立場中位的評論明顯突出。

情感分析

同樣方法讀者可實現(xiàn)對其他騰訊視頻的評論進行批量爬取并自動加載新評論,然后將爬取到的評論內(nèi)容存儲到mongodb數(shù)據(jù)庫,或者自己作評論的情感分析啦。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 前言 作為一名合格的數(shù)據(jù)分析師,其完整的技術(shù)知識體系必須貫穿數(shù)據(jù)獲取、數(shù)據(jù)存儲、數(shù)據(jù)提取、數(shù)據(jù)分析、數(shù)據(jù)挖掘、...
    whenif閱讀 18,313評論 45 523
  • 我把心事 深深 埋于心底 連母親也不告訴 不管痛苦,還是歡喜 可是 你卻什么都能看見 當我有苦難來襲 你便會默默 ...
    愛已無聲閱讀 368評論 8 19
  • 今天在看海賊王的時候,突然想起之前和弟弟看的《加勒比海盜5》,就想著要不也寫寫吧,所以就動筆了。 記得第一次看《加...
    筱念涼閱讀 1,075評論 2 3
  • 電影場面很宏大,下了很大功夫,里面的景色也非常美。尤其是粉上了張涵予和彭于晏,他們?yōu)槲覈鴩竦陌踩娴母冻龊芏嗪芏?..
    花兒的博文閱讀 239評論 0 0

友情鏈接更多精彩內(nèi)容