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之数据序列化(json、pickle、shelve)
Mar 30 Python
Python3 中把txt数据文件读入到矩阵中的方法
Apr 27 Python
对pandas中两种数据类型Series和DataFrame的区别详解
Nov 12 Python
Python脚本按照当前日期创建多级目录
Mar 01 Python
Pandas删除数据的几种情况(小结)
Jun 21 Python
pycharm修改file type方式
Nov 19 Python
关于ResNeXt网络的pytorch实现
Jan 14 Python
python 链接sqlserver 写接口实例
Mar 11 Python
pycharm如何使用anaconda中的各种包(操作步骤)
Jul 31 Python
使用python库xlsxwriter库来输出各种xlsx文件的示例
Sep 01 Python
python在CMD界面读取excel所有数据的示例
Sep 28 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 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计算当前程序执行时间示例
2014/04/24 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
不用AJAX和IFRAME,说说真正意义上的ASP+JS无刷新技术
2008/09/25 Javascript
最简单的jQuery程序 入门者学习
2009/07/09 Javascript
动态加载JS文件的三种方法
2013/11/08 Javascript
document.getElementById获取控件对象为空的解决方法
2013/11/20 Javascript
js调试系列 断点与动态调试[基础篇]
2014/06/18 Javascript
jquery马赛克拼接翻转效果代码分享
2015/08/24 Javascript
JavaScript事件类型中UI事件详解
2016/01/14 Javascript
JQuery实现网页右侧随动广告特效
2016/01/17 Javascript
AngularJS中的Directive实现延迟加载
2016/01/25 Javascript
Angularjs实现多个页面共享数据的方式
2016/03/29 Javascript
JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
2016/09/22 Javascript
boostrapTable的refresh和refreshOptions区别浅析
2017/01/22 Javascript
解决ztree搜索中多级菜单展示不全问题
2017/07/05 Javascript
移动端效果之IndexList详解
2017/10/20 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
基于Vue制作组织架构树组件
2017/12/06 Javascript
js前端面试之同步与异步问题详解
2019/04/03 Javascript
JS实现iframe中子父页面跨域通讯的方法分析
2020/03/10 Javascript
微信小程序实现modal弹出框遮罩层组件(可带文本框)
2020/12/20 Javascript
Node使用koa2实现一个简单JWT鉴权的方法
2021/01/26 Javascript
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
Python编程入门的一些基本知识
2015/05/13 Python
matplotlib中legend位置调整解析
2017/12/19 Python
python 自动批量打开网页的示例
2019/02/21 Python
Python 通过requests实现腾讯新闻抓取爬虫的方法
2019/02/22 Python
在python里面运用多继承方法详解
2019/07/01 Python
Python列表(list)所有元素的同一操作解析
2019/08/01 Python
基于python操作ES实例详解
2019/11/16 Python
Python实现自动访问网页的例子
2020/02/21 Python
护士自我介绍信
2014/01/13 职场文书
党的群众路线教育学习材料
2014/05/12 职场文书
讲文明知礼仪演讲稿
2014/09/13 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
Golang 正则匹配效率详解
2021/04/25 Golang