发布时间:2022-05-27 15:29:37 发布人:
@Author:By Runsen
今天肚子饿了,我突然想点一个外卖,最近迷上了香辣鸡腿堡,打开美团外卖竟然发现周围没有店家, 有的店家离我非常远,气得我不行了,送过来要2个小时,说好的美团外卖,送啥都快。
于是,我不得不跑去支付宝下的饿了么去下单,发现半小时就可以给我送到了,神速。吃上香辣鸡腿堡,顺便点了薯条和可乐,真香!
突然间,做了一个小梦,梦到了负责北京的美团老板私信我,说北京各区卖汉堡的店家分布,是不是有的区竟然买不到汉堡,在哪里,我得赶紧找店家。确实如此,有的偏远的地方还真的没有叫外汉堡的可怜。
那么,今天教大家爬取美团外卖并数据分析展示,效果如下图所示。
于是,我来到了美团,点击了北京的地方,搜一些汉堡。
爬取的网址是https://bj.meituan.com/s/%E6%B1%89%E5%A0%A1/
瞬间有多少卖汉堡的店家出来, 比如,肯德基,汉堡王,华莱士·炸鸡汉堡,麦堡王炸鸡汉堡。
专业的我,看了下页面,点击了换页,url没有变化,八成就是一个ajax发起了。
二话不话的我,赶紧去找这个JSON数据源,费劲心思,终于找到了。
我突然发现,我怎么这么蠢,搜一搜不就可以了吗?于是,找了一个店家的地方叫:朝阳区三里屯路三里屯北街81号,我也不知道哪里,一下子就找到数据了。
数据找到了,就赶紧把发送了请求找出来,简单的发现了请求就是这个https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=67048e20775440d296e7.1587173677.1.0.0&userid=1493835176&limit=32&offset=32&cateId=-1&q=%E6%B1%89%E5%A0%A1
找了几次发现offset参数是变的,是32*页数变化的。哈哈,原来如此,菜鸟的我赶紧撸了下代码,运行结果老是JSONDecodeError: Expecting value: line 1 column 1,这是因为没有返回json数据。
菜鸟的我情不自禁的加上了User-Agent,Cookie,Referer。反正在请求url上的参数全部加上,终于,爬取成功了,并保存了csv格式的数据。
这里,我发现美团外卖的Cookie具有时效式,害得我差点去破解Cookie的加密参数和规则。成功爬取300多数据的店家,就赶紧跑路。
下面,就是我爬取的300多条在北京卖汉堡的店铺,好像也就300多家。
竟然发现了有的店家人均消费是0元的,我说你不做汉堡挣钱,挂一个空店铺干嘛呢?
于是,我除去了人均消费等于0的6间店铺,决定把北京各区卖汉堡的店家通过可视化的方式展现出来。
果然在政治中心的海淀区,朝阳区的卖汉堡的店家真的多,北京偏远的地区,如门头沟区,延庆区,怀柔区卖汉堡真的少。老板,你赶紧去在门头沟区,延庆区,怀柔区大力招商。
把北京各区卖汉堡的店家的人均评分人均消费,也通过可视化的方式展现出来。
人均评分
人均消费
终于搞定了,发现北京叫一个汉堡就是30多块钱,和我这里比差不多。
'''
@Author: Runsen
@微信公众号: 润森笔记
@博客: https://blog.csdn.net/weixin_44510615
@Date: 2020/4/17
'''
'''
JSONDecodeError: Expecting value: line 1 column 1
cookie会失效
'''
import json
import csv
import requests
def get_data(page):
with open('meita.csv', 'a',newline='') as f:
ff = csv.writer(f)
ff.writerow(["店铺名", "地址", "人均评分","人均消费"])
for i in range(int(page)):
url = 'https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=67048e20775440d296e7.1587173677.1.0.0&userid=1493835176&limit=32&offset={}&cateId=-1&q=%E6%B1%89%E5%A0%A1'.format(32*i)
headers = {
"Cookie": "_lxsdk_cuid=1718267fbfec8-0d625514f0d01e-67e1b3f-1fa400-1718267fbfec8; _hc.v=14398722-3b0d-1aff-76e8-8d7ec87dbf6d.1587115174; t_lxid=171876fb4da14-09ef3c1405fc9e-67e1b3f-1fa400-171876fb4dbc1-tid; mtcdn=K; uuid=67048e20775440d296e7.1587173677.1.0.0; ci=1; rvct=1%2C91; _lx_utm=utm_source%3DBaidu%26utm_medium%3Dorganic; lt=4V8SBVb4xJAHZl-U_euIyTMbozoAAAAAdwoAAE2M1UJQUwU7qqZtZ6xy7zLa5p6hqvDETx32HoG_UWMfEVE4F3pqU5cIQwKcwEFdig; u=1493835176; n=tIJ111616537; token2=4V8SBVb4xJAHZl-U_euIyTMbozoAAAAAdwoAAE2M1UJQUwU7qqZtZ6xy7zLa5p6hqvDETx32HoG_UWMfEVE4F3pqU5cIQwKcwEFdig; unc=tIJ111616537; __mta=140883597.1587173692374.1587175883595.1587176003433.6; firstTime=1587176043162; _lxsdk_s=1718aec54f2-914-421-159%7C%7C771",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"
}
r = requests.get(url, headers=headers)
print(r)
if r:
r.encoding = 'utf-8'
data = json.loads(r.text)
print(data)
if data['data']['searchResult']:
for j in data['data']['searchResult']:
title = j['title']
address = j['address']
avgscore = str(j['avgscore'])
avgprice = str(j['avgprice'])
ff.writerow([title,address,avgscore,avgprice])
print("正在写入{},{},{},{}". format(title, address, avgscore,avgprice))
else:
pass
if __name__ == '__main__':
get_data(32)
'''
@Author: Runsen
@微信公众号: 润森笔记
@博客: https://blog.csdn.net/weixin_44510615
@Date: 2020/4/18
'''
'''
处理数据
'''
# 读取数据
import pandas as pd
from collections import Counter
from pyecharts.charts import Map # 地图
from pyecharts import options as opts # 初始化配置项
data = pd.read_csv("meituan.csv",encoding='gbk')
print(data.columns)
print(data.info())
# 去除人均消费0的餐馆
print(data[data['人均消费'] == 0])
indexs = data[data['人均消费'] == 0].index
data.drop(index=indexs,inplace=True,axis=0)
print(data.info())
# 提取区域处理
data['location'] = data['地址'].str[:3]
def get_pair(data):
pair = []
for i in range(len(data)):
pair_tuple = (data.index[i], int(data[i]))
pair.append(pair_tuple)
return pair
def plot(pair,title,max):
map = Map(init_opts=opts.InitOpts(width='900px', height='800px'))
map.add(series_name='城市', data_pair=pair, maptype='北京')
map.set_global_opts(title_opts=opts.TitleOpts(title=title), visualmap_opts=opts.VisualMapOpts(max_=max))
map.render('{}.html'.format(title))
if __name__ == '__main__':
locat_list = data['location'].tolist()
mydict = Counter(locat_list)
hanbao_nums = pd.Series(mydict)
nums_pair = get_pair(hanbao_nums)
print(nums_pair)
print(type(nums_pair))
plot(nums_pair,"北京汉堡的外卖店的各区分布的数量",40)
avgscore = data.pivot(columns='location', values='人均评分').mean(axis=0)
avgscore_pair = get_pair(avgscore)
plot(avgscore_pair,"北京汉堡的外卖店的人均评分",5)
avgprice = data.pivot(columns='location', values='人均消费').mean(axis=0)
avgprice_pair = get_pair(avgprice)
plot(avgprice_pair,"北京汉堡的外卖店的人均消费",35)
我对项目很感兴趣,请尽快寄资料给我!
请问我所在的地区有加盟商了吗?
我想详细了解加盟流程!
加盟该项目能得到哪些支持?
我想加盟请电话联系我!
加盟所需要的费用有哪些?
项目很好,请尽快联系我详谈!
发布
电话
微博
公众号
回顶部