前言
@Author:By Runsen
今天肚子饿了美团外卖数据采集python,我突然想点一个外卖,最近迷上了香辣鸡腿堡,打开美团外卖竟然发现周围没有店家, 有的店家离我非常远,气得我不行了,送过来要2个小时,说好的美团外卖,送啥都快。
于是,我不得不跑去支付宝下的饿了么去下单,发现半小时就可以给我送到了,神速。吃上香辣鸡腿堡,顺便点了薯条和可乐,真香美团外卖数据采集python!
突然间,做了一个小梦,梦到了负责北京的美团老板私信我,说北京各区卖汉堡的店家分布,是不是有的区竟然买不到汉堡,在哪里,我得赶紧找店家。确实如此,有的偏远的地方还真的没有叫外汉堡的可怜。
那么,今天教大家爬取美团外卖并数据分析展示,效果如下图所示。
爬虫
于是,我来到了美团,点击了北京的地方,搜一些汉堡。
爬取的网址是https://bj.meituan.com/s/%E6%B1%89%E5%A0%A1/
瞬间有多少卖汉堡的店家出来, 比如,肯德基,汉堡王,华莱士·炸鸡汉堡,麦堡王炸鸡汉堡。
专业的我,看了下页面,点击了换页,url没有变化,八成就是一个ajax发起了。
二话不话的我,赶紧去找这个JSON数据源,费劲心思,终于找到了。
我突然发现,我怎么这么蠢,搜一搜不就可以了吗美团外卖数据采集python?于是,找了一个店家的地方叫:朝阳区三里屯路三里屯北街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 1cookie会失效'''import jsonimport csvimport requestsdef 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: passif __name__=='__main__': get_data(32)数据分析代码'''@Author: Runsen@微信公众号: 润森笔记@博客: https://blog.csdn.net/weixin_44510615@Date: 2020/4/18''''''处理数据'''# 读取数据import pandas as pdfrom collections import Counterfrom 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].indexdata.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 pairdef 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)
添加上方▲技术, 在线咨询
复制微信号
声明
一、本站原创内容,其版权属于本网站所有。其他媒体、网站或个人转载使用时不得进行商业性的原版原式的转载,也不得歪曲和篡改本网站所发布的内容。如转载须注明文章来源。
二、本网站转载其它媒体作品的目的在于传递更多信息,并不代表本网站赞同其观点和对其真实性负责;如侵犯你的权益请告诉我们立即删除;其他媒体、网站或个人转载使用自负法律责任。
发表评论
2022-06-15 01:17:26回复