• 教你如何使用Python爬虫爬取美团美食数据!外卖小专家的报到了!


    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不变化情况下进行数据加载的技术)

    此时我们需要在开发者工具中,找到xhr里面对应当前数据的相应文件。

    分析到这里可以得知:我们的数据是以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) + '
    ')
        #ensure_ascii=False必须加因为json.dumps方法不关闭转码会导致出现乱码情况
    if __name__ == '__main__':
      start()

    运行结果如下:

    本地文件:

    4.总结

    根据搜索词变化,城市变化,可以改变url中指定的参数来实现。同时也要记得变更headers中的指定参数,方法简单,多加练习即可熟悉ajax类型的数据抓取。

    以上就是Python爬虫实例——爬取美团美食数据的详细内容

    想要源代码或者想了解更多内容点击这里获取

    此文转载文,著作权归作者所有,如有侵权联系小编删除!

    原文地址:https://www.zhangshengrong.com/p/8AaYmGYRa2/

  • 相关阅读:
    吃透空洞卷积(Dilated Convolutions)
    CondInst:性能和速度均超越Mask RCNN的实例分割模型
    图像处理基础:颜色空间及其OpenCV实现
    caffe模型转rknn模型的方法
    探索 YOLO v3 源码
    探索 YOLO v3 源码
    事件
    组合,模板,bolck块
    WXSS学习
    其他组件
  • 原文地址:https://www.cnblogs.com/wxys/p/13770284.html
Copyright © 2020-2023  润新知