您好,登錄后才能下訂單哦!
本篇內容主要講解“怎么用Python顯示點過的外賣”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“怎么用Python顯示點過的外賣”吧!
通過手機&驗證碼登錄自己的餓了么賬號,成功之后會返回當前用戶的user_id 和 登錄Cookie。這兩個信息為后續的請求提供必要的信息。
一開始訪問訂單,是這樣的請求
h6.ele.me/restapi/bos/v2/users/26803312/orders?limit=8&offset=0
h6.ele.me/restapi/bos/v2/users/26803312/orders?limit=8&offset=8
h6.ele.me/restapi/bos/v2/users/26803312/orders?limit=8&offset=16
當繼續下拉,出現"查看三個月前的外賣訂單"按鈕時,請求是這樣的
h6.ele.me/restapi/bos/v2/users/26803312/old_orders?limit=8&from_time=
h6.ele.me/restapi/bos/v2/users/26803312/old_orders?limit=8&from_time=1557718107
from_time的值在上次請求的響應中可以看到:
獲取訂單部分代碼如下所示:
""" 獲取近3個月訂單 """ def get_new_order(): num = 0 while 1: # 偏移量 offset = num * limit response = requests.get(url + f'?limit={limit}&offset={offset}', headers=headers, verify=False) resp_json = response.json() insert_mongo(resp_json) # 當響應訂單數小于8時 跳出循環 if len(resp_json) < 8: print('====================') break num += 1 """ 歷史訂單 """ def history_order(): from_time = '' while 1: response = requests.get(old_url + f'?limit={limit}&from_time={from_time}', headers=headers, verify=False) resp_json = response.json() from_time = resp_json['from_time'] orders = resp_json['orders'] # 經過測試,最后一個訂單時,會在請求一次 響應為空 if not orders: break insert_mongo(orders)
運行之后發現,這一年多的時間,光外賣竟然花費了1W多一點。爬取的數據可以選擇將數據保存在csv文件中,也可以選擇Mongod。這里我是插入到了MongoDB中。
def insert_mongo(resp_json): if not resp_json: return for i in resp_json: # 菜品 foods_group = i['basket']['group'][0] for j in foods_group: j['name'] = clean_data(j['name']) with open('foods_name_banxia.txt', 'a+') as f: f.write(j['name'] + '\n') # 將菜品寫入文件,方便處理 # 配送費 deliver_price = 0 if 'deliver_fee' in i['basket'].keys(): deliver_price = i['basket']['deliver_fee']['price'] # 計算總花費 global total total += i['total_amount'] # 餐館名 restaurant_name = clean_data(i['restaurant_name']) with open('restaurant_name_banxia.txt', 'a+') as f: f.write(restaurant_name + '\n') # 記錄餐館名 clo.insert_one({ # 餐館名 'restaurant_name': restaurant_name, # 訂單時間 formatted_created_at也可以取,但是近期的會顯示xx小時之前 'created_timestamp': time_convert(i['created_timestamp']), # 價格 'total_amount': i['total_amount'], 'foods_group': foods_group, 'deliver_price': deliver_price })
在查看數據過程中,發現有的菜品和店鋪名后面都有括號、或者方括號等特殊字符,里面的信息對我們來說也沒有什么價值。可以簡單的進行處理一下。
import re def clean_data(data): a = re.sub("\\(.*?\\)|\\(.*?\\)|\\[.*?\\]|\\【.*?\\】|[A-Za-z0-9\@\\!\/]", "", data) a = a.replace('盒', '').replace('克', '').replace('個', '')\ .replace('大份', '').replace('小份', '').replace('瓶', '').replace('組', '').replace(' ','') return a
這樣,我們就將訂單中的信息存在了數據庫中。為了方便統計我將每個訂單的菜品、以及餐館名保存在了txt文件中。
可以通過wordcloud將餐品進行一個簡單的可視化。
from random import randint from matplotlib import pyplot as plt from wordcloud import WordCloud def random_color(word=None, font_size=None, position=None, orientation=None, font_path=None, random_state=None): """Random Color func""" r = randint(30, 255) g = randint(30, 180) b = int(100.0 * float(randint(60, 120)) / 255.0) return "rgb({:.0f}, {:.0f}, {:.0f})".format(r, g, b) content = open('foods_name.txt', encoding='utf-8').read() wordcloud = WordCloud(background_color="white", width=1000, height=600, max_font_size=50, font_path='/System/Library/Fonts/PingFang.ttc', # 需要根據實際操作系統更換路徑 color_func=random_color).generate(content) plt.imshow(wordcloud) plt.axis("off") plt.savefig('ele_wordcloud.png', format='png', dpi=200)
結果如下,有沒有口味一樣的同學呢?
同樣我們可以在終端通過sort命令去常光顧的餐館進行統計。
sort -n 按照數值大小排序 升序
sort -r 降序排列
uniq -c 去重和統計
head -5 展示前5條
cat mao_out.txt | sort | uniq -c | sort -rg | head -5
結果如下 去的最多的是貢貢米線和張亮麻辣燙,統計范圍內均光顧了14次。
Python3XXXAir:$ cat restaurant_name.txt |sort|uniq -c| sort -rg| head -5 14 貢貢米線 14 張亮麻辣燙 13 京客隆 11 沁香緣家常菜 11 小巷麻辣香鍋
可以通過matplotlib去統計一下每次定外賣的價格,并展示出來。
import pymongo import matplotlib.pyplot as plt client = pymongo.MongoClient('mongodb://localhost:27017/') db = client['ele'] clo = db['info_banxia'] result = clo.find({}) y = [i['total_amount'] for i in result] x = [i for i in range(len(y))] plt.ylabel("The unit price") plt.xlabel("Times") plt.plot(x, y) plt.show()
結果圖:
可以看出,大部分價格在20 ~ 40 之間, 因為有時候為了滿減,大部分都是跟同事朋友一起拼單。偶爾超過這個范圍是買的水果、藥等一些商品。
從這些數據中,我們同樣得出,哪個月定外賣次數最為頻繁。
# 該月定外賣次數 count = [] for i in data: ele_count = clo.count({'created_timestamp': re.compile(i)}) count.append(ele_count) plt.scatter(data, count) plt.xticks(rotation=45) plt.show()
可以看出 18年3月定了22次外賣是最多的一次。11月份的時候定外賣次數最少。
到此,相信大家對“怎么用Python顯示點過的外賣”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。