查看原文
其他

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

2017-06-16 大邓 大邓带你玩python

大邓闲聊

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

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

一、动态网页是非功过

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

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的哈希值。应该跟长沙有关系。 但是

  1.      ?

  2. 长沙 ------> wt029fxwdpkh

2.3 怎么找到geohash?

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

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

2.4 geohash值的生成

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

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

  1. def generate_geohash(lati,longi):

  2.    """

  3.    longi: 经度

  4.    lati:  维度

  5.    """

  6.    geo_hash = geohash.encode(longi,lati)

  7.    return geo_hash

  8. #长沙经度112.979353,维度28.213478

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

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

该经纬度对应的geohash值

  1. wt02dbj53trx

2.5 其他城市的经纬度

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

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

  1. def read_citys():

  2.    """

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

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

  5.    """

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

  7.    import os, re, chardet

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

  9.    #识别文件编码格式

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

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

  12.    Encoding = result['encoding']

  13.    #读取citys.txt的数据

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

  15.    for rw in rawdata:

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

  17.        if lati_longi:

  18.            container.append(lati_longi[0])

  19.    return container

  20. print(read_citys())

运行效果如下图 

2.6 构造url之最后一击

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

  1. def generate_url(keyword,geo_hash):

  2.    """

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

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

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

  6.    """

  7.    from urllib.parse import quote

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

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

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

  11.            'geohash': geo_hash,

  12.            'keyword':keyword,

  13.            'limit':'20',

  14.            'type':'nearby'

  15.            }

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

  17.    print(resp.url)

  18.    return resp.url

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

插入图片 08-构造url完成 

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

2.7 开始爬长沙的门店信息

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

  2. def get_infos(keyword, geo_hash):

  3.    from urllib.parse import quote

  4.    keyword = quote(keyword)

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

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

  7.            'geohash': geo_hash,

  8.            'keyword': keyword,

  9.            'limit': '20',

  10.            'type': 'nearby'}

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

  12.    data = resp.json()

  13.    print(data)

  14.    return data

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

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


三、批量爬

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

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

四、项目下载地址

大家觉的感兴趣可以将此文分享出去,😜 ,市面上图文又有视频讲解的文章可不多哦。


链接: https://pan.baidu.com/s/1hr4o6Cs 密码: kpsp

https://v.qq.com/txp/iframe/player.html?vid=a0514rz9g20&width=500&height=375&auto=0


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存