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 相关文章推荐
pandas 实现字典转换成DataFrame的方法
Jul 04 Python
python中退出多层循环的方法
Nov 27 Python
python爬取内容存入Excel实例
Feb 20 Python
使用python-pptx包批量修改ppt格式的实现
Feb 14 Python
Python错误的处理方法
Jun 23 Python
Python如何执行系统命令
Sep 23 Python
python两种注释用法的示例
Oct 09 Python
Python 微信公众号文章爬取的示例代码
Nov 30 Python
一文读懂python Scrapy爬虫框架
Feb 24 Python
python线程优先级队列知识点总结
Feb 28 Python
python实现腾讯滑块验证码识别
Apr 27 Python
python实现局部图像放大
Nov 17 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
全国FM电台频率大全 - 18 湖南省
2020/03/11 无线电
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
PHP基于堆栈实现的高级计算器功能示例
2017/09/15 PHP
Laravel 数据库加密及数据库表前缀配置方法
2019/10/10 PHP
IE7提供XMLHttpRequest对象为兼容
2007/03/08 Javascript
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
JS Ajax请求如何防止重复提交
2016/06/13 Javascript
基于Turn.js 实现翻书效果实例解析
2016/06/20 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
Vue2学习笔记之请求数据交互vue-resource
2017/02/23 Javascript
bootstrap多层模态框滚动条消失的问题
2017/07/21 Javascript
react 国际化的实现代码示例
2018/09/14 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
你了解vue3.0响应式数据怎么实现吗
2019/06/07 Javascript
vue自动化路由的实现代码
2019/09/30 Javascript
javascript中闭包closure的深入讲解
2021/03/03 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
Python随机生成信用卡卡号的实现方法
2015/05/14 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
利用Python查看微信共同好友功能的实现代码
2019/04/24 Python
Python 矩阵转置的几种方法小结
2019/12/02 Python
Windows下Anaconda和PyCharm的安装与使用详解
2020/04/23 Python
如何基于Python Matplotlib实现网格动画
2020/07/20 Python
CSS3只让背景图片旋转180度的实现示例
2021/03/09 HTML / CSS
纽约著名的服装辅料来源:M&J Trimming
2017/07/26 全球购物
凯伦·米莲女装网上商店:Karen Millen
2017/11/07 全球购物
台湾母婴用品限时团购:妈咪爱
2018/08/03 全球购物
药物学专业学生的自我评价
2013/10/27 职场文书
节约电力资源的建议书
2014/03/12 职场文书
事业单位绩效考核实施方案
2014/03/27 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
Python学习之迭代器详解
2022/04/01 Python