前段時間關於瑞幸財務造假被退市新聞鬧的沸沸揚揚,而瑞幸此前宣傳中有一點引起了我的注意: 在國內瑞幸門店超過星巴克 ,那今天我們來用Python驗證一下吧!
如果不借助他人的數據,你能自己算出瑞幸咖啡和星巴克咖啡其各自的門店數量嗎?
讓你自己算出一個精確的值,你會使用什麼方法進行計算一線城市門店數量?
難度高一點點,你怎麼樣才能知道二線城市的門店總數,甚至是全國的門店數量?
1.下載requests庫
開始之前,你要確保Python和pip已經成功安裝在電腦上噢。
在終端輸入以下命令安裝我們所需要的依賴模塊:
pip install requests
看到 Successfully installed xxx 則說明安裝成功。
2.如何獲取門店數?
怎麼樣,文章開頭提出的問題你想到答案了嗎?
其實很簡單,那就是調用地圖的接口進行門店搜索。通過這個方法,我們不僅可以算出門店的數量,還能得到每個門店的對應位置,並且可以用來做後續的數據分析:
所以現在問題就轉化爲找到有提供搜索接口的地圖供應商,而且這個接口得是免費的,因此我找了騰訊地圖的接口:
https://lbs.qq.com/
你只需要上去註冊賬號,申請Key即可調用相關的接口,申請完了記得開webserviceAPI,選擇簽名校驗 的形式調用接口:
3.爬取數據
爲了使用API,我們得先初始化請求鏈接及其所需要的參數:
Key是在你申請API權限的時候就會分配給你的,而sk是在你選擇 簽名校驗 的形式調用接口時分配給你的。
那麼我們如何用這兩個數據請求接口呢?請看下面這個函數:
首先是將初始化的請求鏈接拼接起來,然後由於需要簽名校驗,因此我們得如下進行操作:
GET請求分爲:域名,請求路徑和參數三個部分,用於簽名計算的有:
請求路徑:/ws/place/v1/search?
請求參數:boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20
注意{}是待填充的
1. 首先對參數進行排序:按參數名升序(本例結果爲 boundary 在前,key在後,如果第一個字母相同,要依據第二個字母升序):
boundary=region({},0)&key={}(....後面略)
2. 簽名計算(sig):
請求路徑+”?”+請求參數+SK進行拼接,並計算拼接後字符串md5值,即爲簽名(sig):
要求:請求參數必須是未進行任何編碼(如urlencode)的原始數據
md5(" /ws/place/v1/search?boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20 你的SK ")
計算得到結果類似爲:22dxxxxxxxxxxxxxx2b0bcc0e50
3. 生成最終請求:將計算得到的簽名sig,放到請求中(參數名即爲:sig):
https://apis.map.qq.com/ws/place/v1/search? boundary=region({},0)&key={}&keyword={} &page_index={}&page_size=20&sig= 22dxxxxxxxxxxxxxx2b0bcc0e50
注意:計算 sig 要使用原始參數值,不要進行任何編碼,但最終發送時的參數,是需要時行url編碼的
最後拿到返回的值,裏面帶有所有結果的地理位置及結果的數量。
2.2 按地點返回結果
這一部分其實很簡單,就是調用2.1的函數,然後實現分頁保存變量,最後輸出門店數量,返回數據。
計算一線城市的結果如下:
F:\push\20200315>python scrapy.py
瑞幸咖啡 北京 門店總數爲:492
瑞幸咖啡 上海 門店總數爲:581
瑞幸咖啡 廣州 門店總數爲:301
瑞幸咖啡 深圳 門店總數爲:260
4.彙總結果並保存
接下來我們需要彙總2.2計算到的每個城市的數據,保存到json文件,並計算總數。
最終可以獲得一個 瑞幸咖啡.json 的文件,裏面存有每個城市的咖啡店精確位置,並輸出一個總數,這樣調用即可:
F:\push\20200315>python scrapy.py
瑞幸咖啡 北京 門店總數爲:492
瑞幸咖啡 上海 門店總數爲:581
瑞幸咖啡 廣州 門店總數爲:301
瑞幸咖啡 深圳 門店總數爲:260
瑞幸咖啡 一線城市門店總數爲:1634
星巴克 北京 門店總數爲:380
星巴克 上海 門店總數爲:797
星巴克 廣州 門店總數爲:209
星巴克 深圳 門店總數爲:201
星巴克 一線城市門店總數爲:1587
看來瑞幸咖啡一線城市裏的門店數量爲:1634 已經超過星巴克的1587 ,不愧是割資本主義國家韭菜,造福中國老百姓的企業啊!
5.擴展
就像文章開頭所提到的,如果你需要算出每個城市的咖啡店數量其實也很簡單,咱可以調用下面這個接口請求騰訊地圖的所有行政區數據,獲得所有城市的名稱:
https://apis.map.qq.com/ws/district/v1/list
不過我已經dump了一個,文末給出數據鏈接。
使用這一個,你只需要讀取該csv文件提取所有城市名,然後放入cities變量中進行計算,如下代碼所示:
請注意一些特殊情況,比如說那個城市沒有數據的時候,接口可能不會返回date數據,這時候要用字典的get方法進行處理:
# pois = res.json()['data']
pois = res.json().get('data', [])
值得提醒你的是,如果你要計算全國的數據的話,這個方法並不可靠,因爲無法避免山寨店的存在,山寨店一樣也會被記入到騰訊地圖中,而一線城市的監管嚴格,比較少出現山寨店的情況,因此可以用這個方法計算。
如果想統計全國的店鋪數還需要添加一些篩選、清晰手段,這些就留給大家自己思考吧!
源代碼和數據鏈接:
加python學習qq羣:775690737 送python零基礎入門學習資料+99個源碼