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 相关文章推荐
JSON Web Tokens的实现原理
Apr 02 Python
python中使用psutil查看内存占用的情况
Jun 11 Python
Python使用pickle模块储存对象操作示例
Aug 15 Python
对Python通过pypyodbc访问Access数据库的方法详解
Oct 27 Python
Python使用pyshp库读取shapefile信息的方法
Dec 29 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
python+selenium 鼠标事件操作方法
Aug 24 Python
django-rest-swagger对API接口注释的方法
Aug 29 Python
YUV转为jpg图像的实现
Dec 09 Python
TensorFlow tensor的拼接实例
Jan 19 Python
python 字典item与iteritems的区别详解
Apr 25 Python
Python urllib3软件包的使用说明
Nov 18 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
如何给phpadmin一个保护
2006/10/09 PHP
php 在文件指定行插入数据的代码
2010/05/08 PHP
php目录遍历函数opendir用法实例
2014/11/20 PHP
php返回相对时间(如:20分钟前,3天前)的方法
2015/04/14 PHP
php跨服务器访问方法小结
2015/05/12 PHP
Yii2 输出xml格式数据的方法
2016/05/03 PHP
PHP判断一个变量是否为整数、正整数的方法示例
2019/09/11 PHP
javascript 得到变量类型的函数
2010/05/19 Javascript
jquery中html、val与text三者属性取值的联系与区别介绍
2013/12/29 Javascript
jquery下拉select控件操作方法分享(jquery操作select)
2014/03/25 Javascript
使用原生js封装webapp滑动效果(惯性滑动、滑动回弹)
2014/05/06 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
2014/08/04 Javascript
js实现类似MSN提示的页面效果代码分享
2015/08/24 Javascript
AngularJS的依赖注入实例分析(使用module和injector)
2017/01/19 Javascript
详解如何将angular-ui的图片轮播组件封装成一个指令
2017/05/09 Javascript
微信小程序icon组件使用详解
2018/01/31 Javascript
vue之父子组件间通信实例讲解(props、$ref、$emit)
2018/05/22 Javascript
vue 自定义提示框(Toast)组件的实现代码
2018/08/17 Javascript
前端面试知识点目录一览
2019/04/15 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
Python爬虫爬验证码实现功能详解
2016/04/14 Python
Python简单读取json文件功能示例
2017/11/30 Python
Python通过OpenCV的findContours获取轮廓并切割实例
2018/01/05 Python
Python获取当前函数名称方法实例分享
2018/01/18 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
美国眼镜在线零售商:Dualens
2019/12/07 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
String、StringBuffer、StringBuilder有区别
2015/09/18 面试题
儿科主治医生个人求职信
2013/09/23 职场文书
高中生家长寄语大全
2014/04/03 职场文书
小学社团活动总结
2014/06/27 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
2014年初中班主任工作总结
2014/11/08 职场文书
2014年服务员个人工作总结
2014/12/23 职场文书
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python