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 23 Python
python共享引用(多个变量引用)示例代码
Dec 04 Python
使用Python的Scrapy框架编写web爬虫的简单示例
Apr 17 Python
简单介绍Python中的struct模块
Apr 28 Python
一键搞定python连接mysql驱动有关问题(windows版本)
Apr 23 Python
Python中__init__.py文件的作用详解
Sep 18 Python
Python实现七彩蟒蛇绘制实例代码
Jan 16 Python
python读写配置文件操作示例
Jul 03 Python
用python3 urllib破解有道翻译反爬虫机制详解
Aug 14 Python
Python计算指定日期是今年的第几天(三种方法)
Mar 26 Python
Python实现清理微信僵尸粉功能示例【基于itchat模块】
May 29 Python
Python利用capstone实现反汇编
Apr 06 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
虹吸壶是谁发明的?煮出来的咖啡好喝吗
2021/03/04 冲泡冲煮
实战mysql导出中文乱码及phpmyadmin导入中文乱码的解决方法
2010/06/11 PHP
PHP函数getenv简介和使用实例
2014/05/12 PHP
使用PHP生成二维码的方法汇总
2015/07/22 PHP
php简单实现多语言切换的方法
2016/05/09 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
jquery多行滚动/向左或向上滚动/响应鼠标实现思路及代码
2013/01/23 Javascript
JavaScript实现的图像模糊算法代码分享
2014/04/22 Javascript
js检测浏览器版本、核心、是否移动端示例
2014/04/24 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
socket.io学习教程之深入学习篇(三)
2017/04/29 Javascript
基于vue实现swipe分页组件实例
2017/05/25 Javascript
Webpack性能优化 DLL 用法详解
2017/08/10 Javascript
详解Web使用webpack构建前端项目
2017/09/23 Javascript
ES6之模版字符串的具体使用
2018/05/17 Javascript
VUE v-model表单数据双向绑定完整示例
2019/01/21 Javascript
vant实现购物车功能
2020/06/29 Javascript
Python实现合并字典的方法
2015/07/07 Python
python下PyGame的下载与安装过程及遇到问题
2019/08/04 Python
tensorflow自定义激活函数实例
2020/02/04 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
美国大城市最热门旅游景点门票:CityPASS
2016/12/16 全球购物
校长岗位职责
2013/11/26 职场文书
工程专业求职自荐书范文
2014/02/08 职场文书
股东合作协议书范本
2014/04/14 职场文书
2014组织生活会方案
2014/05/19 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
社区党风廉政建设调研报告
2015/01/01 职场文书
2015年教学工作总结
2015/04/02 职场文书
结婚幸福感言
2015/08/01 职场文书
left join、inner join、right join的区别
2021/04/05 MySQL
Python基础之元类详解
2021/04/29 Python
什么是css原子化,有什么用?
2022/04/24 HTML / CSS
Python docx库删除复制paragraph及行高设置图片插入示例
2022/07/23 Python