Python应⽤实战-Python爬取美团⽹数据全解析
⽬录:
1.概述
2.搜索结果数据采集
2.1. 获取真实数据请求地址
2.2. 请求数据(requests)
2.3. 解析获取需要的数据
2.4. 存储结果到本地(csv⽂件)
3.分类筛选结果数据采集
3.1. 获取真实数据请求地址
3.2. _token解析与⽣成
3.3. 请求数据(requests)
3.4. 解析获取需要的结果
3.5. 存储结果到本地
4.总结
1.概述
美团⽹的爬⾍整体其实⽐较简单,通过开发者模式到真实数据请求地址后,⽤requests请求的数据格式是标准的json字符串,⾮常好处理。
在本⽂我们将介绍两种常见的获取数据的⽅式,其⼀是通过搜索获取结果,其⼆是通过筛选获取结果。两种⽅式在获取真实数据请求地址的⽅法上稍有差异,具体我们见下⾯章节。
2.搜索结果数据采集
如果想在PC⽹页端搜索结果,需要先进⾏账号登录,然后⽅可进⾏搜索操作。
2.1. 获取真实数据请求地址
mv命令
如下图,我们先在搜索框 输⼊ 搜索关键字如“⽕锅”。然后进⾏以下步骤:(以⾕歌浏览器为例)
1. 按 F12 进⼊到开发者模式
2. 在右侧开发者模式页⾯最上⽅点击Network—>XHR
3. 在左侧搜索结果页拖到最下⽅,点击下⼀页(如 2)
4. 然后在右侧的开发者模式页⾯左侧靠上的Name,点击第⼆个uuid开头的即可出现我们需要的信息
获取真实数据请求地址
最终链接地址还需要有以下参数:在 Query String Parameters 中可以看到哈ascii编码多少位
如果你在其他筛选项进⾏选择时,会发现对应参数可能增加或减少,这个时候根据⾃⼰需求进⾏参数设定即可。
2.2. 请求数据(requests)
这⾥只需要⽤到两个库,requests请求数据,json解析json数据字符串。
import requests
import json
# 以北京为例,其基础链接如下:
base_url = 'ituan/group/v4/poi/pcsearch/1?'
# 上海为如下,差异就在最后⾯问号前⾯的数字,上海为10,北京为1
# ituan/group/v4/poi/pcsearch/10?
uuid = xxxx # 你的uuid,登录后在开发者模式获取
userid = xxx # 你的userid,登录后在开发者模式获取
key = '⽕锅'
# 这⾥演⽰请求第⼀页的数据
page = 1
# 设置请求参数
parameters = {
'uuid': uuid, # 你的uuid,登录后在开发者模式获取
'userid': userid, # 你的userid,登录后在开发者模式获取
'limit':32, # 每页的店铺信息数
'offset':32*(page - 1), # 当前偏移量,第1页为0,第2页为 (2-1)*limit
'cateId':-1, #怎么设置文本框渐变透明效果
'q': key, # 搜索的关键字
}
# 设置请求头
header = {
"Accept-Encoding": "Gzip", # 使⽤gzip压缩传输数据让访问更快
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:83.0) Gecko/20100101 Firefox/83.0", }
# get⽅法请求⽹页数据
re = (base_url, headers = header, params=parameters)
# re.text是我们需要的数据
text = re.text
# 由于是json格式的字符串,⽤json.load()⽅法格式化compareandset
js = json.loads(text)
# 需要⽤到的数据在 js['data']中
data = js['data']
searchResult = data['searchResult'] # 结果列表
结果其实是很结构化的
2.3. 解析获取需要的数据
由于单页存在32组数据,且每组数据字段较多,我们⽤列表来存储单页数据,⽤字典存储单个店铺的信息。
考虑到我想记录每个店铺的优惠券销售量信息,⼜因为优惠券存储的是列表形式,这⾥我单独处理了优惠券的记录信息,组合其他基础信息后形成⼀条数据。因此在最终的数据中同⼀个店铺会存在多条,不过其优惠券信息是存在差异的。
# 接2.2.中结果
shops = []
for dic in searchResult:
shop = {}
shop['id'] = dic['id']
shop['店铺名称'] = dic['title']
shop['地址'] = dic['address']
shop['地区'] = dic['areaname']
shop['平均消费'] = dic['avgprice']
shop['评分'] = dic['avgscore']
shop['评价数'] = dic['comments']
shop['类型'] = dic['backCateName']
# shop['优惠'] = dic['deals']
shop['经度'] = dic['longitude']
shop['纬度'] = dic['latitude']
shop['最低消费'] = dic['lowestprice']
python请求并解析json数据if dic['deals'] == None:
shops.append(shop)
else:
for deal in dic['deals']:
# deal = dic['deals'][1]
shop_info = py()
shop_info['优化id'] = deal['id']
shop_info['优惠券名称'] = deal['title']
shop_info['优惠券原价值'] = deal['value']
shop_info['优惠券价格'] = deal['price']
shop_info['优惠券销量'] = deal['sales']
shops.append(shop_info)
店铺数据列表
2.4. 存储结果到本地(csv⽂件)
vue和angular区别我们每获取⼀页数据之后,⽴刻写⼊本地,因为每页的数据最后是⼜字典组成的列表,我们可以直接使⽤pandas的_csv()⽅法来进⾏追加写⼊。
# 接 2.3. 中的结果
import pandas as pd
df = pd.DataFrame(shops)
# 需要存储表头,所以对于第⼀页的数据我们连表头⼀起存储
if page == 1:
<_csv('⽕锅店铺数据.csv',index=False, mode='a+', )
# ⾮第⼀页的数据,我们之存数据不存表头,mode='a+'是追加模式
else:
<_csv('⽕锅店铺数据.csv',header=False,index=False, mode='a+', )
导出的数据表
3.分类筛选结果数据采集
在进⾏分类筛选的时候,我们不需要进⾏账号登录即可获取数据。不过通过分析发现这种情况下真实数据请求地址有别的搜索结果下的真实数据请求地址,且稍微⿇烦⼀点,具体我们见后⾯的分析。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论