一唐础、前言
餓了么平臺上很多店鋪都無營業(yè)執(zhí)照悟衩,只能借用他人的營業(yè)執(zhí)照上傳開店剧罩。那就想看看附近有多少這樣無證共用營業(yè)執(zhí)照的店鋪。
先看一下抓取的截圖局待,竟然有這么多店沒有營業(yè)執(zhí)照斑响。
在餓了么上顯示的地址都是營業(yè)執(zhí)照的地址,有時(shí)候當(dāng)你點(diǎn)餐會看到送餐員取餐的地址不是營業(yè)執(zhí)照標(biāo)注的地址钳榨。
通常這種店鋪都是無營業(yè)執(zhí)照的,因?yàn)榈赇伬习宥伎梢栽诤笈_自行設(shè)置取餐地址纽门,所以用戶在點(diǎn)餐時(shí)候看到不一定是真實(shí)地址薛耻,在下單后才能具體取餐地址。
還有一種店鋪是自行配送的赏陵,下單后根本就看不到取餐地址饼齿,這種店鋪更可怕,根本就不知道是哪個黑作坊加工的食品蝙搔。
二缕溉、運(yùn)行環(huán)境
- python3
- pymongo
- requests
三、分析
首先訪問餓了么主頁吃型,輸入想搜尋的區(qū)域证鸥,頁面隨即返回附近區(qū)域店鋪。
頁面瀏覽器地址如下:
https://www.ele.me/place/wtw39y8614v4?latitude=31.237236&longitude=121.36636
打開瀏覽器開發(fā)者工具,分析需要抓取的數(shù)據(jù)枉层,接著用requests抓取該頁面地址泉褐,使用BeautifulSoup解析數(shù)據(jù),竟然返回空值數(shù)據(jù)鸟蜡。
再次查看頁面信息膜赃,向下滾動頁面,發(fā)現(xiàn)XHR異步加載類型中有返回JSON格式數(shù)據(jù)揉忘。如下圖所示:
后臺用json格式傳遞數(shù)據(jù)跳座,前臺瀏覽器用javascript展示json格式的方法,是目前比較通用的做法泣矛。后臺提供的json格式的api接口可以供網(wǎng)頁躺坟、手機(jī)調(diào)用,屬于restful風(fēng)格乳蓄。這樣只需要開發(fā)和維護(hù)一套后臺咪橙,簡化系統(tǒng)架構(gòu)。
雖然用requests抓取不到頁面虚倒,但json格式可以更方便的采集我們需要數(shù)據(jù)美侦。
1、抓取數(shù)據(jù)
其中參數(shù):
1魂奥、longitude菠剩,latitude采用的高德坐標(biāo)系對應(yīng)搜索區(qū)域的經(jīng)緯度
2、limit=24 每次限制返回上限24個店鋪耻煤;設(shè)置再多后臺最多返回30個
3具壮、offset=24 每次返回的店鋪數(shù)量,24個數(shù)量級增加哈蝇,比如頁面繼續(xù)往下翻offset=48,72……
用循環(huán)增加offset的偏移量棺妓,就可以得到更多的店鋪數(shù)據(jù)。
此頁面我們需要采集name ,phone, address 即商戶名稱炮赦,電話怜跑,營業(yè)地址三個數(shù)據(jù)即可。一個頁面可以采集24個商家數(shù)據(jù)吠勘,json數(shù)據(jù)如下圖:
代碼如下:
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'])
返回結(jié)果如下:
設(shè)置offset=48性芬,期望得到更多商家,返回結(jié)果如下:
{'message': '登陸后查看更多商家', 'name': 'UNAUTHORIZED_MORE_RESTAURANTS_ERROR'}
這是因?yàn)楹笈_設(shè)置了需要登錄才能訪問更多商家數(shù)據(jù)剧防。
2植锉、設(shè)置cookies登錄
我們需要在訪問請求中添加cookies信息,讓后臺認(rèn)為我們已登錄峭拘。前提是用于已注冊賬號并登錄俊庇,在開發(fā)者工具中打開->網(wǎng)絡(luò)->消息頭->cookies狮暑,復(fù)制cookies數(shù)據(jù)。
cookies數(shù)據(jù)處理成字典格式暇赤,這里部分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、循環(huán)設(shè)置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止后、數(shù)據(jù)插入Mongodb
from pymongo import MongoClient
client=MongoClient('127.0.0.1')
db=client['elm']
col=db['resturant']
四、代碼截圖
代碼訪問 我的GITHUB
五溜腐、結(jié)果顯示
在mongodb中按照地址排序译株,sort({address:1}) 按照地址升序排序
從結(jié)果看餓了么很多商鋪都沒有營業(yè)執(zhí)照,餓了么也是睜只眼閉只眼挺益,畢竟可以從每家店鋪收取20%的服務(wù)器歉糜,而且有些店月銷量可達(dá)幾千單,哪個平臺愿意自斷財(cái)路望众。
六匪补、改進(jìn)目標(biāo)
1、登錄用戶名和密碼保存cookies
2烂翰、以訂餐地址方圓20公里定位獲取更多餐廳信息
3夯缺、獲取店鋪實(shí)際取餐地址更精確判斷。
4甘耿、獲取區(qū)域內(nèi)熱銷商品踊兜,活動營銷。
5佳恬、使用Flask模塊web方式顯示數(shù)據(jù)捏境。
5、接入微信公眾號