python爬取饿了么外卖商家数据_用python抓取饿了么无证店铺
一、前言
饿了么平台上很多店铺都无营业执照,只能借用他人的营业执照上传开店。那就想看看附近有多少这样无证共用营业执照的店铺。
先看一下抓取的截图,竟然有这么多店没有营业执照。
mongodb3.png
在饿了么上显示的地址都是营业执照的地址,有时候当你点餐会看到送餐员取餐的地址不是营业执照标注的地址。
通常这种店铺都是无营业执照的,因为店铺老板都可以在后台自行设置取餐地址,所以用户在点餐时候看到不一定是真实地址,在下单后才能具体取餐地址。
还有一种店铺是自行配送的,下单后根本就看不到取餐地址,这种店铺更可怕,根本就不知道是哪个黑作坊加工的食品。
二、运行环境
python3
pymongo
requests
三、分析
首先访问饿了么主页,输入想搜寻的区域,页面随即返回附近区域店铺。
address.png
打开浏览器开发者工具,分析需要抓取的数据,接着用requests抓取该页面地址,使用BeautifulSoup解析数据,竟然返回空值数据。
再次查看页面信息,向下滚动页面,发现XHR异步加载类型中有返回JSON格式数据。如下图所示:
F12.png
后台用json格式传递数据,前台浏览器用javascript展示json格式的方法,是目前比较通用的做法。后台提供的json格式的api接口可以供网页、手机调用,属于restful风格。这样只需要开发和维护一套后台,简化系统架构。
虽然用requests抓取不到页面,但json格式可以更方便的采集我们需要数据。
1、抓取数据
其中参数:
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
五、结果显示
在mongodb中按照地址排序,sort({address:1}) 按照地址升序排序
mongodb3.png
mongodb2.png
mongodb1.png
从结果看饿了么很多商铺都没有营业执照,饿了么也是睁只眼闭只眼,毕竟可以从每家店铺收取20%的服务器,而且有些店月销量可达几千单,哪个平台愿意自断财路。
六、改进目标
1、登录用户名和密码保存cookies
2、以订餐地址方圆20公里定位获取更多餐厅信息
3、获取店铺实际取餐地址更精确判断。
4、获取区域内热销商品,活动营销。
5、使用Flask模块web方式显示数据。
5、接入微信公众号
python爬取饿了么外卖商家数据_用python抓取饿了么无证店铺相关推荐
- python爬取饿了么外卖商家数据_python爬饿了么外卖数据(1)
1.环境介绍: win10 64bit python 3.6.0 openpyxl 2.4.2(操作excel) 2.目的 根据区域统计该区域附近的外卖商家总数.和所有商家的月销售情况 3.网页截 ...
- python爬取饿了么外卖商家销量_如何让外卖店铺销量达到9999+
如今,外卖用户习惯基本形成,用户规模不断扩大高,外卖餐饮收入不断提高.越来越多的堂食商家加入外卖市场,很多商家当加入到外卖市场之后才发现原来外卖并不是想的那么简单.万单店如高山仰止,只能心向往之. 对 ...
- wireshark 抓 蓝牙数据_使用Wireshark 抓取数据包
Wireshark 是一个网络封包分析软件.网络封包分析软件的功能是获取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换. 一 ...
- java抓取页面数据_通过java抓取任何指定网页的数据
假设你需要获取51job人才网上java人才的需求数量,首先你需要分析51job网站的搜索这一块是怎么运作的,通过解析网页的源代码,我们发现了以下一些信息: 1. 搜索时页面请求的URL是 http: ...
- python爬网易云音乐评论最多的歌_使用Python爬一爬网易云音乐上那些评论火爆的歌曲...
网易云音乐这款音乐APP本人比较喜欢,用户量也比较大,而网易云音乐之所以用户众多和它的歌曲评论功能密不可分,很多歌曲的评论非常有意思,其中也不乏很多感人的评论.但是,网易云音乐并没有提供热评排行榜和按 ...
- java 省市县数据_使用Jsoup抓取全国地区数据(省市县镇村)
最近手头在做一些东西,需要一个全国各地的地域数据,从省市区到县镇乡街道的.各种度娘,各种谷歌,都没找到一个完整的数据.最后功夫不负有心人,总算找到一份相对来说比较完整的数据,但是这里的数据也只是精确到 ...
- python 读取xml获取包含指定标签的数据_用Python元素提取XML的特定行
我有点困在我正在做的一个项目上,它使用Python--我对它非常陌生.我被告知使用ElementTree并从传入的XML文件中获取指定的数据.听起来很简单,但我不擅长编程.非常低(a!)一个传入文件的 ...
- python开发的程序中以电子表格显示数据_使用 Python 读取电子表格中的数据实例详解...
Python 是最流行.功能最强大的编程语言之一.由于它是自由开源的,因此每个人都可以使用.大多数 Fedora 系统都已安装了该语言.Python 可用于多种任务,其中包括处理逗号分隔值(CSV)数 ...
- python爬取行业数据_用Python进行Web爬取数据
介绍 我们拥有的数据太少,无法建立机器学习模型.我们需要更多数据! 如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题.我们无法在数据科学项目中获 ...
最新文章
- curl 探测java网站_使用cURL查找网站重定向的位置?
- tsne pca 自编码器 绘图(CC2)——一定记得做无量纲化处理使用standardscaler,数据聚类更明显...
- winpython使用教程-如何使用Python自动控制windows桌面
- Kyoya and Photobooks
- 移动测试架构演进 | 蚂蚁金服自动化用例管理探索
- angular1.2.27_Angular 8 + Spring Boot 2.2:立即构建一个CRUD应用程序!
- js中当等于最小值是让代码不执行_从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理...
- 支付宝为何放弃社交梦?
- 按 字节截取分别以GBK 和 utf-8 编码的 字符串的java程序。
- BZOJ3653 洛谷3899:谈笑风生——题解
- C++ map中使用erase应该注意到的问题
- Python获取打印机读数(东芝泰格)
- nginx不转发static下文件_文件存储老大难,随取随用不心烦!玩转最强私人云盘群晖NAS(下)...
- android webView 全屏播放网络视频
- 米的换算单位和公式_米的单位换算公式大全二年级(简便易记的单位米换算方法)...
- load函数无法打开MAT文件:不是二进制 MAT 文件。请尝试执行 load -ASCII 以便以文本形式读取。
- 苹果侧边滑动返回_iOS系统右滑返回手势问题及解决方案
- Linux内核中的IPSEC实现(1)
- 2048小游戏项目总结
- Xshell提示更新并且已经是最新版
热门文章
- ERROR: [1] bootstrap checks failed [1]: max virtual memory areas vm.max_map_count [65530] is too low
- 深度神经网络中的梯度消失与爆炸
- 使用Gzip加速网页的传输
- .gitignore与.git/info/exclude区别
- 刷脸支付核心靠的就是人脸识别技术
- 华为S5700忘记console密码怎么办?
- [django项目] 后台菜单管理功能
- vivox30计算机系统崩溃,遇到vivox30死机的情况应该怎么办
- html页面列表一键全选选,JQuery控制Html页面Checkbox全选和全不选
- 微信小程序解决picker-view bindchange延迟问题