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 相关文章推荐
zbar解码二维码和条形码示例
Feb 07 Python
将Python中的数据存储到系统本地的简单方法
Apr 11 Python
Python轻量级ORM框架Peewee访问sqlite数据库的方法详解
Jul 20 Python
Tornado 多进程实现分析详解
Jan 12 Python
Python读取图片为16进制表示简单代码
Jan 19 Python
PyTorch 1.0 正式版已经发布了
Dec 13 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
Mar 22 Python
详解Python 解压缩文件
Apr 09 Python
对python中url参数编码与解码的实例详解
Jul 25 Python
python 字典访问的三种方法小结
Dec 05 Python
Python requests模块session代码实例
Apr 14 Python
pandas将list数据拆分成行或列的实现
Dec 13 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中用正则表达式清除字符串的空白
2011/01/17 PHP
php jsonp单引号转义
2014/11/23 PHP
zend框架实现支持sql server的操作方法
2016/12/08 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
Javascript笔记一 js以及json基础使用说明
2010/05/22 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(四)用地图块拼成大地图
2013/01/23 Javascript
举例详解Python中smtplib模块处理电子邮件的使用
2015/06/24 Javascript
原生JS和jQuery版实现文件上传功能
2016/04/18 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
Bootstrap选项卡学习笔记分享
2017/02/13 Javascript
js面向对象编程总结
2017/02/16 Javascript
前端开发之CSS原理详解
2017/03/11 Javascript
JavaScript中的return布尔值的用法和原理解析
2017/08/14 Javascript
JavaScript 数组的进化与性能分析
2017/09/18 Javascript
vue实现长图垂直居上 vue实现短图垂直居中
2017/10/18 Javascript
vue 通过下拉框组件学习vue中的父子通讯
2017/12/19 Javascript
在一个页面实现两个zTree联动的方法
2017/12/20 Javascript
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
微信小程序实现即时通信聊天功能的实例代码
2018/08/17 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
ES7之Async/await的使用详解
2019/03/28 Javascript
Element-ui upload上传文件限制的解决方法
2021/01/22 Javascript
JSONLINT:python的json数据验证库实例解析
2017/11/28 Python
Django自定义过滤器定义与用法示例
2018/03/22 Python
python+opencv实现阈值分割
2018/12/26 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
python 中的9个实用技巧,助你提高开发效率
2020/08/30 Python
收集的22款给力的HTML5和CSS3帮助工具
2012/09/14 HTML / CSS
canvas实现飞机打怪兽射击小游戏的示例代码
2018/07/09 HTML / CSS
Expedia丹麦:全球领先的旅游网站
2018/03/18 全球购物
工厂搬迁方案
2014/05/11 职场文书
模具设计与制造专业求职信
2014/07/19 职场文书
运动会报道稿300字
2014/10/02 职场文书
创先争优承诺书
2015/01/20 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL