本篇內(nèi)容主要講解“怎么用Python來(lái)統(tǒng)計(jì)知識(shí)星球打卡作業(yè)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“怎么用Python來(lái)統(tǒng)計(jì)知識(shí)星球打卡作業(yè)”吧!
創(chuàng)新互聯(lián)是一家專注于成都做網(wǎng)站、網(wǎng)站建設(shè)與策劃設(shè)計(jì),天水網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:天水等地區(qū)。天水做網(wǎng)站價(jià)格咨詢:18982081108
標(biāo)題叫“用Python批改知識(shí)星球作業(yè)”,感覺(jué)太標(biāo)題黨了,所以換了個(gè)詞,不過(guò)等AI更強(qiáng)大點(diǎn)是有可能做到的。咱們知識(shí)星球,每周都要統(tǒng)計(jì)大家的作業(yè)完成情況與打卡次數(shù),因?yàn)橹R(shí)星球沒(méi)有給星主提供運(yùn)營(yíng)統(tǒng)計(jì)數(shù)據(jù),所以,我只能自己動(dòng)手解決,特別推薦產(chǎn)品和運(yùn)營(yíng)人員學(xué)點(diǎn)編程,懂點(diǎn)爬蟲(chóng),因?yàn)榛ヂ?lián)網(wǎng)人都是靠數(shù)據(jù)說(shuō)話的。
我們的目標(biāo)是統(tǒng)計(jì)出最近一周在星球里的打卡與作業(yè)完成情況,所以我們先要想辦法拿到數(shù)據(jù),再對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì)分析。因?yàn)橹R(shí)星球提供了 PC 瀏覽器版本,數(shù)據(jù)的抓取我們直接從 Chrome 瀏覽器找入口。
爬蟲(chóng)獲取數(shù)據(jù)就是利用程序模擬瀏覽器發(fā)起網(wǎng)絡(luò)請(qǐng)求,將數(shù)據(jù)采集回來(lái),所以,我們先來(lái)分析網(wǎng)絡(luò)請(qǐng)求在瀏覽器里面是怎樣的。微信掃描登錄知識(shí)星球 https://wx.zsxq.com/dweb/ 后, 瀏覽器右鍵「檢查」,打開(kāi)開(kāi)發(fā)者模式選擇 「Network」就可以看到瀏覽器發(fā)出的每個(gè)網(wǎng)絡(luò)請(qǐng)求,選擇你要進(jìn)行統(tǒng)計(jì)的圈子,你會(huì)看到有很多請(qǐng)求。
這些請(qǐng)求全部是和該圈子相關(guān)的,在這個(gè)階段首先你要對(duì)整個(gè)往頁(yè)的數(shù)據(jù)有個(gè)大概了解,比如在該頁(yè)面提供的功能有圈子的基本介紹、星主的基本信息、中間是帖子列表,左側(cè)是圈子列表,此時(shí)你需要根據(jù)每個(gè)請(qǐng)求的返回結(jié)果做出判斷
groups 請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)頁(yè)面左邊的圈子列表。
topics?count=20 正是我們要找的帖子數(shù)據(jù)的請(qǐng)求接口
找到了獲取數(shù)據(jù)的請(qǐng)求接口后,我們先來(lái)對(duì)返回的數(shù)據(jù)結(jié)構(gòu)了解一下
{
"topic_id": 48551524482128,
"group": {
"group_id": 518855855524,
"name": "Python之禪和朋友們"
},
"type": "talk",
"talk": {
"owner": {
"user_id": 15551441848112,
"name": "葉憲",
"avatar_url": "https://file.zsxq.19.jpg"
},
"text": "我嘗試了一下,8位0-9純數(shù)字的MD5暴力破解花了約140秒。"
},
"likes_count": 0,
"comments_count": 0,
"rewards_count": 0,
"digested": false,
"sticky": false,
"create_time": "2018-06-05T23:39:38.197+0800",
"user_specific": {
"liked": false,
"subscribed": false
}
}
根據(jù)接口返回的結(jié)果,分析得出每次請(qǐng)求返回的結(jié)果包含了20條帖子數(shù)據(jù),每條帖子的數(shù)據(jù)結(jié)構(gòu)也非常清晰,type 表示帖子的類型,talk 是普通的帖子,還有一種叫 solution,表示作業(yè),talk 字段里面指定了發(fā)帖者的信息,和所發(fā)的內(nèi)容,還有創(chuàng)建時(shí)間。這是一個(gè)嵌套的json 字典結(jié)構(gòu),用 MongoDB 來(lái)直接存儲(chǔ)這些數(shù)據(jù)是最方便的,不需要構(gòu)建 Schema,直接作為一個(gè)文檔(json)存到數(shù)據(jù)庫(kù)就可以,方便后面根據(jù)條件進(jìn)行過(guò)濾分組統(tǒng)計(jì)。
思路清晰后,寫(xiě)代碼其實(shí)是很快的,Mongodb 的安裝這里就不介紹了,參考網(wǎng)上的教程可以解決。 只需要兩個(gè)依賴庫(kù)就可以搞定。
pip install pymongo pip install requests
現(xiàn)在獲取數(shù)據(jù)的接口找到了,存儲(chǔ)數(shù)據(jù)的方案也確定了,可以正式開(kāi)始擼代碼實(shí)現(xiàn)了。先來(lái)確定如果我們用代碼來(lái)模擬瀏覽器發(fā)送獲取帖子數(shù)據(jù)的請(qǐng)求,我們需要提供給哪些請(qǐng)求數(shù)據(jù)。
再來(lái)詳細(xì)看這個(gè)請(qǐng)求的細(xì)節(jié)信息,確定了完整的 url 和請(qǐng)求方法 GET,以及很重要的請(qǐng)求頭信息。頭信息我們把它封裝成字典放在get方法中。
def crawl():
url = "https://api.zsxq.com/v1.10/groups/518855855524/topics?count=20"
res = requests.get(url, headers=headers) # get 請(qǐng)求
topics = res.json().get("resp_data").get("topics")
for i in topics:
print(i.get("talk").get("text")[:10])
db.topics.insert_one(i)
現(xiàn)在你還只是獲取了前20條數(shù)據(jù),要想獲取所有的帖子,還需要分頁(yè)查詢,這時(shí)你需要使用瀏覽器加載更多數(shù)據(jù)來(lái)查看請(qǐng)求里面的分頁(yè)參數(shù)是什么。你會(huì)發(fā)現(xiàn)它是使用上一次請(qǐng)求返回的數(shù)據(jù)中最后一條帖子的創(chuàng)建時(shí)間作為分頁(yè)參數(shù) end_time 象服務(wù)器獲取的,所以我們把代碼改成:
def crawl(url):
res = requests.get(url, headers=str_to_dict(headers))
topics = res.json().get("resp_data").get("topics")
if len(topics) <= 1:
return
for i in topics:
print(i.get("talk").get("text")[:10])
db.topics.insert_one(i)
else:
last_time = i.get("create_time")
crawl("https://api.zsxq.com/v1.9/groups/518855855524/topics?count=20" + "&end_time=" + parse.quote(last_time))
我使用遞歸的方式將這個(gè)圈子里面所有的帖子全部爬下來(lái)。
數(shù)據(jù)拿到了,現(xiàn)在正是可以進(jìn)入分析統(tǒng)計(jì)階段了。
我們需要用到 MongoDB 的聚合功能,根據(jù)每個(gè)人的發(fā)帖數(shù)進(jìn)行分組排名,并指定匹配查詢條件(我查詢的是時(shí)間大于某個(gè)指定的日期),有人說(shuō),是不是我還需要先去學(xué)完 MongoDB 才能做統(tǒng)計(jì)了。其實(shí)也不,你可以借用強(qiáng)大的搜索引擎來(lái)幫助你怎么做這這種復(fù)雜的操作。
話說(shuō)回來(lái),你還是要對(duì)MongoDB有基本的了解和掌握簡(jiǎn)單的操作,快速入門(mén)后才知道怎么去搜索你要的答案,否則也是無(wú)從下手。
def statics():
# 打卡
talk = db.topics.aggregate(
[
{"$match": {"create_time": {"$gte": "2018-05-28T00:00:14.202+0800"}}},
{
"$group": {
"_id": {
"user_id": "$talk.owner.user_id",
"name": "$talk.owner.name",
},
"count": {"$sum": 1},
}
},
{"$sort": {"count": -1}},
]
)
這是我根據(jù)刷選條件,根據(jù)帖子的創(chuàng)建時(shí)間大于等于指定時(shí)間,再根據(jù)發(fā)帖者的id和名字進(jìn)行分組統(tǒng)計(jì),最后按照降序進(jìn)行排列。 type 為 solution 的作業(yè)帖子也使用同樣的方式,即可統(tǒng)計(jì)出來(lái)。最終寫(xiě)入 cvs 文件,展示出來(lái)的效果是:
到此,相信大家對(duì)“怎么用Python來(lái)統(tǒng)計(jì)知識(shí)星球打卡作業(yè)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
名稱欄目:怎么用Python來(lái)統(tǒng)計(jì)知識(shí)星球打卡作業(yè)
本文網(wǎng)址:http://www.rwnh.cn/article32/jihopc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、微信小程序、企業(yè)建站、面包屑導(dǎo)航、手機(jī)網(wǎng)站建設(shè)、網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)