源:@必胜客中国
关于媒体报道的北京必胜客和谐广场店和魏公村店的相关问题,我公司高度重视,已立即对上述两家餐厅进行闭店调查。感谢社会对我们的监督。
月7日,必胜客在北京升级改造了一家智慧餐厅,包含了可以“测试骨密度、肌重”等健康指标的智能镜子,以及“可以发送弹幕”的互动屏幕等。
3月8日,我们走访了这家位于五道口的餐厅。据说之所以选择在五道口,是因为这里被誉为“宇宙中心”,科技公司多集中在这里,包括为必胜客提供科技设备的联想集团。
“智慧餐厅”四个字闪烁在餐厅正门的右上角,盘旋至二楼的用餐区,这里的装修风格增加了不少金属元素,二楼入口放置了一面联想智镜,站立于镜子下方的体重秤上即可进行全身扫描,在屏幕上看到自己的皮肤水分、骨密度、体重、蛋白、基础代谢率等各项身体指标。
镜子旁边的提示说明也告诉顾客如何与镜子互动,在界面新闻测评的2个小时中,多数用餐群体中,儿童更喜欢关注这面镜子并愿意和机器互动。
进入点餐区,如果你的座位正好在开放式厨房正对面的两条长桌上,店员会主动给顾客打开桌子上方的投影仪,播放一个大约1.5分钟的4D动画视频,内容是制作披萨的过程,这会让你的等餐时间不是那么乏味。店员也会询问看一遍是否过瘾,如果不过瘾还可以再播放一次。
此外,消费者还可以通过扫描二维码在入口处的一块大屏幕上发送弹幕,这尤其适合聚餐或者派对,也会有学生就因此来询问店员包场的事宜,不过在界面新闻记者测评时段,这块大屏幕因网络问题并不能使用。
此外,这家智慧餐厅的另一个小瑕疵是,其宣传的“可以通过手机、平板电脑进行移动自助点餐”等更高效点餐功能并未体验到,实际的情况是,仍然由店员拿出纸质菜单让消费者点餐。对此,必胜客向界面新闻解释,最近几天自助点餐系统正在进行维护无法正常使用。
其实这并不是必胜客第一家科技餐厅。去年冬天,必胜客在上海尝试着开了一家名为“PH+”的概念餐厅,店内的高科技元素包括:可以为顾客完成领位服务的机器人,还有一个面积达65寸的显示屏,顾客可以通过这个屏幕完成菜品的DIY选择。比如,像使用iPAD一样的多点触摸功能,去改变披萨的大小,通过一系列的手指滑动,选择配料等等。
说起科技或者智慧餐厅,多数餐厅更多关注与消费者的互动,去年1月,麦当劳也将王府井门店升级为智慧概念餐厅,除了自助点餐台之外,餐厅内还设有智能灯光调节系统,可根据时段调节光线,二楼设有独立派对房,可容纳70个人的派对,且提供微信照片上传和打印等免费服务,以及开设了首个“线下游戏体验空间”。
<>我刚接触 Python 时,我已经被 Python 深深所吸引。Python 吸引我的地方不仅仅能用其编写网络爬虫,而且能用于数据分析。我能将大量的数据中以图形化方式呈现出来,更加直观的解读数据。
数据分析的前提是有数据可分析。如果没有数据怎么办?一是可以去一些数据网站下载相关的数据,不过数据内容可能不是自己想要的。二是自己爬取一些网站数据。
今天,我就爬取全国各地所有的必胜客餐厅信息,以便后续做数据分析。
01抓取目标
我们要爬取的目标是必胜客中国。打开必胜客中国首页,进入“餐厅查询”页面。
< class="pgc-img">>我们要爬取的数据内容有城市、餐厅名字、餐厅地址以及餐厅联系电话。因为我看到页面中有地图,所以页面一定有餐厅地址的经纬度。因此,餐厅的经纬度也是我们需要爬取的数据。
至于全国有必胜客餐厅的城市列表,我们可以通过页面的“切换城市”获取。
< class="pgc-img">>当然在学习Python的道路上肯定会困难,没有好的学习资料,怎么去学习呢?
所以小编准备了一份零基础入门Python的学习资料。关注,转发,私信“007”即可领取!
02分析目页面
在编写爬虫程序之前,我都是先对页面进行简单分析,然后指定爬取思路。而且对页面结构进行分析往往会有一些意想不到的收获。
我们使用浏览器的开发者工具对页面结构进行简单分析。
< class="pgc-img">>我们在 StoreList 页面中能找到我们所需的数据。这个能确定数据提取的 Xpath 语法。
StoreList 页面的 Response 内容比较长。我们先不着急关闭页面,往下看看,找找看是否有其他可利用的内容。最后,我们找到调用获取餐厅列表信息的 Javascript 函数代码。
< class="pgc-img">>我们接着搜索下GetStoreList函数,看看浏览器如何获取餐厅列表信息的。
< class="pgc-img">>从代码中,我们可以了解到页面使用 Ajax 方式来获取数据。页面以 POST 方式请求地址http://www.pizzahut.com.cn/StoreList/Index。同时,请求还携带参数 pageIndex 和 pageSize。
03爬取思路
经过一番页面结构分析之后,我们指定爬取思路。首先,我们先获取城市信息。然后将其作为参数,构建 HTTP 请求访问必胜客服务器来获取当前城市中所有餐厅数据。
为了方便数据爬取,我将所有城市全部写入到 cities.txt 中。等要爬取数据时,我们再从文件中读取城市信息。
爬取思路看起来没有错,但是还是有个难题没有搞定。我们每次打开必胜客的官网,页面每次都会自动定位到我们所在的城市。如果无法破解城市定位问题,我们只能抓取一个城市数据。
于是乎,我们再次浏览首页,看看能不能找到一些可用的信息。最终,我们发现页面的 cookies 中有个 iplocation 字段。我将其进行 Url 解码,得到 深圳|0|0 这样的信息。
< class="pgc-img">>看到这信息,我恍然大悟。原来必胜客网站根据我们的 IP 地址来设置初始城市信息。如果我们能伪造出 iplocation 字段信息,那就可以随便修改城市了。
04代码实现
第一步是从文件中读取城市信息。
# 全国有必胜客餐厅的城市, 我将城市放到文件中, 一共 380 个城市 cities=[] def get_cities(): """ 从文件中获取城市 """ file_name='cities.txt' with open(file_name, 'r', encoding='UTF-8-sig') as file: for line in file: city=line.replace(' ', '') cities.append(city)
第二步是依次遍历 cities 列表,将每个城市作为参数,构造 cookies 的 iplocation 字段。
# 依次遍历所有城市的餐厅 for city in cities: restaurants=get_stores(city, count) results[city]=restaurants count +=1 time.sleep(2)
然后,我们再以 POST 方式携带 cookie 去请求必胜客服务器。最后再对返回页面数据进行提取。
def get_stores(city, count): """ 根据城市获取餐厅信息 """ session=requests.Session() # 对【城市|0|0】进行 Url 编码 city_urlencode=quote(city + '|0|0') # 用来存储首页的 cookies cookies=requests.cookies.RequestscookieJar() headers={ 'User-agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.3964.2 Safari/537.36', 'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', 'Host': 'www.pizzahut.com.cn', 'Cache-Control': 'max-age=0', 'Connection': 'keep-alive', } print('============第', count, '个城市:', city, '============') resp_from_index=session.get('http://www.pizzahut.com.cn/', headers=headers) # print(resp_from_index.cookies) # 然后将原来 cookies 的 iplocation 字段,设置自己想要抓取城市。 cookies.set('AlteonP', resp_from_index.cookies['AlteonP'], domain='www.pizzahut.com.cn') cookies.set('iplocation', city_urlencode, domain='www.pizzahut.com.cn') # print(cookies) page=1 restaurants=[] while True: data={ 'pageIndex': page, 'pageSize': "50", } response=session.post('http://www.pizzahut.com.cn/StoreList/Index', headers=headers, data=data, cookies=cookies) html=etree.HTML(response.text) # 获取餐厅列表所在的 标签 s=html.xpath("//[@class='re_RNew']") temp_items=[] for in s: item={} content=.xpath('./@onclick')[0] # ClickStore('22.538912,114.09803|城市广场|深南中路中信城市广场二楼|0755-25942012','GZH519') # 过滤掉括号和后面的内容 content=content.split('('')[1].split(')')[0].split('','')[0] if len(content.split('|'))==4: item['coordinate']=content.split('|')[0] item['restaurant_name']=content.split('|')[1] + '餐厅' item['address']=content.split('|')[2] item['phone']=content.split('|')[3] else: item['restaurant_name']=content.split('|')[0] + '餐厅' item['address']=content.split('|')[1] item['phone']=content.split('|')[2] print(item) temp_items.append(item) if not temp_items: break restaurants +=temp_items page +=1 time.sleep(5) return restaurants
第三步是将城市以及城市所有餐厅信息等数据写到 Json 文件中。
with open('results.json', 'w', encoding='UTF-8') as file: file.write(json.dumps(results, indent=4, ensure_ascii=False))
05爬取结果
程序运行完之后, 就会在当前目录下生成一个名为「results.json」文件。完整代码请见GitHub:
https://github.com/monkey-soft/SchweizerMesser/tree/master/Pizzahut
< class="pgc-img">>关于作者:极客猴,热衷于 Python,目前擅长利用 Python 制作网络爬虫以及 Django 框架。
>