Python爬虫实例——爬取美团美食数据


Posted in Python onJuly 15, 2020

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不变化情况下进行数据加载的技术)

Python爬虫实例——爬取美团美食数据

此时我们需要在开发者工具中,找到xhr里面对应当前数据的响应文件。

Python爬虫实例——爬取美团美食数据

分析到这里可以得知:我们的数据是以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()

运行结果如下:

Python爬虫实例——爬取美团美食数据

本地文件:

Python爬虫实例——爬取美团美食数据

4.总结

根据搜索词变化,城市变化,可以改变url中指定的参数来实现。同时也要记得变更headers中的指定参数,方法简单,多加练习即可熟悉ajax类型的数据抓取。

以上就是Python爬虫实例——爬取美团美食数据的详细内容,更多关于Python爬虫爬取美食数据的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python实现从url中提取域名的几种方法
Sep 26 Python
python实现简单爬虫功能的示例
Oct 24 Python
Python装饰器原理与用法分析
Apr 30 Python
python调用Matplotlib绘制分布点并且添加标签
May 31 Python
NumPy 数学函数及代数运算的实现代码
Jul 18 Python
Selenium鼠标与键盘事件常用操作方法示例
Aug 13 Python
python 爬取疫情数据的源码
Feb 09 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
Pytorch 使用CNN图像分类的实现
Jun 16 Python
python使用selenium爬虫知乎的方法示例
Oct 28 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
Nov 17 Python
python 通过exifread读取照片信息
Dec 24 Python
django Model层常用验证器及自定义验证器详解
Jul 15 #Python
浅谈Django前端后端值传递问题
Jul 15 #Python
浅谈python出错时traceback的解读
Jul 15 #Python
Django视图、传参和forms验证操作
Jul 15 #Python
一文解决django 2.2与mysql兼容性问题
Jul 15 #Python
django 模型字段设置默认值代码
Jul 15 #Python
django序列化时使用外键的真实值操作
Jul 15 #Python
You might like
用PHP程序实现支持页面后退的两种方法
2008/06/30 PHP
php获取字符串中各个字符出现次数的方法
2015/02/23 PHP
laravel通过a标签从视图向控制器实现传值
2019/10/15 PHP
js使用函数绑定技术改变事件处理程序的作用域
2011/12/26 Javascript
浅析JS刷新框架中的其他页面 && JS刷新窗口方法汇总
2013/07/08 Javascript
跟我学习javascript的Date对象
2015/11/19 Javascript
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
html+js实现简单的计算器代码(加减乘除)
2016/07/12 Javascript
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
zTree节点文字过多的处理方法
2017/11/24 Javascript
Node.js 使用AngularJS的方法示例
2018/05/11 Javascript
webpack公共组件引用路径简化小技巧
2018/06/15 Javascript
vue v-for出来的列表,点击某个li使得当前被点击的li字体变红操作
2020/07/17 Javascript
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
python如何通过protobuf实现rpc
2016/03/06 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
详解PANDAS 数据合并与重塑(join/merge篇)
2019/07/09 Python
Python利用scapy实现ARP欺骗的方法
2019/07/23 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
pytorch 归一化与反归一化实例
2019/12/31 Python
python如何通过闭包实现计算器的功能
2020/02/22 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
解决python3.6用cx_Oracle库连接Oracle的问题
2020/12/07 Python
remote接口和home接口主要作用
2013/05/15 面试题
淘宝好评语大全
2014/05/05 职场文书
调研汇报材料范文
2014/08/17 职场文书
个人先进事迹材料范文
2014/12/29 职场文书
听证通知书
2015/04/24 职场文书
总结一些Java常用的加密算法
2021/06/11 Java/Android
Golang的继承模拟实例
2021/06/30 Golang
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫
为什么MySQL不建议使用SELECT *
2022/04/03 MySQL
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers