关于饿了么、美团外卖爬虫

最近两天在写关于饿了么、美团外卖的爬虫。发现了果然很顽固的反爬策略,在这里先记录一波,爬虫与发爬虫的战争。
饿了么、美团外卖甚至是百度外卖都是一样的套路,首页是定位,先把位置确定了然后再把这个位置的范围内的商铺给你呈现出来。
url长这个样子滴
饿了么:[https://www.ele.me/place/wx4errgynr6?latitude=39.98993&longitude=116.33965]
可以看出发请求至少要具备这三个参数,地区编码,纬度和经度
因为整个页面是需要加载的,呈现的店铺只是一部分,如果我们用动态加载selenium可以实现页面交互,点击加载更多商家,可是动态加载太慢,我们发现在用户点击加载更多商家时会发送一个post,于是我们就开始各种伪装成提交数据的样子来获得data了。
关于饿了么、美团外卖爬虫_第1张图片
最终
我们只要访问url = https://www.ele.me/place/wx4errgynr6?latitude=39.98993&limit=30&longitude=116.33965&offset=30
limit表示返回data的数目,比如这里返回的是json文件,30就是30个店铺的信息。
offset是变得,表示是前一页到这一页产生偏移的大小。这一个参数主要就是用来解决我们不能点击加载更多商家的办法,我们通过不断调整offset的值来实现post时获得不同的data.
这两个参数都比较好设置
我们来看一下wx4errgynr6和经纬度的确定,确定这个就首先要保证我们知道要获得哪些位置的data。
wx4errgynr6是地区编码,经纬度也要主要需要保留地区经纬度小数点后的5位,可能是饿了么后来本来就这么搞的吧。
这里要介绍一个对地理位置进行编码和解码的一个非常好用的包。
geohash,这里安装通常会发现我明明安装成功了,却出现找不到包
sudo pip3 install python-geohash
而不是pip3 install geohash
我想下一篇文章就会讲讲geohash算法以及它的底层实现。
我先从网上当了一个全北京的公交站,当然也可以写爬虫来爬北京的公交站,然后我利用geohash.encode(纬度,经度)获得了地区编码。
好吧,我们应该先获得公交站的纬度和经度
工具包geopy,可以实现输入位置输出经纬度,输入经纬度输出位置的功能

def parse_station(station,ft,timeout=20):
    geolocator = Nominatim()
    try:
        location = geolocator.geocode(station,timeout=timeout)
        if location!=None:
            lat = float('%.5f'%location.latitude)
            lon = float('%.5f'%location.longitude)
            encode = geohash.encode(lat,lon)
            ft.write(station+" "+str(lat)+" "+str(lon)+" "+encode+"\n")
    except GeocoderTimedOut as e:
        print("Error: geocode failed on input %s with message %s" % (station,str(e)))

返回的json是介个样子的
关于饿了么、美团外卖爬虫_第2张图片

这个json中我们能获得店铺的很多信息,包括 地址、手机号、配送费、起送价等信息,当然我们希望获得店铺里面菜品的相关信息,那么店铺的id就相当重要了,我们拿到店铺id同样以post的请求来获得店铺的menu
curl “https://www.ele.me/restapi/shopping/v2/menu?restaurant_id=977647” -H “x-shard: shopid=977647;loc=116.33965,39.98993” -H “accept-encoding: gzip, deflate, br” -H “accept-language: zh-CN,zh;q=0.8” -H “user-agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36” -H “accept: application/json, text/plain, /” -H “referer: https://www.ele.me/shop/977647” -H “authority: www.ele.me”

原生态的post很长,我们稍微处理一下拿到最核心的来伪装,可以看出来restaurant_id ,shopid,以及经纬度我们都是可以在上一个json文件中获得的。这里保留写一些参数,是为了更好的伪装,尽可能的避免被当掉。
同样的拿到的也是json,我们抽取我们需要的数据就OK了。

你可能感兴趣的:(数据挖掘)