运维开发网

【视频】爬取饿了么平台上的门店信息

运维开发网 https://www.qedev.com 2021-01-13 12:14 出处:51CTO 作者:mb5fe94cdd5807a
大邓闲聊今天给大家写个简单的爬虫,纯属当做休闲娱乐之用。太难的大邓就不写了,本来就是闲下来,娱乐下,没必要给自己找郁闷,嘿嘿。其实这是一个网友发给我的题目中的一个小部分,做成了就能去他们团队做兼职。考虑到我现在时间比较紧张,投入产出不合适,我就拒绝了。今天我们要爬的是饿了么平台上门店信息(以麦当劳为例),如名称、经纬度、地址、所在城市等。后来仔细分析了下网址规律,发现这个爬虫写起来很有乐趣,分享给

大邓闲聊

今天给大家写个简单的爬虫,纯属当做休闲娱乐之用。太难的大邓就不写了,本来就是闲下来,娱乐下,没必要给自己找郁闷,嘿嘿。 其实这是一个网友发给我的题目中的一个小部分,做成了就能去他们团队做兼职。考虑到我现在时间比较紧张,投入产出不合适,我就拒绝了。

今天我们要爬的是饿了么平台上门店信息(以麦当劳为例),如名称、经纬度、地址、所在城市等。后来仔细分析了下网址规律,发现这个爬虫写起来很有乐趣,分享给大家,也能继续丰富咱大邓公众号数据抓包的爬虫实战案例。

一、动态网页是非功过

我们以后写爬虫遇到的网站,绝大部分是动态网页。这种网站让人恨爱交加。

1.1可恨之处

动态网页往往让初学者搞不懂url的规律,就比如我用饿了么网站在长沙搜麦当劳。我们在网址栏看到的是

https://www.ele.me/home/

但实际上,真正的url是这个东西

https://mainsite-restapi.ele.me/v2/pois?extras%5B%5D=count&geohash=wt029fxwdpkh& keyword=%E9%BA%A6%E5%BD%93%E5%8A%B3&limit=20&type=nearby

艾,真特么难找规律,这都是什么东西。初学者看到这肯定会头疼,大邓一开始学爬虫时候,也是一样的。

【视频】爬取饿了么平台上的门店信息

1.2可爱之处

当然凡是有两面性,以为王爷这么蛋疼的url,往往也意味着数据传输多采用json格式。json类似于字典,只要有知道key,就能获得key的value,不用搞什么网页解析,不用搞太多beautifulsoup和re的各种操作。请看下图,是不是数据很干净,不用我们解析,稍微使用点手段就能用。

【视频】爬取饿了么平台上的门店信息

二、爬虫实战-爬饿了么全国各城市的麦当劳门店信息

2.1 分析url网址

我们发现,网页打开时候,默认是长沙市。大家如果爬,也会有各自的默认城市。我们希望自动的改变城市信息,输入关键字 麦当劳,就能获取相关的门店信息。 那我们还是看下提交麦当劳时,看看抓包抓到的东西。

继续用上面的图。下面的红色框圈中的是真正的url

【视频】爬取饿了么平台上的门店信息

https://mainsite-restapi.ele.me/v2/pois?extras%5B%5D=count&geohash=wt029fxwdpkh& keyword=%E9%BA%A6%E5%BD%93%E5%8A%B3&limit=20&type=nearby 那么这个url里的geohash、keyword、limit、type等是什么,他们的值是怎么来的? 请继续看抓到的包,往下翻下,出来下图的东西。

我们发现url中的几个关键词,是这么构造成的。

【视频】爬取饿了么平台上的门店信息

2.2 url各个参数是什么意思

keyword应该是麦当劳 limit不用变,默认 type不用变,默认 geohash看英文是地理geo的哈希值。应该跟长沙有关系。 但是


      ?

长沙 ------> wt029fxwdpkh

2.3 怎么找到geohash?

大邓其实今天之前也不懂geohash,不懂没关系。凡事不决问问度娘,这可是至理名言,比问大邓管用的多。

【视频】爬取饿了么平台上的门店信息

奥,原来是将城市的经纬度经过geohash转化为一个hash值。那么我们先安装上geohash库。

【视频】爬取饿了么平台上的门店信息

2.4 geohash值的生成

长沙市范围很大,不同长沙区县的人的hash值肯定不同。但是不用担心,只要是在长沙范围内,发送给饿了么就行。饿了么会根据你的geohash判断你是否是长沙区域。

我百度查了下长沙的经纬度,使用下面的代码生成geohash


def generate_geohash(lati,longi):

    """

    longi: 经度

    lati:  维度

    """

    geo_hash = geohash.encode(longi,lati)

    return geo_hash

#长沙经度112.979353,维度28.213478

print(generate_geohash(lati=112.979353,longi=28.213478))

注意:如果运行错误,就对换longi和lati,我地理不好。

该经纬度对应的geohash值


wt02dbj53trx

2.5 其他城市的经纬度

在网上找到一个城市经纬度的文件,提取城市经纬度较为容易,就是有点旧,咱们就凑合着用吧。

【视频】爬取饿了么平台上的门店信息

根据这个文件,编写的读取城市经纬度的函数。


def read_citys():

    """

    注意:本文是mac机操作的,win系统为

    path = os.getcwd()+'\\citys.txt'

    """

    container = [] #收集城市坐标信息

    import os, re, chardet

    path = os.getcwd() + '/citys.txt'

    #识别文件编码格式

    with open(path,'rb') as f:

        result = chardet.detect(f.read())

    Encoding = result['encoding']

    #读取citys.txt的数据

    rawdata = open(path, 'r',encoding=Encoding).readlines()

    for rw in rawdata:

        lati_longi = re.compile(r'北纬(.*?) 东经(.*?)\n').findall(rw)

        if lati_longi:

            container.append(lati_longi[0])

    return container

print(read_citys())

运行效果如下图

【视频】爬取饿了么平台上的门店信息

2.6 构造url之最后一击

有了城市的geohash、关键词keyword,那么我们就可以构造请求,获得响应的门店数据。

【视频】爬取饿了么平台上的门店信息


def generate_url(keyword,geo_hash):

    """

    饿了么 长沙市的 麦当劳搜索时的 url

    https://mainsite-restapi.ele.me/v2/pois?extras%5B%5D=count&geohash=wt029fxwdpkh&

    keyword=%E9%BA%A6%E5%BD%93%E5%8A%B3&limit=20&type=nearby

    """

    from urllib.parse import quote

    keyword = quote(keyword) #将关键词转化为这种%E9%BA%A6%E5%BD%93%E5%8A%B3数据

    url = 'https://mainsite-restapi.ele.me/v2/pois'

    data = {'extras[]':'count',

            'geohash': geo_hash,

            'keyword':keyword,

            'limit':'20',

            'type':'nearby'

            }

    resp = requests.get(url,params=data)

    print(resp.url)

    return resp.url

get_infos(keyword='麦当劳',geo_hash='wt029fxwdpkh')

插入图片 08-构造url完成

【视频】爬取饿了么平台上的门店信息

运行正常,生成了url,经过大邓亲测,构造的url是有效的。^_^ 该url蕴含着长沙市的麦当劳门店信息。

2.7 开始爬长沙的门店信息

#获取长沙市的麦当劳门店信息


def get_infos(keyword, geo_hash):

    from urllib.parse import quote

    keyword = quote(keyword)

    url = 'https://mainsite-restapi.ele.me/v2/pois'

    data = {'extras[]': 'count',

            'geohash': geo_hash,

            'keyword': keyword,

            'limit': '20',

            'type': 'nearby'}

    resp = requests.get(url, params=data)

    data = resp.json()

    print(data)

    return data

get_infos(keyword='麦当劳',geo_hash='wt029fxwdpkh')

运行显示我们抓到我们想要的数据。

【视频】爬取饿了么平台上的门店信息

三、批量爬

这里大邓就不写了,大家如果感兴趣,可以自己动手实践下。实际上这部分反而不难,只要把前面的几个函数,通过一定的逻辑串联起来,再加上数据提取和保存即可。

我觉得本爬虫文最精华的部分是一二部分的分析部分,第三部分反而没啥用。大邓也就不写了,算是留下个作业,大家自行解决,不懂的一定要多问度娘。

四、项目下载地址

大家觉的感兴趣可以将此文分享出去,

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号