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中list常用操作实例详解
Jun 03 Python
详解Django框架中用户的登录和退出的实现
Jul 23 Python
Python的dict字典结构操作方法学习笔记
May 07 Python
Python实现的插入排序算法原理与用法实例分析
Nov 22 Python
Python实现打砖块小游戏代码实例
May 18 Python
Python-while 计算100以内奇数和的方法
Jun 11 Python
python程序中的线程操作 concurrent模块使用详解
Sep 23 Python
Python django搭建layui提交表单,表格,图标的实例
Nov 18 Python
python实现布隆过滤器及原理解析
Dec 08 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 Python
python线程池 ThreadPoolExecutor 的用法示例
Oct 10 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 11 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中异常处理的一些方法整理
2015/07/03 PHP
jQuery提交表单ajax查询实例代码
2012/10/07 Javascript
扩展js对象数组的OrderByAsc和OrderByDesc方法实现思路
2013/05/17 Javascript
jquery 操作两个select实现值之间的互相传递
2014/03/07 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
Javascript冒泡排序算法详解
2014/12/03 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
原生JS实现隐藏显示图片 JS实现点击切换图片效果
2021/01/27 Javascript
使用mint-ui实现省市区三级联动效果的示例代码
2018/02/09 Javascript
Vue监听页面刷新和关闭功能
2019/06/20 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
JS实现贪吃蛇游戏
2019/11/15 Javascript
js实现翻牌小游戏
2020/07/31 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
JS canvas实现画板和签字板功能
2021/02/23 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
Python深入学习之对象的属性
2014/08/31 Python
编写Python脚本来获取mp3文件tag信息的教程
2015/05/04 Python
django 使用 request 获取浏览器发送的参数示例代码
2018/06/11 Python
python区块及区块链的开发详解
2019/07/03 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python3的socket使用方法详解
2020/02/18 Python
Python基于数列实现购物车程序过程详解
2020/06/09 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
Pandas数据分析的一些常用小技巧
2021/02/07 Python
Python实现Excel自动分组合并单元格
2021/02/22 Python
阅兵口号
2014/06/19 职场文书
化验员岗位职责
2015/02/14 职场文书
会计求职信怎么写
2015/03/20 职场文书
2015年团支书工作总结
2015/04/03 职场文书
检讨书模板大全
2015/05/07 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
运动会宣传稿100字
2015/07/23 职场文书
毕业班工作总结
2015/08/10 职场文书
话题作文之诚信
2019/11/28 职场文书