日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

steam夏日促销用Python爬取排行榜上的游戏打折信息

發布時間:2025/3/15 python 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 steam夏日促销用Python爬取排行榜上的游戏打折信息 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

不知不覺,一年一度如火如荼的 steam 夏日促銷悄然開始了。每年通過大大小小的促銷,我的游戲庫里已經堆積滿還未下載過的游戲。但所謂“買到就是賺到,G胖一定大虧”的想法日漸流行,指不定以后就靠它們發達了呢。

有時候滾動steam的排行榜看自己喜歡的游戲的時候,未免會被右邊的價格影響到。久而久之我發現我所不想買的游戲并不是因為它不好玩,而是它還沒打折。又或者有些心水未被別人挖掘,在排行榜隱秘的角落里自怨自艾,等待“把玩”它的人出現~

于是我簡單的用python爬取了steam排行榜前10000個游戲的信息,其中有游戲名,評價,價格,出版日期等,在更加簡潔的列表界面選取自己感興趣的游戲之時,也可以進行進一步的數據分析。

廢話不多說,趕緊開始,不然被我拖更到促銷結束了就蹭不到熱度了。(本來也沒有熱度)

開始爬取

先說說這次爬蟲選用數據的優缺點:

第一,我發現了steam在顯示排行榜列表的時候后臺會進行一個查詢的申請,點開一看是一串json代碼,而且在python進行request的時候不需要模擬瀏覽器進行填“headers”表的操作。通過訪問而得到的json代碼大大簡化了循環復雜度,一次循環可以得到100個游戲信息。

第二,因為只需要遍歷所有json代碼,時間上可以比進入每一個游戲鏈接更加短。

第三,但就因為沒有進入每個游戲的鏈接,所以像評論,簡介,開發商等信息就沒有爬取。但爬取游戲鏈接的爬蟲攻略網上也有很多,這里就不弄斧了。

首先,進入官網的排行榜頁面,為了避免游戲DLC、bundle等影響后期操作的類型出現,記得在右邊的過濾器里只勾選游戲類目。

?

通過后臺的XHR發現,頁面每次刷新都只顯示前50個游戲,當我們滾動頁面往下看時,網站會發送一個神秘代碼:

?

經過觀察,我發現代碼會自動申請返回從start參數的數字開始,一共count參數的數字的游戲信息。比如,下面的圖顯示它申請了從第51個到100個總共50個游戲的信息。

?

雙擊上上圖的紅框鏈接,返回的頁面長這樣:

?

所謂json格式,其實就是在字典里夾字典或者列表,目前許多大數據都是這樣保存滴。所以在查詢的時候其實很方便,但是我在抽取信息的時候還是會用到正則表達式,因為會方便很多。

知道這些之后,剩下的就可以用python一個個有用信息抽取出來,組成一個新的Dataframe列表,以便之后保存為csv格式。

我們嘗試用requests打開上面json頁面的鏈接,并用json load解析。

這里我更改了start和count 的參數,比較方便對照原網頁來看信息是否一致。

可以看看soup返回的結果,它顯示了json里邊'results_html'返回的東西,因為前邊的內容我們已經不需要了,所有游戲信息都在這個鍵里邊。

接著我們回到那個json頁面看看我們想要的東西都藏在哪:

游戲名字藏在span的title class里:

?

出版日期藏在div的另一個class里:

?

同樣的,可以用上面的方法找到游戲的鏈接、ID,這里就不贅述了。

評分和打分人數藏在span標簽里,如果用字典查找的話會比較麻煩,所以我們稍后使用正則表達式將它倆提取出來:

?

不幸運的是,有些游戲因為還沒上架,所以沒有人評論,我們用正則表達式得到的信息是亂碼。所以我們用函數來防止出現亂碼的可能性:

如果看到這里的讀者覺得很輕松,那我便可以繼續往下述說,因為爬取價格比評論更加麻煩。但僅限于麻煩,并沒有很高大上的操作;而我相信我并不是用聰明的方法爬取到想要的結果,因為對于這個體量的數據再優化的代碼對于運行時間來說相差不大。反正結果都一樣,管它呢。

其實要找物品的最終價格(即免費游戲,打折后或未打折的游戲價格)非常簡單,因為他就藏在這里:

?

默認后邊兩位為小數點后兩位,所以我們直接把這串數字揪出來并除以100:

但我們如果就想知道他的原價,以便之后做分析該怎么辦呢?

先看一下steam排行榜上的價格有三種顯示方法:

?

第一種,帶有劃線價格的打折商品,在源代碼中長這樣:

?

第二種,免費的:

?

頭疼的是,免費的標識也有變體:

?

?

?

(連to的大小寫也有不一樣的……steam您用點心!)

不過Free還是老老實實在最前面,所以我們后邊只要找到Free就好啦。

第三種,原價顯示:

?

上面的圖片都是我在抽查的時候發現的規律與變形,為了避免后續幾千個游戲有“烏合之眾”,我在代碼里只查找這三種格式,如果有奇形怪狀的數據出現,直接一棍子打成“空值”:

定義完這些想要的數據之后,我們就開始跑循環了。

先把我們要的數據列命好名字:

接著我們以每個鏈接查詢100個游戲的步伐開始跑循環并將里邊的信息找出來,錄入上面的列表里:

我們在遍歷中每次訪問頁面、完成每次循環的時候都讓電腦打印一段字,以便出錯的時候能快速找出出錯的頁面。

接下來就將得到的數據塞進一個數據表里:

等待漫長的過程與欣賞成功的過程:

?

最后的數據集長這樣:

?

接下來只要保存為csv格式,就可以開始分析數據了。但這已經不是爬蟲文章的內容,所以不會往下繼續分析啦。

總結與反思

我發現final_price也就是一開始提取的最終價格中,會有高于原價的現象。

比如CS:GO的最終價格并不是0,是因為它有一個升級包:

?

前1000個游戲里總共有3個這樣的錯誤:

?

實況足球2020 是demo版免費,而想體驗完整游戲確實需要78港幣;

奇異人生1 是第一篇章免費,后邊的篇章需要23.8港幣。

這些代碼跑起來雖然快,但得到的信息依舊太少,如果要深入研究steam的數據還是需要有強大的耐心遍歷所有游戲鏈接吶。如果大家對Python感興趣的話,可以加一下我的微信哦:abb436574,免費領取一套學習資料和視頻課程喲~

這次的爬蟲經歷其實也發現了steam一些錄入大數據庫的時候的小差錯,比如前面所提到的免費標識竟然有3種變體,但他們可能覺得問題不大。

總結

以上是生活随笔為你收集整理的steam夏日促销用Python爬取排行榜上的游戏打折信息的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。