Python爬虫实战:Yelp餐厅数据采集完整教程

news2025/12/15 3:47:09

前言

在数据分析和商业智能领域,餐厅和商户信息的采集是一个常见需求。Yelp作为全球知名的本地商户评论平台,包含了大量有价值的商户信息。本文将详细介绍如何使用Python开发一个高效的Yelp数据爬虫,实现商户信息的批量采集。

技术栈介绍

本项目采用以下技术栈:

  • Python 3.x:主要编程语言
  • curl_cffi:用于发送HTTP请求,支持浏览器指纹模拟
  • 正则表达式:用于数据解析
  • JSON处理:解析API响应数据

项目架构设计

核心类:YelpSearchUser

我们设计了一个YelpSearchUser类来封装所有的爬虫功能,主要包含以下几个核心方法:

  1. __init__() - 初始化请求头和配置项
  2. get() - 获取搜索结果列表
  3. get_detail() - 获取商户详细信息
  4. parse_data() - 解析搜索结果
  5. parse_data_detail() - 解析详细信息

详细实现分析

1. 初始化配置

def __init__(self):
    self.headers = {
        "accept": "*/*",
        "accept-language": "zh-CN,zh;q=0.9",
        "cache-control": "no-cache",
        "pragma": "no-cache",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
    }

在初始化方法中,我们设置了两套请求头:

  • headers:用于API请求
  • html_headers:用于页面请求

这样做的目的是为了更好地模拟真实浏览器行为,避免被反爬虫机制检测。

2. Cookie处理机制

def cookie_str_to_dict(self, cookie_str: str) -> dict:
    cookie_dict = {}
    cookies = [i.strip() for i in cookie_str.split('; ') if i.strip() != ""]
    for cookie in cookies:
        key, value = cookie.split('=', 1)
        cookie_dict[key] = value
    return cookie_dict

Cookie是维持会话状态的关键,我们实现了Cookie字符串到字典的转换功能,确保请求的连续性。

3. 搜索功能实现

def get(self, page, find_desc, find_loc=""):
    url = "https://www.yelp.com/search/snippet"
    if page == 1:
        params = {
            "find_desc": find_desc,
            "find_loc": find_loc,
            "parent_request_id": "097f2346bb4acfc4",
            "request_origin": "user"
        }
    else:
        start = f"{(page-1)*10}"
        params = {
            "find_desc": find_desc,
            "find_loc": find_loc,
            "start": start,
            "parent_request_id": "097f2346bb4acfc4",
            "request_origin": "user"
        }

搜索功能支持分页,通过start参数控制结果偏移量,每页显示10条结果。

4. 数据解析核心算法

搜索结果解析
def parse_data(self, data_list):
    resultList = []
    for d in data_list:
        try:
            bizId = d.get('bizId')
            if not bizId:
                continue
            p_url = "https://www.yelp.com"+d['searchResultBusiness'].get('businessUrl','')
            item = [bizId, p_url]
            resultList.append(item)
        except Exception as e:
            print("解析错误:", e)
    return resultList
详细信息解析
def parse_data_datail(self, html, bizId, p_url):
    html = html.replace(""", '"').replace("/", "/")
    data_text = "".join(re.findall('<!--\{(.*?)--></script><!-- PRAGMA_YELP_BEGIN_RESPONSE', html))
    data_text = "{" + data_text
    dataJson = json.loads(data_text)
    
    bs = dataJson[f"Business:{bizId}"]
    # 提取各种商户信息
    name = bs.get('name', '')
    reviewCount = bs.get('reviewCount', 0)
    rating = bs.get('rating({"roundingMethod":"NEAREST_TENTH"})', '0.0')
    # ... 更多字段解析

这里使用了正则表达式提取页面中的JSON数据,然后解析出我们需要的商户信息。

数据字段说明

我们提取的商户信息包括:

字段名描述示例
bizId商户唯一标识"abc123def456"
name商户名称"老北京烤鸭店"
rating评分"4.5"
reviewCount评论数量128
phoneNumber电话号码"+1-555-123-4567"
address地址"123 Main St, New York"
website_url官网链接"https://example.com"
operationHours营业时间"9:00 AM - 10:00 PM"

使用示例

if __name__ == '__main__':
    ysu = YelpSearchUser()
    
    # 设置Cookie(从浏览器复制)
    cookies = 'your_cookie_string_here'
    
    # 搜索参数
    keyword = ''  # 搜索关键词,空字符串表示搜索所有
    location = 'Tokyo'  # 搜索地点
    page = 1  # 页码
    
    # 获取搜索结果
    data = ysu.main(keyword, location, page, cookies, proxies=None)
    
    # 获取每个商户的详细信息
    for url in data['item_list']:
        result = ysu.main_detail(url, cookies, proxies=None)
        print(result)

技术亮点

1. 浏览器指纹模拟

使用curl_cffi库的impersonate="chrome131"参数,完美模拟Chrome浏览器的TLS指纹和HTTP/2特征。

2. 错误处理机制

while True:
    try:
        response = requests.get(url, headers=self.headers, ...)
        if status_code == 200:
            return response.json(), status_code
        else:
            return None, status_code
    except Exception as e:
        print("发生错误:", e)

采用无限循环重试机制,确保网络波动不会影响数据采集。

3. 代理支持

代码支持代理服务器配置,可以通过proxies参数设置代理,提高采集成功率。

注意事项

1. 法律合规

  • 遵守Yelp的服务条款
  • 控制请求频率,避免对服务器造成压力
  • 仅用于学习和研究目的

2. 技术注意点

  • Cookie需要定期更新
  • 建议添加随机延时避免被检测
  • 可以配置用户代理轮换

3. 异常处理

  • 网络超时处理
  • JSON解析异常处理
  • 数据缺失情况处理

总结

本文介绍了一个完整的Yelp数据爬虫实现,涵盖了从搜索到详细信息获取的全流程。通过合理的架构设计和技术选型,实现了高效稳定的数据采集。

这个爬虫项目不仅适用于Yelp,其设计思路和技术方案也可以应用到其他类似的数据采集场景中。希望本文能为大家在爬虫开发方面提供有价值的参考。

相关资源

  • curl_cffi官方文档
  • Python正则表达式教程
  • HTTP请求头详解

本文仅供学习交流使用,请遵守相关法律法规和网站服务条款。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402872.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

API是什么意思?如何实现开放API?

目录 一、API 是什么 &#xff08;一&#xff09;API 的定义 &#xff08;二&#xff09;API 的作用 二、API 的类型 &#xff08;一&#xff09;Web API 1. RESTful API 2. SOAP API &#xff08;二&#xff09;操作系统 API &#xff08;三&#xff09;数据库 API …

Python训练第四十六天

DAY 46 通道注意力(SE注意力) 知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通…

第2天:认识LSTM

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: pytorch &#xff08;二&#xff09;具体步骤…

自动化提示生成框架(AutoPrompt)

自动化提示生成框架(AutoPrompt) 一、核心创新点 自动化提示生成框架(AutoPrompt) 创新本质:提出基于梯度引导搜索的自动化提示生成方法,替代人工设计模板的传统模式。技术路径: 将提示视为可训练的离散token序列,通过优化提示向量(prompt embedding)搜索语义空间。利…

中国首套1公里高分辨率大气湿度指数数据集(2003~2020)

时间分辨率&#xff1a;月空间分辨率&#xff1a;100m - 1km共享方式&#xff1a;开放获取数据大小&#xff1a;34.79 GB数据时间范围&#xff1a;2003-01-01 — 2020-12-31元数据更新时间&#xff1a;2023-07-26 数据集摘要 中国首套1公里高分辨率大气湿度指数数据集&#xf…

计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点可视化分析

追踪计算机视觉领域的前沿热点是把握技术发展方向、推动创新落地的关键&#xff0c;分析这些热点&#xff0c;不仅能洞察技术趋势&#xff0c;更能为科研选题和工程实践提供重要参考。本文对计算机视觉顶刊《International Journal of Computer Vision》2025年5月前沿热点进行了…

python学习打卡day45

DAY 45 Tensorboard使用介绍 知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 效果展示如下&#xff0c;很适合拿去组会汇报撑页数&#xff1a; 作业&#xff1a;对resnet18在cifar10上采用微调策…

Verilog编程技巧01——如何编写三段式状态机

前言 Verilog编程技巧系列文章将聚焦于介绍Verilog的各种编程范式或者说技巧&#xff0c;编程技巧和编程规范有部分重合&#xff0c;但并非完全一样。规范更注重编码的格式&#xff0c;像变量命名、缩进、注释风格等&#xff0c;而编程技巧则更偏重更直观易读、更便于维护、综合…

智启未来:当知识库遇见莫奈的调色盘——API工作流重构企业服务美学

目录 引言 一、初识蓝耘元生代MaaS平台 1.1 平台架构 1.2 平台的优势 1.3 应用场景 二、手把手教你如何在蓝耘进行注册 &#xff08;1&#xff09;输入手机号&#xff0c;将验证码正确填入即可快速完成注册 &#xff08;2&#xff09;进入下面的页面表示已经成功注册&…

如何在 Windows 11 中永久更改默认浏览器:阻止 Edge 占据主导地位

在 Windows 11 中更改默认浏览器对于新手或技术不太熟练的用户来说可能会令人沮丧。 为什么要在 Windows 11 中更改默认浏览器? 这是一个重要的问题:你为什么要从 Microsoft Edge 切换过来? 生态系统集成:如果你已经在广泛使用 Google 服务,Chrome 可以提供无缝集成。同…

量子比特实现方式

经典计算机是通过电子电路运转起来的。使用硅制半导体制成的名为晶体管的小元件发挥了开关的作用&#xff0c;将其与金属布线组合起来即可实现逻辑门&#xff0c;再将逻辑门集成起来就能制造出经典计算机。量子计算机的制造过程则要复杂许多&#xff0c;因为量子计算机既需要量…

智慧水务发展迅猛:从物联网架构到AIoT系统的跨越式升级

AI大模型引领智慧水务迈入新纪元 2025年5月25日&#xff0c;水利部自主研发的“水利标准AI大模型”正式发布&#xff0c;它标志着水务行业智能化进程的重大突破。该模型集成1800余项水利标准、500余项法规及海量科研数据&#xff0c;支持立项、编制、审查等全流程智能管理&…

Java高级 | 【实验五】Spring boot+mybatis操作数据库

隶书文章&#xff1a;Java高级 | &#xff08;二十二&#xff09;Java常用类库-CSDN博客 系列文章&#xff1a;Java高级 | 【实验一】Springboot安装及测试 |最新-CSDN博客 Java高级 | 【实验二】Springboot 控制器类相关注解知识-CSDN博客 Java高级 | 【实验三】Springboot 静…

在MATLAB中使用自定义的ROS2消息

简明结论&#xff1a; 无论ROS2节点和MATLAB运行在哪&#xff0c;MATLAB本机都必须拥有自定义消息源码并本地用ros2genmsg生成&#xff0c;才能在Simulink里订阅这些消息。只要你想让MATLAB或Simulink能识别自定义消息&#xff0c;必须把消息包源码(.msg等)拷到本机指定目录&a…

【MATLAB去噪算法】基于ICEEMDAN联合小波阈值去噪算法

ICEEMDAN联合小波阈值去噪算法相关文献 &#xff08;注&#xff1a;目前相关论文较少&#xff0c;应用该套代码可发直接一些水刊&#xff09; 一、CEEMDAN的局限性 模式残留噪声问题&#xff1a;原始CEEMDAN在计算每个IMF时直接对噪声扰动的信号进行模态分解并平均。 后果&a…

XXTEA,XTEA与TEA

TEA、XTEA和XXTEA都是分组加密算法&#xff0c;它们在设计、安全性、性能等方面存在显著区别。以下是它们的主要区别&#xff1a; 密钥长度 TEA&#xff1a;使用128位密钥。 XTEA&#xff1a;通常使用128位或256位密钥。 XXTEA&#xff1a;密钥长度更灵活&#xff0c;可以使用任…

机器人玩转之---嵌入式开发板基础知识到实战选型指南(包含ORIN、RDK X5、Raspberry pi、RK系列等)

1. 基础知识讲解 1.1 什么是嵌入式开发板&#xff1f; 嵌入式开发板是一种专门设计用于嵌入式系统开发的硬件平台&#xff0c;它集成了微处理器、内存、存储、输入输出接口等核心组件于单块印刷电路板上。与传统的PC不同&#xff0c;嵌入式开发板具有体积小、功耗低、成本适中…

腾讯云国际版和国内版账户通用吗?一样吗?为什么?

在当今全球化的数字化时代&#xff0c;云计算服务成为众多企业和个人拓展业务、存储数据的重要选择。腾讯云作为国内领先的云服务提供商&#xff0c;其国际版和国内版备受关注。那么&#xff0c;腾讯云国际版和国内版账户是否通用&#xff1f;它们究竟一样吗&#xff1f;背后又…

OrCAD X Capture CIS设计小诀窍系列第二季--03.如何在Capture中输出带有目录和元器件信息的PDF

背景介绍&#xff1a;我们在进行原理图设计时&#xff0c;经常需要输出PDF来查看或评审&#xff0c;但通过”Print”功能导出的PDF较为简单&#xff0c;只能查看设计视图&#xff1b;而通过使用Ghostscript软件可以输出带有目录和元器件信息的PDF&#xff0c;让设计师可以直接在…

汽车的安全性能测试:试验台铁地板的重要性

汽车的安全性能测试是非常重要的&#xff0c;其中试验台铁地板的设计和材料选择起着至关重要的作用。试验台铁地板是指在进行汽车碰撞、侧翻等试验时&#xff0c;用于支撑汽车底部和提供稳定支撑的重要部件。 在进行汽车碰撞试验时&#xff0c;试验台铁地板的设计和材料需要具…