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字符串加密解密的三种方法分享(base64 win32com)
Jan 19 Python
实例讲解python函数式编程
Jun 09 Python
Sanic框架安装与简单入门示例
Jul 16 Python
python用for循环求和的方法总结
Jul 08 Python
pytorch载入预训练模型后,实现训练指定层
Jan 06 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
Python的in,is和id函数代码实例
Apr 18 Python
Python Django中间件使用原理及流程分析
Jun 13 Python
Python grpc超时机制代码示例
Sep 14 Python
Pycharm的Available Packages为空的解决方法
Sep 18 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 Python
Python 全局空间和局部空间
Apr 06 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 第二节 数据类型之字符串类型
2012/04/28 PHP
用PHP+MySQL搭建聊天室功能实例代码
2012/08/20 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
laravel框架数据库配置及操作数据库示例
2019/10/10 PHP
HTML TO JavaScript 转换
2006/06/26 Javascript
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
JavaScript 捕获窗口关闭事件
2009/07/26 Javascript
Javascript 获取滚动条位置等信息的函数
2009/09/08 Javascript
JavaScript 基础篇(一)
2012/03/30 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
getJSON调用后台json数据时函数被调用两次的原因猜想
2013/09/29 Javascript
juery框架写的弹窗效果适合新手
2013/11/27 Javascript
js验证输入是否为手机号码或电话号码示例
2013/12/30 Javascript
在JavaScript中call()与apply()区别
2016/01/22 Javascript
从零学习node.js之利用express搭建简易论坛(七)
2017/02/25 Javascript
nodejs body-parser 解析post数据实例
2017/07/26 NodeJs
关于Vue实现组件信息的缓存问题
2017/08/23 Javascript
Three.js基础学习教程
2017/11/16 Javascript
浅析JS抽象工厂模式
2017/12/14 Javascript
在layui下对元素进行事件绑定的实例
2019/09/06 Javascript
nodejs开发一个最简单的web服务器实例讲解
2020/01/02 NodeJs
通过实例了解Nodejs模块系统及require机制
2020/07/16 NodeJs
Python如何判断数独是否合法
2016/09/08 Python
PyQt5每天必学之进度条效果
2018/04/19 Python
解决python删除文件的权限错误问题
2018/04/24 Python
python实现画一颗树和一片森林
2018/06/25 Python
python dict 相同key 合并value的实例
2019/01/21 Python
Django框架下静态模板的继承操作示例
2019/11/08 Python
Django配置文件代码说明
2019/12/04 Python
python中添加模块导入路径的方法
2021/02/03 Python
纯CSS实现聊天框小尖角、气泡效果
2014/04/04 HTML / CSS
四查四看剖析材料
2014/02/14 职场文书
财务总监管理岗位职责
2014/03/08 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
Python利用FlashText算法实现替换字符串
2022/03/31 Python