zoukankan      html  css  js  c++  java
  • Python爬虫实战:爬取美团美食数据

    前言

    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

    作者:Britain_King

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

    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) + '
    ')
            #ensure_ascii=False必须加因为json.dumps方法不关闭转码会导致出现乱码情况
    if __name__ == '__main__':
        start()

    运行结果如下:

    Python爬虫实战:爬取美团美食数据

     

    本地文件:

    Python爬虫实战:爬取美团美食数据

     

    4.总结

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

  • 相关阅读:
    485串口接线
    mvc3 升级mvc5
    VB连接ACCESS数据库,使用 LIKE 通配符问题
    VB6 读写西门子PLC
    可用的 .net core 支持 RSA 私钥加密工具类
    解决 Win7 远程桌面 已停止工作的问题
    解决 WinForm 重写 CreateParams 隐藏窗口以后的显示问题
    解决安装 .net framework 发生 extracting files error 问题
    CentOS7 安装配置笔记
    通过特殊处理 Resize 事件解决 WinForm 加载时闪烁问题的一个方法
  • 原文地址:https://www.cnblogs.com/zwhy8/p/13306241.html
Copyright © 2011-2022 走看看