美团数据怎么爬,看看这个文章吧!
1.分析美团美食网页的url参数构成
1)搜索要点
美团美食,地址:北京,搜索关键词:火锅
2)爬取的url
https://bj.meituan.com/s/%E7%81%AB%E9%94%85/
3)说明
url会有自动编码中文功能。所以火锅二字指的就是这一串我们不认识的代码%E7%81%AB%E9%94%85。
通过关键词城市的url构造,解析当前url中的bj=北京,/s/后面跟搜索关键词。
这样我们就可以了解到当前url的构造。
2.分析页面数据来源(F12开发者工具)
开启F12开发者工具,并且刷新当前页面:可以看到切换到第二页时候,我们的url没有变化,网站也没有自动进行刷新跳转操作。(web中ajax技术就是在保证页面不刷新,url不变化情况下进行数据加载的技术)
此时我们需要在开发者工具中,找到xhr里面对应当前数据的响应文件。
分析到这里可以得知:我们的数据是以json格式交互。分析第二页的json文件请求地址与第三页json文件的请求地址。
第二页:https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset=32&cateId=-1&q=%E7%81%AB%E9%94%85
第三页:https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset=64&cateId=-1&q=%E7%81%AB%E9%94%85
对比发现:offse
参数每次翻页增加32,并且limit
参数是一次请求的数据量,offse是数据请求的开始元素,q
是搜索关键词poi/pcsearch/1?其中的1
是北京城市的id编号。
3.构造请求抓取美团美食数据
接下来直接构造请求,循环访问每一页的数据,最终代码如下。
import requests
import re
def start():
for w in range(0, 1600, 32):
#页码根据实际情况x32即可,我这里是设置50页为上限,为了避免设置页码过高或者数据过少情况,定义最大上限为1600-也就是50页,使用try-except来检测时候异常,异常跳过该页,一般作为无数据跳过该页处理
try:
# 注意uuid后面参数空余将uuid后xxx替换为自己的uuid参数
url = 'https://apimobile.meituan.com/group/v4/poi/pcsearch/1?uuid=xxx&userid=-1&limit=32&offset='+str(w)+'&cateId=-1&q=%E7%81%AB%E9%94%85'
#headers的数据可以在F12开发者工具下面的requests_headers中查看,需要实现选择如下headers信息
#必要情况 请求频繁 建议增加cookie参数在headers内
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3741.400 QQBrowser/10.5.3863.400',
'Host': 'apimobile.meituan.com',
'Origin': 'https://bj.meituan.com',
'Referer': 'https://bj.meituan.com/s/%E7%81%AB%E9%94%85/'
}
response = requests.get(url, headers=headers)
#正则获取当前响应内容中的数据,因json方法无法针对店铺特有的title键值进行获取没所以采用正则
titles = re.findall('","title":"(.*?)","address":"', response.text)
addresses = re.findall(',"address":"(.*?)",', response.text)
avgprices = re.findall(',"avgprice":(.*?),', response.text)
avgscores = re.findall(',"avgscore":(.*?),',response.text)
comments = re.findall(',"comments":(.*?),',response.text)
#输出当前返回数据的长度 是否为32
print(len(titles), len(addresses), len(avgprices), len(avgscores), len(comments))
for o in range(len(titles)):
#循环遍历每一个值 写入文件中
title = titles[o]
address = addresses[o]
avgprice = avgprices[o]
avgscore = avgscores[o]
comment = comments[o]
#写入本地文件
file_data(title, address, avgprice, avgscore, comment)
#文件写入方法
def file_data(title, address, avgprice, avgscore, comment):
data = {
'店铺名称': title,
'店铺地址': address,
'平均消费价格': avgprice,
'店铺评分': avgscore,
'评价人数': comment
}
with open('美团美食.txt', 'a', encoding='utf-8')as fb:
fb.write(json.dumps(data, ensure_ascii=False) + 'n')
#ensure_ascii=False必须加因为json.dumps方法不关闭转码会导致出现乱码情况
if __name__ == '__main__':
start()
运行结果如下:
本地文件:
4.总结
根据搜索词变化,城市变化,可以改变url中指定的参数来实现。同时也要记得变更headers中的指定参数,方法简单,多加练习即可熟悉ajax类型的数据抓取。
------------------- End -------------------
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- XXE漏洞学习
- 红帽杯-恶臭的数据包
- CTF-摩斯电码解密
- Lampiao靶机渗透
- 如何绕过堡垒机远程登录
- Android | okhttp细枝篇
- valgrind测试报告分析
- 深度学习Pytorch检测实战 - Notes - 第5章 单阶多层检测器:SSD
- Java+selnium 智能等待,try catch方法智能定位需添加等待的元素
- Python中的命名空间和作用域(2)
- C/C++可以用正则表达式吗?
- typescript实战总结之实现一个互联网黑白墙
- 文件上传漏洞演示(一句话木马文件 + 蚁剑)
- [Bazel]构建Golang项目
- 2020--IDEA破解失败后无法打开(mac/win)【已解决】