|瑞幸真的比星巴克的門店還要多?Python爬蟲後真相原來是這樣.....

前段時間關於瑞幸財務造假被退市新聞鬧的沸沸揚揚,而瑞幸此前宣傳中有一點引起了我的注意: 在國內瑞幸門店超過星巴克 ,那今天我們來用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個源碼

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章