用python抓取餓了么無證店鋪

一、前言

餓了么平臺(tái)上很多店鋪都無營業(yè)執(zhí)照,只能借用他人的營業(yè)執(zhí)照上傳開店。那就想看看附近有多少這樣無證共用營業(yè)執(zhí)照的店鋪。

先看一下抓取的截圖,竟然有這么多店沒有營業(yè)執(zhí)照。


mongodb3.png

在餓了么上顯示的地址都是營業(yè)執(zhí)照的地址,有時(shí)候當(dāng)你點(diǎn)餐會(huì)看到送餐員取餐的地址不是營業(yè)執(zhí)照標(biāo)注的地址。
通常這種店鋪都是無營業(yè)執(zhí)照的,因?yàn)榈赇伬习宥伎梢栽诤笈_(tái)自行設(shè)置取餐地址,所以用戶在點(diǎn)餐時(shí)候看到不一定是真實(shí)地址,在下單后才能具體取餐地址。
還有一種店鋪是自行配送的,下單后根本就看不到取餐地址,這種店鋪更可怕,根本就不知道是哪個(gè)黑作坊加工的食品。

二、運(yùn)行環(huán)境

  • python3
  • pymongo
  • requests

三、分析

首先訪問餓了么主頁,輸入想搜尋的區(qū)域,頁面隨即返回附近區(qū)域店鋪。

address.png

頁面瀏覽器地址如下:
https://www.ele.me/place/wtw39y8614v4?latitude=31.237236&longitude=121.36636

打開瀏覽器開發(fā)者工具,分析需要抓取的數(shù)據(jù),接著用requests抓取該頁面地址,使用BeautifulSoup解析數(shù)據(jù),竟然返回空值數(shù)據(jù)。
再次查看頁面信息,向下滾動(dòng)頁面,發(fā)現(xiàn)XHR異步加載類型中有返回JSON格式數(shù)據(jù)。如下圖所示:


F12.png

后臺(tái)用json格式傳遞數(shù)據(jù),前臺(tái)瀏覽器用javascript展示json格式的方法,是目前比較通用的做法。后臺(tái)提供的json格式的api接口可以供網(wǎng)頁、手機(jī)調(diào)用,屬于restful風(fēng)格。這樣只需要開發(fā)和維護(hù)一套后臺(tái),簡化系統(tǒng)架構(gòu)。
雖然用requests抓取不到頁面,但json格式可以更方便的采集我們需要數(shù)據(jù)。

1、抓取數(shù)據(jù)

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

其中參數(shù):
1、longitude,latitude采用的高德坐標(biāo)系對(duì)應(yīng)搜索區(qū)域的經(jīng)緯度
2、limit=24 每次限制返回上限24個(gè)店鋪;設(shè)置再多后臺(tái)最多返回30個(gè)
3、offset=24 每次返回的店鋪數(shù)量,24個(gè)數(shù)量級(jí)增加,比如頁面繼續(xù)往下翻offset=48,72……
用循環(huán)增加offset的偏移量,就可以得到更多的店鋪數(shù)據(jù)。

此頁面我們需要采集name ,phone, address 即商戶名稱,電話,營業(yè)地址三個(gè)數(shù)據(jù)即可。一個(gè)頁面可以采集24個(gè)商家數(shù)據(jù),json數(shù)據(jù)如下圖:


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'])

返回結(jié)果如下:


single_page.png

設(shè)置offset=48,期望得到更多商家,返回結(jié)果如下:

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

這是因?yàn)楹笈_(tái)設(shè)置了需要登錄才能訪問更多商家數(shù)據(jù)。

2、設(shè)置cookies登錄

我們需要在訪問請求中添加cookies信息,讓后臺(tái)認(rèn)為我們已登錄。前提是用于已注冊賬號(hào)并登錄,在開發(fā)者工具中打開->網(wǎng)絡(luò)->消息頭->cookies,復(fù)制cookies數(shù)據(jù)。


cookies.png

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']

四、代碼截圖

code.png

代碼訪問 我的GITHUB

五、結(jié)果顯示

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


mongodb3.png
mongodb2.png
mongodb1.png

從結(jié)果看餓了么很多商鋪都沒有營業(yè)執(zhí)照,餓了么也是睜只眼閉只眼,畢竟可以從每家店鋪收取20%的服務(wù)器,而且有些店月銷量可達(dá)幾千單,哪個(gè)平臺(tái)愿意自斷財(cái)路。

六、改進(jìn)目標(biāo)

1、登錄用戶名和密碼保存cookies
2、以訂餐地址方圓20公里定位獲取更多餐廳信息
3、獲取店鋪實(shí)際取餐地址更精確判斷。
4、獲取區(qū)域內(nèi)熱銷商品,活動(dòng)營銷。
5、使用Flask模塊web方式顯示數(shù)據(jù)。
5、接入微信公眾號(hào)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,030評(píng)論 25 709
  • 1. 通過adb shell進(jìn)入到手機(jī)data/data目錄下,查看包名(需要root) 如果提示opendir ...
    小小小小筱閱讀 21,044評(píng)論 0 3
  • 最近我發(fā)現(xiàn)每一個(gè)人在事業(yè)進(jìn)階的道路上都會(huì)經(jīng)歷三個(gè)過程。即聽別人的故事,講自己的故事,別人講我們的故事。為什么呢? ...
    小坤爸閱讀 464評(píng)論 0 0
  • 嚴(yán)格說來,我并沒有真正旅行過。因?yàn)槲覜]有用上多少錢、乘一趟飛機(jī)或是坐上多久的車、到達(dá)多遠(yuǎn)的地方——為欣賞一...
    宜室可宜家閱讀 433評(píng)論 0 2

友情鏈接更多精彩內(nèi)容