123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- # -*- codeing = utf-8 -*-
- # @Time : 2023/3/7 11:03
- # @Author : Clown
- # @File : 饿了么(同行门店榜单).py
- # @Software : PyCharm
- from time import sleep
- import requests
- import random
- import os
- import sys
- from datetime import datetime,timedelta
- import json
- import pymysql
- import pandas as pd
- def linkTomySql(host, passwd, db_name, port):
- '''连接至数据库返回【db】,v2新增local_infile=1 打开文件导入权限'''
- try:
- # 本地连接为:localhost 服务器连接为:124.222.188.59
- db = pymysql.connect (
- host=host, user="root",
- passwd=passwd,
- db=db_name,
- charset='utf8mb4',
- local_infile=1,
- port=port)
- # print ('\nconnect to mysql server 成功')
- # print ('---------------------------------------')
- except:
- print ("\ncould not connect to mysql server")
- db = "连接失败"
- return db
- def read_key_value_pair(db, brand_name, wm_plate, owner):
- '''按条件读取,数据库中all_key_table表里的key_value_pair字段中的值,以键值对的形式输出
- db:数据库,
- brand_name:品牌名,
- wm_plate:外卖平台MEITUAN或ELEME,
- owner:账号权限all或one
- '''
- cursor = db.cursor ()
- sql = f'SELECT key_value_pair FROM all_key_table WHERE brand_name = "{brand_name}" AND wm_plate = "{wm_plate}" AND owner = "{owner}";'
- cursor.execute (sql)
- pair = json.loads (cursor.fetchall ()[0][0])
- return pair
- def get_shops_info_to_list(db, brand_name, wm_plate, key_name):
- '''获取门店信息表【shops_info_to_list】中的信息,
- 并返回表单shops_info_df【shop_id,shop_name,update_datetime,info_for_script】
- db:数据库信息
- brand_name:品牌
- wm_plate:外卖平台
- key_name:关键信息字段名,如无填‘’,如有填对应键值对的key
- '''
- cursor = db.cursor ()
- if key_name == '':
- sql = f'SELECT shop_id,shop_name,update_datetime FROM shops_info_for_script WHERE brand_name = "{brand_name}" AND wm_plate = "{wm_plate}";'
- cursor.execute (sql)
- shops_info = cursor.fetchall ()
- shops_info_df = []
- for shop_info in shops_info:
- shop_info_dict = {'shop_id': shop_info[0],
- 'shop_name': shop_info[1]}
- shops_info_df.append (shop_info_dict)
- return shops_info_df
- else:
- sql = f'SELECT shop_id,shop_name,update_datetime,info_for_script -> "$.{key_name}" FROM shops_info_for_script WHERE brand_name = "{brand_name}" AND wm_plate = "{wm_plate}";'
- cursor.execute (sql)
- shops_info = cursor.fetchall ()
- shops_info_df = []
- for shop_info in shops_info:
- shop_info_dict = {'shop_id': shop_info[0],
- 'shop_name': shop_info[1],
- 'update_datetime': shop_info[2],
- f'{key_name}': shop_info[3]}
- shops_info_df.append (shop_info_dict)
- return shops_info_df
- def rankDecs(dict_in):
- return dict_in['同行门店月售top10']
- if __name__ == '__main__':
- host = '124.222.188.59'
- passwd = '111...Clown'
- db_name = 'zuzu_data'
- port = 63306
- db = linkTomySql(host, passwd, db_name, port)
- brand_name = '浆小白'
- owner = 'all'
- keys_dict = {'elm':'',
- 'elm_shops':'',
- 'mt':'',
- 'mt_shops':''}
- keys_dict['elm'] = read_key_value_pair(db, brand_name, 'ELEME', owner)
- keys_dict['elm_shops'] = get_shops_info_to_list(db,brand_name,'ELEME','')
- keys_dict['mt'] = read_key_value_pair (db, brand_name, 'MEITUAN', owner)
- keys_dict['mt_shops'] = get_shops_info_to_list (db, brand_name, 'MEITUAN', '')
- try:
- ksid = keys_dict['elm'] ['data']['session']['ksid']
- elm_shops = keys_dict['elm_shops']
- # elm_shops = [{'shop_id':173858169,'shop_name':''},{'shop_id':507932892,'shop_name':''}]
- script_name = os.path.basename(sys.argv[0])
- beginTime = (datetime.today () + timedelta (days=-1)).strftime ('%Y-%m-%d') # 2022-06-23
- endTime = (datetime.today () + timedelta (days=-1)).strftime ('%Y-%m-%d') # 2022-06-23
- beginTime_int = int ((datetime.today () + timedelta (days=-1)).strftime ('%Y%m%d')) # 20220623
- endTime_int = int ((datetime.today () + timedelta (days=-1)).strftime ('%Y%m%d')) # 20220623
- downloadPath = f'F:/cppc/cppc_数据表/3每日爬虫数据/饿了么同行门店榜单/{beginTime_int}饿了么同行门店榜单.xlsx'
- df_out = []
- for shop in elm_shops:
- shop_id = shop['shop_id']
- shop_name = shop['shop_name']
- # print(ksid,shop_id)
- # # print(shop_name)
- sleep (random.uniform (0.5, 1.5))
- try:
- url = 'https://app-api.shop.ele.me/stats/invoke/?method=OrderStatsService.getIndustryShop'
- cookie = 'cna=sk9kGMYYSlkCAd9o1MY603L4; ubt_ssid=z4djmg7vis0sclouzk4dag3r05s2jj30_2021-03-04; perf_ssid=or3iygctea950e0ujr03rhb1lxtke9ms_2021-03-07; nrksid=MZZMNDMTA1MjU4MzA1NTA3NDAxT1Y1aXdxVzhQ; xlly_s=1; shopId='+str(shop_id)+'; ksid='+ksid+'; AEM_TAG_ID_CATCH_DATA_ES00000044={%22tagId%22:%22ES00000044%22%2C%22data%22:%22%E5%BF%AB%E9%A4%90%E4%BE%BF%E5%BD%93%22%2C%22userId%22:173858169%2C%22time%22:1678159125600}; AEM_TAG_ID_CATCH_DATA_ES00000069={%22tagId%22:%22ES00000069%22%2C%22data%22:%22%E8%80%81%E5%BA%97%22%2C%22userId%22:173858169%2C%22time%22:1678159125601}; AEM_TAG_ID_CATCH_DATA_ES00000035={%22tagId%22:%22ES00000035%22%2C%22data%22:%22%E8%80%81%E5%BA%97-%E4%B8%80%E8%88%AC%E5%93%81%E8%B4%A8%22%2C%22userId%22:173858169%2C%22time%22:1678159125601}; AEM_TAG_ID_CATCH_DATA_ES00000021={%22tagId%22:%22ES00000021%22%2C%22data%22:%22%E5%85%A8%E5%9B%BD%E8%BF%9E%E9%94%81%22%2C%22userId%22:173858169%2C%22time%22:1678159125601}; AEM_TAG_ID_CATCH_DATA_ES00000019={%22tagId%22:%22ES00000019%22%2C%22data%22:%22%E4%B8%8A%E6%B5%B7%22%2C%22userId%22:173858169%2C%22time%22:1678159125601}; tfstk=cptRBeO4vjcoG8ch0g308V_N3JOdaSGdG813vhyNM1b04jEbDsxkjhdxD46C__HA.; l=fBOyel_7jbqeT6mSBO5Ihurza779eIOb8oVzaNbMiIEGa6gCNFDj5OCsaGqeldtjgTCxnetrl5ZFzd3HkeUdaxDDBec6LmhInxv9xESPN; isg=BOHh1uRzIbZCUYn7wQVzgEex8K37jlWAM3q0MUO37-hVqgB8i9ilUBWoDN4sZu24'
- headers = {
- 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36',
- 'content-type': 'application/json',
- 'Cookie':cookie}
- params = {"id":"89F28423BA7B4882900E677683EA56E7|1678159334618",
- "metas":{"appName":"melody",
- "appVersion":"4.4.0",
- "ksid":ksid,
- "shopId":shop_id},
- "service":"OrderStatsService",
- "method":"getIndustryShop",
- "params":{"shopId":shop_id},"ncp":"2.0.0"}
- resp = requests.post(url,headers=headers,json=params).json()
- recentOrderNum_list = []
- for shop_rank_info in resp['result']:
- shop_dict = {'门店id':shop_id,
- '门店名称':shop_name,
- '商圈同行门店id':shop_rank_info['mShopId'],
- '商圈同行门店名称':shop_rank_info['mShopName'],
- '同行门店月售top10':shop_rank_info['recentOrderNum'],
- '同行门店评分':shop_rank_info['score']}
- recentOrderNum_list.append(shop_dict)
- recentOrderNum_list.sort(key=rankDecs,reverse=True)
- df_out.extend(recentOrderNum_list[:10])
- code = '成功'
- except Exception as e:
- shop_dict = {'门店id': shop_id,
- '门店名称': shop_name,
- '商圈同行门店id': '无数据',
- '商圈同行门店名称': '无数据',
- '同行门店月售top10': '无数据',
- '同行门店评分': '无数据'}
- df_out.append(shop_dict)
- code = e
- print(script_name,shop_id,shop_name,code)
- df_out = pd.DataFrame(df_out)
- df_out.to_excel(downloadPath)
- except Exception as e:
- print(e)
|