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三元运算符实现方法
Dec 17 Python
Python实现的监测服务器硬盘使用率脚本分享
Nov 07 Python
Python3实现从文件中读取指定行的方法
May 22 Python
Python中Django框架下的staticfiles使用简介
May 30 Python
Python3多线程操作简单示例
May 22 Python
如何使用Flask-Migrate拓展数据库表结构
Jul 24 Python
用python求一重积分和二重积分的例子
Dec 06 Python
Pytorch .pth权重文件的使用解析
Feb 14 Python
深入浅析Python 函数注解与匿名函数
Feb 24 Python
python3.7 openpyxl 在excel单元格中写入数据实例
Sep 01 Python
python控制台打印log输出重复的解决方法
May 14 Python
Python中Schedule模块使用详解 周期任务神器
Apr 19 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
苏联队长,苏联超人蝙蝠侠,这些登场的“山寨”英雄真的很严肃
2020/04/09 欧美动漫
如何去掉文章里的 html 语法
2006/10/09 PHP
php下过滤HTML代码的函数
2007/12/10 PHP
在PHP中利用wsdl创建标准webservice的实现代码
2011/12/07 PHP
PHP中的类型约束介绍
2015/05/11 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
Zend Framework处理Json数据方法详解
2016/12/09 PHP
laravel5.2实现区分前后台用户登录的方法
2017/01/11 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
jquery 插件 web2.0分格的分页脚本,可用于ajax无刷新分页
2008/12/25 Javascript
下载网站打开页面后间隔多少时间才显示下载链接地址的代码
2010/04/25 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
jQuery javaScript捕获回车事件(示例代码)
2013/11/07 Javascript
jquery删除数据记录时的弹出提示效果
2014/05/06 Javascript
Javascript闭包用法实例分析
2015/01/23 Javascript
angular简介和其特点介绍
2015/01/29 Javascript
快速掌握Node.js环境的安装与运行方法
2016/02/16 Javascript
设计模式中的组合模式在JavaScript程序构建中的使用
2016/05/18 Javascript
使用jQuery的toggle()方法对HTML标签进行显示、隐藏的方法(示例)
2016/09/01 Javascript
详细谈谈AngularJS的子级作用域问题
2016/09/05 Javascript
详解用node-images 打造简易图片服务器
2017/05/08 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
Vue实现手机计算器
2020/08/17 Javascript
Javascript基于OOP实实现探测器功能代码实例
2020/08/26 Javascript
vue 路由meta 设置导航隐藏与显示功能的示例代码
2020/09/04 Javascript
[46:02]DOTA2上海特级锦标赛D组资格赛#2 Liquid VS VP第二局
2016/02/28 DOTA
Python入门篇之面向对象
2014/10/20 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
书法培训心得体会
2014/01/05 职场文书
个人授权委托书范本
2014/04/03 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
人物搭配车车超萌联名预备中 【咒术迴战】 ⨯ 【天竺鼠车车】 展开合作
2022/04/11 日漫