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 splitlines使用技巧
Sep 06 Python
Django与遗留的数据库整合的方法指南
Jul 24 Python
python中函数传参详解
Jul 03 Python
Python方法的延迟加载的示例代码
Dec 18 Python
Django 跨域请求处理的示例代码
May 02 Python
解决在pycharm运行代码,调用CMD窗口的命令运行显示乱码问题
Aug 23 Python
Python通过cv2读取多个USB摄像头
Aug 28 Python
Windows10下Tensorflow2.0 安装及环境配置教程(图文)
Nov 21 Python
Python Pandas 转换unix时间戳方式
Dec 07 Python
Python语法之精妙的十个知识点(装B语法)
Jan 18 Python
python numpy实现多次循环读取文件 等间隔过滤数据示例
Mar 14 Python
python 绘制国旗的示例
Sep 27 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
ThinkPHP使用心得分享-分页类Page的用法
2014/05/15 PHP
destoon整合UCenter图文教程
2014/06/21 PHP
Ubuntu12下编译安装PHP5.3开发环境
2015/03/27 PHP
php文件操作相关类实例
2015/06/18 PHP
PHP实现Markdown文章上传到七牛图床的实例内容
2020/02/11 PHP
JS 控件事件小结
2012/10/31 Javascript
select标记美化--JS式插件、后期加载
2013/04/01 Javascript
jquery让返回的内容显示在特定div里(代码少而精悍)
2014/06/23 Javascript
多个checkbox被选中时如何判断是否有自己想要的
2014/09/22 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
jQuery实现的省市县三级联动菜单效果完整实例
2016/08/01 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
angular2+nodejs实现图片上传功能
2017/03/27 NodeJs
JS实现方形抽奖效果
2018/08/27 Javascript
JavaScript的查询机制LHS和RHS解析
2019/08/16 Javascript
Python使用multiprocessing实现一个最简单的分布式作业调度系统
2016/03/14 Python
Python基于回溯法子集树模板解决野人与传教士问题示例
2017/09/11 Python
Python实现简单网页图片抓取完整代码实例
2017/12/15 Python
scrapy爬虫实例分享
2017/12/28 Python
python实现二叉查找树实例代码
2018/02/08 Python
谈谈python中GUI的选择
2018/03/01 Python
使用Anaconda3建立虚拟独立的python2.7环境方法
2018/06/11 Python
IntelliJ IDEA安装运行python插件方法
2018/12/10 Python
利用Python+阿里云实现DDNS动态域名解析的方法
2019/04/01 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
2019/09/11 Python
整理HTML5中表单的常用属性及新属性
2016/02/19 HTML / CSS
Lowe’s加拿大:家居装修、翻新和五金店
2019/12/06 全球购物
爱情保证书范文
2014/02/01 职场文书
小学绿色学校申报材料
2014/08/23 职场文书
预备党员转正思想汇报
2014/09/26 职场文书
班级联欢会主持词
2015/07/03 职场文书
python实现A*寻路算法
2021/06/13 Python
Java9新特性之Module模块化编程示例演绎
2022/03/16 Java/Android
Javascript的promise,async和await的区别详解
2022/03/24 Javascript
html中两种获取标签内的值的方法
2022/06/10 HTML / CSS