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 相关文章推荐
Windows下PyMongo下载及安装教程
Apr 27 Python
python中快速进行多个字符替换的方法小结
Dec 15 Python
flask中过滤器的使用详解
Aug 01 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
python实现串口自动触发工作的示例
Jul 02 Python
解决python明明pip安装成功却找不到包的问题
Aug 28 Python
简单瞅瞅Python vars()内置函数的实现
Sep 27 Python
python 递归调用返回None的问题及解决方法
Mar 16 Python
python将logging模块封装成单独模块并实现动态切换Level方式
May 12 Python
python简单利用字典破解zip文件口令
Sep 07 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 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包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
js 事件处理函数间的Event物件是否全等
2011/04/08 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
moment.js轻松实现获取当前日期是当年的第几周
2015/02/05 Javascript
javascript获取select值的方法分析
2015/07/02 Javascript
javascript实现继承的简单实例
2015/07/26 Javascript
JavaScript的Number对象的toString()方法
2015/12/18 Javascript
jquery获取select选中值的方法分析
2015/12/22 Javascript
实例剖析AngularJS框架中数据的双向绑定运用
2016/03/04 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
javascript之with的使用(阿里云、淘宝使用代码分析)
2016/10/11 Javascript
使用jquery如何获取时间
2016/10/13 Javascript
完美解决浏览器跨域的几种方法(汇总)
2017/05/08 Javascript
详解vue路由篇(动态路由、路由嵌套)
2019/01/27 Javascript
webpack 最佳配置指北(推荐)
2020/01/07 Javascript
Openlayers实现测量功能
2020/09/25 Javascript
[01:45]IMBATV TI4前线报道-选手到达
2014/07/07 DOTA
Python使用cookielib模块操作cookie的实例教程
2016/07/12 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
Python Web框架之Django框架Form组件用法详解
2019/08/16 Python
win10安装tensorflow-gpu1.8.0详细完整步骤
2020/01/20 Python
Python文件操作方法详解
2020/02/09 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
CSS3提交意见输入框样式代码
2014/10/30 HTML / CSS
英国花园药房: The Garden Pharmacy
2017/12/28 全球购物
服装电子商务创业计划书
2014/01/30 职场文书
全国道德模范事迹
2014/02/01 职场文书
《孙权劝学》教学反思
2014/04/23 职场文书
初中同学会活动方案
2014/08/22 职场文书
产品陈列协议书(标准版)
2014/09/17 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
2014年医院个人工作总结
2014/12/09 职场文书
中国世界遗产导游词
2015/02/13 职场文书
植物园观后感
2015/06/11 职场文书