【视频】爬取饿了么平台上的门店信息
大邓闲聊
今天给大家写个简单的爬虫,纯属当做休闲娱乐之用。太难的大邓就不写了,本来就是闲下来,娱乐下,没必要给自己找郁闷,嘿嘿。 其实这是一个网友发给我的题目中的一个小部分,做成了就能去他们团队做兼职。考虑到我现在时间比较紧张,投入产出不合适,我就拒绝了。
今天我们要爬的是饿了么平台上门店信息(以麦当劳为例),如名称、经纬度、地址、所在城市等。后来仔细分析了下网址规律,发现这个爬虫写起来很有乐趣,分享给大家,也能继续丰富咱大邓公众号数据抓包的爬虫实战案例。
一、动态网页是非功过
我们以后写爬虫遇到的网站,绝大部分是动态网页。这种网站让人恨爱交加。
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())
运行效果如下图
有了城市的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')
运行显示我们抓到我们想要的数据。
三、批量爬
这里大邓就不写了,大家如果感兴趣,可以自己动手实践下。实际上这部分反而不难,只要把前面的几个函数,通过一定的逻辑串联起来,再加上数据提取和保存即可。
我觉得本爬虫文最精华的部分是一二部分的分析部分,第三部分反而没啥用。大邓也就不写了,算是留下个作业,大家自行解决,不懂的一定要多问度娘。
四、项目下载地址
大家觉的感兴趣可以将此文分享出去,😜 ,市面上图文又有视频讲解的文章可不多哦。
链接: https://pan.baidu.com/s/1hr4o6Cs 密码: kpsp
https://v.qq.com/txp/iframe/player.html?vid=a0514rz9g20&width=500&height=375&auto=0