用python抓取饿了么无证店铺

作者: 麦口胡 | 来源:发表于2018-02-09 15:37 被阅读195次

一、前言

饿了么平台上很多店铺都无营业执照,只能借用他人的营业执照上传开店。那就想看看附近有多少这样无证共用营业执照的店铺。

先看一下抓取的截图,竟然有这么多店没有营业执照。


mongodb3.png

在饿了么上显示的地址都是营业执照的地址,有时候当你点餐会看到送餐员取餐的地址不是营业执照标注的地址。
通常这种店铺都是无营业执照的,因为店铺老板都可以在后台自行设置取餐地址,所以用户在点餐时候看到不一定是真实地址,在下单后才能具体取餐地址。
还有一种店铺是自行配送的,下单后根本就看不到取餐地址,这种店铺更可怕,根本就不知道是哪个黑作坊加工的食品。

二、运行环境

  • python3
  • pymongo
  • requests

三、分析

首先访问饿了么主页,输入想搜寻的区域,页面随即返回附近区域店铺。

address.png

页面浏览器地址如下:
https://www.ele.me/place/wtw39y8614v4?latitude=31.237236&longitude=121.36636

打开浏览器开发者工具,分析需要抓取的数据,接着用requests抓取该页面地址,使用BeautifulSoup解析数据,竟然返回空值数据。
再次查看页面信息,向下滚动页面,发现XHR异步加载类型中有返回JSON格式数据。如下图所示:


F12.png

后台用json格式传递数据,前台浏览器用javascript展示json格式的方法,是目前比较通用的做法。后台提供的json格式的api接口可以供网页、手机调用,属于restful风格。这样只需要开发和维护一套后台,简化系统架构。
虽然用requests抓取不到页面,但json格式可以更方便的采集我们需要数据。

1、抓取数据

分析JSON页面地址:
https://www.ele.me/restapi/shopping/restaurants?extras[]=activities&geohash=wtw39y8614v4&latitude=31.237236&limit=24&longitude=121.36636&offset=24&terminal=web

其中参数:
1、longitude,latitude采用的高德坐标系对应搜索区域的经纬度
2、limit=24 每次限制返回上限24个店铺;设置再多后台最多返回30个
3、offset=24 每次返回的店铺数量,24个数量级增加,比如页面继续往下翻offset=48,72……
用循环增加offset的偏移量,就可以得到更多的店铺数据。

此页面我们需要采集name ,phone, address 即商户名称,电话,营业地址三个数据即可。一个页面可以采集24个商家数据,json数据如下图:


detail.png

代码如下:

import requests
import json
url='https://www.ele.me/restapi/shopping/restaurants?extras[]=activities&geohash=wtw39y8614v4&latitude=31.237236&limit=24&longitude=121.36636&offset=24&terminal=web'
r=requests.get(url).text
d=json.loads(r)
for v in d:
    print (v['name'],v['phone'],v['address'])

返回结果如下:


single_page.png

设置offset=48,期望得到更多商家,返回结果如下:

{'message': '登陆后查看更多商家', 'name': 'UNAUTHORIZED_MORE_RESTAURANTS_ERROR'}

这是因为后台设置了需要登录才能访问更多商家数据。

2、设置cookies登录

我们需要在访问请求中添加cookies信息,让后台认为我们已登录。前提是用于已注册账号并登录,在开发者工具中打开->网络->消息头->cookies,复制cookies数据。


cookies.png

cookies数据处理成字典格式,这里部分cookies用***代替

cookies_str='ubt_ssid=pwppg5un1gd56zefxvx**********e_2017-11-17; _utrace=f550e02b0883e3b96b3c8e7d9b9801a9_2017-11-17; perf_ssid=7rulhdqct6md********************; eleme__ele_me=1cc2663f830938c9104e9f6f5ae73a10%3A6e49f5779ec4bca5c1f1c4a352b22d05cd8568f6; USERID=578****'
cookies={}
for i in cookies_str.split(';'):
    k,v=i.strip().split('=')
    cookies[k]=v

把之前request的get方法中也略微修改,增加cookies信息登录

r=requests.get(url,cookies=cookies).text
3、循环设置offset偏移量后,生成URL新地址
    i=j=1
    for i in range(30):
        j=i*24
        url='https://www.ele.me/restapi/shopping/restaurants?extras[]=activities&geohash=wtw39y84pc8&latitude=31.23723&limit=24&longitude=121.3663&offset='+str(j)+'&terminal=web'
        return url
4、数据插入Mongodb
from pymongo import MongoClient
client=MongoClient('127.0.0.1')
db=client['elm']
col=db['resturant']

四、代码截图

code.png

代码访问 我的GITHUB

五、结果显示

在mongodb中按照地址排序,sort({address:1}) 按照地址升序排序


mongodb3.png mongodb2.png mongodb1.png

从结果看饿了么很多商铺都没有营业执照,饿了么也是睁只眼闭只眼,毕竟可以从每家店铺收取20%的服务器,而且有些店月销量可达几千单,哪个平台愿意自断财路。

六、改进目标

1、登录用户名和密码保存cookies
2、以订餐地址方圆20公里定位获取更多餐厅信息
3、获取店铺实际取餐地址更精确判断。
4、获取区域内热销商品,活动营销。
5、使用Flask模块web方式显示数据。
5、接入微信公众号

相关文章

  • 用python抓取饿了么无证店铺

    一、前言 饿了么平台上很多店铺都无营业执照,只能借用他人的营业执照上传开店。那就想看看附近有多少这样无证共用营业执...

  • 笨办法!美团外卖店铺名称手工抓取方法!

    做饿了么县城代理的,一般美团的店铺多于饿了么。但是一般找不到那些店铺没有上饿了么,这样形成一个差距。找到差距的地方...

  • [爬虫][瑞雪采集云]-案列11:外卖平台店铺抓取

    案列说明: 分类:外卖平台 案例:饿了么平台信息抓取 业务流程描述: 【1】业务描述 【2】元素技术定位 抓取方法...

  • 对接饿了么平台总结

    前言:好久没写过笔记了,感觉上次写笔记已经是上个世纪(嘿嘿~);最近工作中要对接饿了么的平台,从饿了么平台抓取数据...

  • 饿了么店铺引流小技巧

    老板们都在想如何引流? 在菜品板块或者banner引导成为粉丝咯 成为店铺粉丝后和用户有互动后告知有红包群是否愿意...

  • 春节外卖假期歇业排名保护设置

    您好,春节将至,各店铺可以设置饿了么和美团的假期歇业了。 设置假期歇业可以锁定店铺春节休假期间的月销和店铺排名。 ...

  • iOS UILabel 简单高效添加圆角

    饿了么App中店铺会有,减、特、新等标签,这些标签一般都是用UILabel控件实现。 这个要求我们做圆角,最简单的...

  • 饿了么,饿了......

    饿了么?多么温情的一句问候,不仅仅是问候,确实也让无数人足不出户就能喂饱肚子,不管你在城市的哪个角落,只要一个电话...

  • Python爬虫之初体验

    Python爬虫,一般用于抓取特定的内容,最近想学学,通过网络抓取自己想要的内容,于是乎学习了一下Python,用...

  • 💡产品日报 18/10/16 百度外卖改名饿了么星选

    新鲜事 百度外卖改名换标「饿了么星选」,定位高端的外卖订餐服务,店铺资源经过筛选,与饿了么形成差异。百度外卖是 1...

网友评论

本文标题:用python抓取饿了么无证店铺

本文链接:https://www.haomeiwen.com/subject/cunttftx.html