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实现巡检系统(solaris)示例
Apr 02 Python
python检测远程服务器tcp端口的方法
Mar 14 Python
Python解析excel文件存入sqlite数据库的方法
Nov 15 Python
python批量替换页眉页脚实例代码
Jan 22 Python
python 实现登录网页的操作方法
May 11 Python
pandas把所有大于0的数设置为1的方法
Jan 26 Python
将string类型的数据类型转换为spark rdd时报错的解决方法
Feb 18 Python
详解PANDAS 数据合并与重塑(join/merge篇)
Jul 09 Python
Python turtle绘画象棋棋盘
Aug 21 Python
利用Python优雅的登录校园网
Oct 21 Python
Jupyter Notebook内使用argparse报错的解决方案
Jun 03 Python
python单元测试之pytest的使用
Jun 07 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操作xml
2013/10/27 PHP
ecshop后台编辑器替换成ueditor编辑器
2015/03/03 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
2015/10/21 PHP
雄兵连第三季海报曝光,艾妮熙德成主角,蔷薇新造型
2021/03/09 国漫
js 利用image对象实现图片的预加载提高访问速度
2013/03/29 Javascript
js中this的用法实例分析
2015/01/10 Javascript
JS长整型精度问题实例分析
2015/01/13 Javascript
jQuery老黄历完整实现方法
2015/01/16 Javascript
动态加载js的方法汇总
2015/02/13 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
学习JavaScript设计模式之享元模式
2016/01/18 Javascript
HTML5 JS压缩图片并获取图片BASE64编码上传
2020/11/16 Javascript
Bootstrap导航条鼠标悬停下拉菜单
2017/01/04 Javascript
微信小程序 解析网页内容详解及实例
2017/02/22 Javascript
bootstrap fileinput 插件使用项目总结(经验)
2017/02/22 Javascript
微信小程序获取用户openId的实现方法
2017/05/23 Javascript
纯JS实现简单的日历
2017/06/26 Javascript
React中嵌套组件与被嵌套组件的通信过程
2018/07/11 Javascript
JS实现将对象转化为数组的方法分析
2019/01/21 Javascript
python操作CouchDB的方法
2014/10/08 Python
利用QT写一个极简单的图形化Python闹钟程序
2015/04/07 Python
python单例模式实例分析
2015/04/08 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python实现京东抢秒杀功能
2021/01/25 Python
意大利制造的男鞋和女鞋:SCAROSSO
2018/03/07 全球购物
工厂会计员职责
2014/02/06 职场文书
关于环保的建议书
2014/05/12 职场文书
电子商务专业毕业生自荐书
2014/06/22 职场文书
授权委托书(完整版)
2014/09/10 职场文书
机动车登记业务委托书
2014/10/08 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
九寨沟导游词
2015/02/02 职场文书
热爱劳动主题班会
2015/08/14 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
深入理解go缓存库freecache的使用
2022/02/15 Golang
mysql中数据库覆盖导入的几种方式总结
2022/03/25 MySQL