您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么用Python來統計知識星球打卡作業”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用Python來統計知識星球打卡作業”吧!
標題叫“用Python批改知識星球作業”,感覺太標題黨了,所以換了個詞,不過等AI更強大點是有可能做到的。咱們知識星球,每周都要統計大家的作業完成情況與打卡次數,因為知識星球沒有給星主提供運營統計數據,所以,我只能自己動手解決,特別推薦產品和運營人員學點編程,懂點爬蟲,因為互聯網人都是靠數據說話的。
我們的目標是統計出最近一周在星球里的打卡與作業完成情況,所以我們先要想辦法拿到數據,再對數據進行統計分析。因為知識星球提供了 PC 瀏覽器版本,數據的抓取我們直接從 Chrome 瀏覽器找入口。
爬蟲獲取數據就是利用程序模擬瀏覽器發起網絡請求,將數據采集回來,所以,我們先來分析網絡請求在瀏覽器里面是怎樣的。微信掃描登錄知識星球 https://wx.zsxq.com/dweb/ 后, 瀏覽器右鍵「檢查」,打開開發者模式選擇 「Network」就可以看到瀏覽器發出的每個網絡請求,選擇你要進行統計的圈子,你會看到有很多請求。
這些請求全部是和該圈子相關的,在這個階段首先你要對整個往頁的數據有個大概了解,比如在該頁面提供的功能有圈子的基本介紹、星主的基本信息、中間是帖子列表,左側是圈子列表,此時你需要根據每個請求的返回結果做出判斷
groups 請求的數據對應頁面左邊的圈子列表。
topics?count=20 正是我們要找的帖子數據的請求接口
找到了獲取數據的請求接口后,我們先來對返回的數據結構了解一下
{
"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純數字的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
}
}
根據接口返回的結果,分析得出每次請求返回的結果包含了20條帖子數據,每條帖子的數據結構也非常清晰,type 表示帖子的類型,talk 是普通的帖子,還有一種叫 solution,表示作業,talk 字段里面指定了發帖者的信息,和所發的內容,還有創建時間。這是一個嵌套的json 字典結構,用 MongoDB 來直接存儲這些數據是最方便的,不需要構建 Schema,直接作為一個文檔(json)存到數據庫就可以,方便后面根據條件進行過濾分組統計。
思路清晰后,寫代碼其實是很快的,Mongodb 的安裝這里就不介紹了,參考網上的教程可以解決。 只需要兩個依賴庫就可以搞定。
pip install pymongo pip install requests
現在獲取數據的接口找到了,存儲數據的方案也確定了,可以正式開始擼代碼實現了。先來確定如果我們用代碼來模擬瀏覽器發送獲取帖子數據的請求,我們需要提供給哪些請求數據。
再來詳細看這個請求的細節信息,確定了完整的 url 和請求方法 GET,以及很重要的請求頭信息。頭信息我們把它封裝成字典放在get方法中。
def crawl():
url = "https://api.zsxq.com/v1.10/groups/518855855524/topics?count=20"
res = requests.get(url, headers=headers) # get 請求
topics = res.json().get("resp_data").get("topics")
for i in topics:
print(i.get("talk").get("text")[:10])
db.topics.insert_one(i)
現在你還只是獲取了前20條數據,要想獲取所有的帖子,還需要分頁查詢,這時你需要使用瀏覽器加載更多數據來查看請求里面的分頁參數是什么。你會發現它是使用上一次請求返回的數據中最后一條帖子的創建時間作為分頁參數 end_time 象服務器獲取的,所以我們把代碼改成:
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))
我使用遞歸的方式將這個圈子里面所有的帖子全部爬下來。
數據拿到了,現在正是可以進入分析統計階段了。
我們需要用到 MongoDB 的聚合功能,根據每個人的發帖數進行分組排名,并指定匹配查詢條件(我查詢的是時間大于某個指定的日期),有人說,是不是我還需要先去學完 MongoDB 才能做統計了。其實也不,你可以借用強大的搜索引擎來幫助你怎么做這這種復雜的操作。
話說回來,你還是要對MongoDB有基本的了解和掌握簡單的操作,快速入門后才知道怎么去搜索你要的答案,否則也是無從下手。
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}},
]
)
這是我根據刷選條件,根據帖子的創建時間大于等于指定時間,再根據發帖者的id和名字進行分組統計,最后按照降序進行排列。 type 為 solution 的作業帖子也使用同樣的方式,即可統計出來。最終寫入 cvs 文件,展示出來的效果是:
到此,相信大家對“怎么用Python來統計知識星球打卡作業”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。