最近刷抖音的時(shí)候看到了一個(gè)網(wǎng)上爆火的話題
’既然所有的生命都要死亡,那么生命的意義是什么捡鱼?‘
2000萬瀏覽八回,近8萬個(gè)回答。結(jié)果下方的評(píng)論讓我大感意外
沒有意義驾诈,只是為了活著....?
似乎所有人都很悲觀缠诅、厭世
所以今天我們就使用python爬蟲來獲取知乎這一話題下的所有評(píng)論信息,看看大家都是如何看待這一問題的乍迄?
目標(biāo)獲取
關(guān)于scrapy概念講的我嘴都麻了管引,估計(jì)大家看得也快煩死了,
直接進(jìn)入主題吧!
直接創(chuàng)建scrapy項(xiàng)目創(chuàng)建完成結(jié)構(gòu)如下:
需求分析
我們的目標(biāo)很簡(jiǎn)單闯两,抓取知乎該話題下的所有評(píng)論褥伴、作者、首頁
評(píng)論點(diǎn)贊數(shù)和評(píng)論時(shí)間并將其保存做可視化分析
網(wǎng)頁分析
F12點(diǎn)擊查看網(wǎng)頁源碼漾狼,所有評(píng)論信息如下:都在一個(gè)名為data的數(shù)據(jù)文件中存儲(chǔ)重慢。
所以第一步我們需要先獲取該文件從而獲取我們所需信息
item定義
上面已經(jīng)分析出我們的5個(gè)需求,我們?cè)趇tems.py中定義如下:
#?作者首頁
photo?=?scrapy.Field()
#?作者名稱
name?=?scrapy.Field()
#?評(píng)論時(shí)間
cmt_time?=?scrapy.Field()
#?評(píng)論點(diǎn)贊數(shù)
stars?=?scrapy.Field()
#?評(píng)論內(nèi)容
comments?=?scrapy.Field()
發(fā)送請(qǐng)求
找到網(wǎng)頁請(qǐng)求的真實(shí)鏈接逊躁,如下:
然后我們使用scrapy在spider_zhihu.py文件中發(fā)送請(qǐng)求
為了防止被網(wǎng)站反爬似踱,我們加上headers。
defparse(self,?response):
zhihu_data?=?response.json()
ic(zhihu_data)
可以看到稽煤,我們已經(jīng)成功的獲取到了該json格式數(shù)據(jù)集
但是我們的數(shù)據(jù)是存儲(chǔ)在data列表中的核芽,所以我么還需進(jìn)一步獲取到data列表才能獲取到目標(biāo)數(shù)據(jù)
forzhinzhihu:
#?作者名稱
item['name']?=?zh['author']['member']['name']
#?作者座右銘
item['motto']?=?zh['author']['member']['headline']
#?評(píng)論時(shí)間
cmt_time?=?zh['created_time']
item['cmt_time']?=?time.strftime('%Y-%m-%d?%H:%M',?time.localtime(cmt_time))
#?評(píng)論點(diǎn)贊數(shù)
item['stars']?=?zh['vote_count']
#?評(píng)論內(nèi)容
item['comments']?=?zh['content']
'''
沉吟??如果把一生分成兩半,那么前半段一定是“不猶豫”酵熙,后半段一定是“不后悔”轧简。? 2021-09-21 20:06 ?????0????????????????????????生命本來沒有意義,但總有一些事和一些人讓它變得有意義匾二。
梅鶯苗刀?????????????????????????????????一個(gè)悟家哮独。? 2021-11-13 23:43 ?????0??這可能是最正的一個(gè)回答,請(qǐng)列位耐心看完
如果死亡沒有意義察藐,那么活著能有什么意義...嘿?小家伙????????????????????????????????快樂不期而至??2021-02-04?00:53??????0???????????????????????????????????????????????延長(zhǎng)生命
小羅???????????????? KeepFit健身工作室創(chuàng)始人自律即自由借嗽!? 2018-09-01 10:07 ???? 1 ????????????????????????????????????死了不是你另一種活著的方式嗎
看著辦????????????????????????????????不知道說什么??2021-01-05?13:17??????0??????????????????????????????????????????就是你不想死的意義
'''
需求現(xiàn)在已經(jīng)實(shí)現(xiàn),我們現(xiàn)在要做的就是將數(shù)據(jù)拋給pipeline转培,讓他自行去下載专甩,這一步scrapy已經(jīng)寫好了嬉荆,我們只需打開開關(guān)即可
ITEM_PIPELINES?=?{
'zhihu.pipelines.ZhihuPipeline':300,
}
多頁獲取
我們提取多頁鏈接如下觀察規(guī)律:
https://www.zhihu.com/api/v4/questions/288017836/root_comments?limit=10&offset=0&order=normal&status=open
https://www.zhihu.com/api/v4/questions/288017836/root_comments?limit=10&offset=10&order=normal&status=open
https://www.zhihu.com/api/v4/questions/288017836/root_comments?limit=10&offset=20&order=normal&status=open
https://www.zhihu.com/api/v4/questions/288017836/root_comments?limit=10&offset=20&order=normal&status=open
https://www.zhihu.com/api/v4/questions/288017836/root_comments?limit=10&offset=40&order=normal&status=open
每頁數(shù)據(jù)展示數(shù)目由limit=10控制;翻頁參數(shù)由page控制琉闪。
所以我們多頁鏈接構(gòu)造如下:
url?=f'https://www.zhihu.com/api/v4/questions/288017836/root_comments?limit=10&offset={(page-1)*10}&order=normal&status=open'
數(shù)據(jù)下載
我們還是使用openpyxl將數(shù)據(jù)下載到Excel中然后做數(shù)據(jù)分析。
wb?=?Workbook()
ws?=?self.wb.active
ws.append(['作者首頁','作者名稱','評(píng)論時(shí)間','點(diǎn)贊人數(shù)','評(píng)論內(nèi)容'])
line?=?[item['photo'],?item['name'],?item['cmt_time'],?item['stars'],?item['comments']]
ws.append(line)
wb.save('../知乎.xlsx')
數(shù)據(jù)抓取成功部分展示如下:
數(shù)據(jù)清洗
接下來我們使用pandas對(duì)獲取到的數(shù)據(jù)進(jìn)行去重和去空等處理
pd.set_option('display.max_columns',None)#?顯示完整的列
pd.set_option('display.max_rows',None)#?顯示完整的行
pd.set_option('display.expand_frame_repr',False)#?設(shè)置不折疊數(shù)據(jù)
#?讀取數(shù)據(jù)
rcv_data?=?pd.read_excel('../知乎.xlsx')
#?刪除重復(fù)記錄和缺失值
rcv_data?=?rcv_data.drop_duplicates()
rcv_data?=?rcv_data.dropna()
#?抽樣展示
print(rcv_data.sample(5))
'''
138 ?看前面一條狗???????????????無聊不? 2021-03-01 14:18 ?????0???????????????????????????????????意義不就在于你活著的這個(gè)過程嗎删窒?
150??微笑面對(duì)人參??有些鳥兒是注定不會(huì)被關(guān)在牢籠里的??2021-06-12?10:28??????0????????????????????????????????????????根本沒空思考這樣的問題
352??????優(yōu)秀??????????十年?duì)I養(yǎng)護(hù)膚導(dǎo)師??2020-12-14?19:25??????0??????????????生命是在于你自己去尋找發(fā)現(xiàn)它的意義裂垦,如果你覺得毫無意義,那它就是毫無意義的
161?????Ani????????????????營銷??2021-02-28?19:56??????0?????????????????????????????????2021年了我還是沒有想到問題的答案
294?????喵姐姐???????????????設(shè)計(jì)師??2021-01-04?20:15??????0??就像稍縱即逝的煙火肌索,雖然只是一瞬間蕉拢,但是它存在過,生命的意義就在于當(dāng)某個(gè)瞬間回顧自己的過去時(shí)...
'''
詞云展示
我們使用stylecloud來繪圖诚亚,部分代碼如下:
有興趣的小伙伴可以參考:
如何使用python實(shí)現(xiàn)一個(gè)優(yōu)雅的詞云晕换?(超詳細(xì))
defvisual_ciyun():
pic?='../img.jpg'
gen_stylecloud(text=result,
icon_name='fab?fa-android',
font_path='msyh.ttc',
background_color='white',
output_name=pic,
custom_stopwords=stop_words
)
print('詞云圖繪制成功!')
知乎詞頻圖
這里我們使用熊貓來讀取數(shù)據(jù),并去除空行站宗。使用jieba制作分詞
有興趣的小伙伴可以參考
讓人無法拒絕的pandas技巧闸准,簡(jiǎn)單卻好用到爆!
知乎評(píng)論出現(xiàn)頻率最高的前十個(gè)詞分別如下:
all_words?=?[wordforwordinresult.split('?')iflen(word)?>1andwordnotinstop_words]
wordcount?=?Counter(all_words).most_common(10)
x1_data,?y1_data?=?list(zip(*wordcount))
print(x1_data)
print(y1_data)
'''
('意義',?'生命',?'活著',?'沒有',?'自己',?'死亡',?'問題',?'我們',?'存在',?'如果')
(116,?76,?59,?38,?27,?25,?24,?17,?16,?13)
'''
詞頻氣泡圖
評(píng)論點(diǎn)贊最多
我們將所有評(píng)論按照點(diǎn)贊量從大到小排列如下:
評(píng)論時(shí)間
從時(shí)間軸可以分析出梢灭,這個(gè)問題在2018/08/02 14:26關(guān)注度達(dá)到了頂峰夷家,
2018/08/03 01:51關(guān)注度隨著時(shí)間推移開始下降
評(píng)論內(nèi)容
前三評(píng)論如下:
我不喜歡整理床鋪,我媽罵我敏释,我說:反正要搞亂為啥要整理库快,我媽:你反正要餓,為啥要吃飯
這是個(gè)很有意義的問題钥顽,想了幾年了义屏,我還是沒有很好的答案
活著只是為了活著,不為了任何別的
情感分析
我們以點(diǎn)贊最多評(píng)論為例分析觀眾對(duì)知乎的一些看法進(jìn)行簡(jiǎn)單分析
我們是使用的庫是SnowNLP
SnowNLP是一個(gè)基于Python的情感分析工具庫耳鸯,可以進(jìn)行中文分詞湿蛔、詞性標(biāo)注、情感分析县爬、文本分類阳啥、文本關(guān)鍵詞提取等。
SnowNLP的情感值取值范圍為0到1之間财喳,值越大察迟,說明情感傾向越積極。
pinglun?='活著只是為了活著耳高,不為了任何別的'
Sentiment_analysis?=?SnowNLP(pinglun).sentiments
print(Sentiment_analysis)
'''
0.5941963504212545
'''