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(urlparse)模板的使用方法总结
Oct 13 Python
pandas数据处理基础之筛选指定行或者指定列的数据
May 03 Python
详解python读取和输出到txt
Mar 29 Python
Python后台开发Django的教程详解(启动)
Apr 08 Python
Python3+Pycharm+PyQt5环境搭建步骤图文详解
May 29 Python
把django中admin后台界面的英文修改为中文显示的方法
Jul 26 Python
PyCharm中代码字体大小调整方法
Jul 29 Python
tensorflow如何批量读取图片
Aug 29 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
40行Python代码实现天气预报和每日鸡汤推送功能
Feb 27 Python
Lombok插件安装(IDEA)及配置jar包使用详解
Nov 04 Python
cookies应对python反爬虫知识点详解
Nov 25 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
eWebEditor v3.8 商业完整版 (PHP)
2006/12/06 PHP
php正则校验用户名介绍
2008/07/19 PHP
php程序之die调试法 快速解决错误
2009/09/17 PHP
PHP 一个随机字符串生成代码
2010/05/26 PHP
举例讲解PHP面对对象编程的多态
2015/08/12 PHP
图文详解PHP环境搭建教程
2016/07/16 PHP
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
angularjs中的单元测试实例
2014/12/06 Javascript
jQuery中nextUntil()方法用法实例
2015/01/07 Javascript
JavaScript中实现继承的三种方式和实例
2015/01/29 Javascript
jquery实现翻动fadeIn显示的方法
2015/03/05 Javascript
jQuery实现按钮只点击一次后就取消点击事件绑定的方法
2015/06/26 Javascript
JS+CSS实现鼠标滑过时动态翻滚的导航条效果
2015/09/24 Javascript
JavaScript开发者必备的10个Sublime Text插件
2016/02/27 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
JavaScript 计算笛卡尔积实例详解
2016/12/02 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
详细讲解vue2+vuex+axios
2017/05/27 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
解决vuejs项目里css引用背景图片不能显示的问题
2018/09/13 Javascript
jQuery Ajax async=>false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
Javascript操作select控件代码实例
2020/02/14 Javascript
python将MongoDB里的ObjectId转换为时间戳的方法
2015/03/13 Python
关于python的bottle框架跨域请求报错问题的处理方法
2017/03/19 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
python openpyxl使用方法详解
2019/07/18 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
python pygame 愤怒的小鸟游戏示例代码
2021/02/25 Python
Calzedonia美国官网:意大利风格袜子、打底裤和沙滩装
2018/07/19 全球购物
将相和教学反思
2014/02/04 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
民事纠纷协议书
2016/03/23 职场文书
大学社团活动总结怎么写
2019/06/21 职场文书
vue使用localStorage持久性存储实现评论列表
2022/04/14 Vue.js
python turtle绘图
2022/05/04 Python