在我们的现代世界中,信息无处不在。在了解人们的想法方面,Yelp 表现出色。这不仅仅是一个寻找美食或服务的地方;它是日常用户意见和评级的金矿。但我们如何才能深入挖掘并获取所有这些有价值的信息呢?这就是本博客的用武之地。

抓取 Yelp 可能看起来很棘手,但借助 Python(一种友好且流行的编码语言)的强大功能以及 Crawlbase 爬取 API,它变得轻而易举。我们将一起学习 Yelp 的构建方式、如何获取其数据(创建 Yelp scraper),甚至如何存储数据以供将来使用。因此,无论您是刚刚开始还是已经积累了一些经验,本指南都包含简单的步骤和智能提示,可帮助您充分利用 Yelp 的丰富数据。

目录

  1. 网页抓取和 Yelp
  • 为什么 Yelp 数据很特别?
  1. 了解 Yelp 的结构
  • 深入了解 Yelp 的搜索路径
  • Yelp 的前端技术
  • Yelp 搜索结果页面的结构
  • 识别数据点以进行抓取
  1. 设置环境
  • Python 网络抓取生态系统
  • 安装和设置必要的库
  • 选择正确的开发 IDE
  1. 利用 Crawlbase 抓取 API
  • Crawlbase简介及其特点
  • 此 API 如何简化网页抓取任务
  • 获取 Crawlbase 爬网 API 的令牌
  • Crawlbase Python 库
  1. 使用 Python 创建 Yelp Scraper
  • 为有针对性的搜索创建正确的 URL
  • 利用 Crawlbase Python 库获取 Web 内容
  • 检查 HTML 以获取 CSS 选择器
  • 使用 BeautifulSoup 解析 HTML
  • 合并分页:有效地抓取多个页面
  1. 存储和分析 Yelp 数据
  • 将数据存储到 CSV 文件中
  • 将数据存储到 SQLite 数据库中
  • 如何将抓取的 Yelp 数据用于商业或研究
  1. 最后的话
  2. 常见问题解答

网页抓取和 Yelp

让我们首先讨论一下抓取 Yelp 的有用性。 Yelp 是人们留下有关餐馆、商店等的评论的地方。但您知道我们可以使用工具自动收集这些信息吗?这就是网络抓取的用武之地。这是一种自动从网站收集数据的方法。网络抓取工具无需手动浏览一页又一页的内容,可以提取您需要的数据,从而节省时间和精力。

为什么 Yelp 数据很特别?

为什么要刮掉 Yelp

Yelp 不仅仅是另一个网站;它也是一个网站。这是一个建立在人们的声音和经验之上的平台。 Yelp 上的每条评论、评级和评论都代表某人对企业的个人体验。这种集体反馈描绘了消费者偏好、商业声誉和当地趋势的详细情况。对于企业来说,了解这些反馈可以带来改进和更好的客户关系。对于研究人员来说,它提供了一个真实世界的数据集来分析消费者的行为、偏好和情绪。此外,企业家可以使用抓取的 Yelp 数据来发现市场差距或验证商业想法。从本质上讲,Yelp 数据是了解当地社区和市场脉搏的窗口,使其成为多种用途的重要资源。

了解 Yelp 的结构

Yelp 与许多其他流行网站一样,具有独特的结构和设计,可以满足其庞大的用户群的需求。深入研究这种结构可以为数据的组织、显示和访问方式提供宝贵的见解。

深入了解 Yelp 的搜索路径

Yelp 功能的核心在于其搜索机制,这是一个复杂的系统,旨在为用户提供精确且相关的结果。该系统的核心是用户在寻找信息时遵循的搜索路径或结构化路线。

Yelp 的搜索路径本质上是用户输入平台以优化搜索的步骤或标准的序列。将其视为一系列路标,引导您浏览 Yelp 上列出的众多企业、餐馆和服务。每条路径都是独一无二的,根据用户的偏好和位置量身定制,确保结果既相关又本地化。

示例:

考虑旧金山的用户搜索“披萨”。搜索路径可能涉及用户:

  1. 在搜索栏中输入“披萨”。
  2. 选择“立即开放”、“交付”或“最高评价”等过滤器。
  3. 指定位置或允许 Yelp 使用其当前位置。

在幕后,Yelp 的算法会分析此搜索路径,处理用户的意图,以提供符合条件的披萨店列表。

URL 结构可能如下所示:

1
HTTPS://www.yelp.com/search?find_desc=pizza&find_loc=San+Francisco%2C+CA

find_desc 参数表示搜索描述,在本例中为“餐厅”。同样, find_loc 参数表示位置“旧金山,加利福尼亚州”。这些 URL 参数在指导搜索和检索相关结果方面发挥着关键作用。

对于任何想要从 Yelp 中提取数据的人来说,了解这些搜索路径至关重要。通过了解用户如何浏览平台,我们可以设计更有效的抓取策略,确保我们收集的数据符合用户的期望和搜索行为。

Yelp 的前端技术

Yelp 与许多现代网络平台一样,利用前端技术的组合来提供无缝的交互式用户体验。了解这些技术让我们深入了解 Yelp 如何管理其用户界面,确保快速加载时间、响应能力和用户友好的交互。

  1. HTML:作为网络的基础语言,HTML 构建了 Yelp 页面的内容。它规定了信息的组织方式,确保餐厅名称、评论和评级等数据以结构化方式显示。
  2. 的CSS:CSS 与 HTML 协同工作,决定了 Yelp 页面的视觉呈现。它定义了布局、颜色、字体和其他视觉元素,确保整个网站的设计保持一致且美观。
  3. jQuery的:与 JavaScript 的广泛使用相反,Yelp 主要使用 jQuery 来实现前端交互。这个轻量级 JavaScript 库简化了 DOM 操作、事件处理和 AJAX 请求等任务。虽然 JavaScript 作为一个整体为 Yelp 的动态功能提供了动力,但 jQuery 的简单性和效率可用于更简单的任务,从而确保响应灵敏且流畅的用户界面。
  4. 应对:Yelp 使用的著名前端框架之一是 React。 React 由 Facebook 开发,以其基于组件的架构而闻名,使 Yelp 能够构建可重用的 UI 组件。这不仅简化了开发流程,还确保了网站不同部分的一致用户体验。

Yelp 搜索结果页面的结构

当您在 Yelp 上搜索某些内容(例如餐厅或商店)时,网站会向您显示结果列表。此页面旨在快速、清晰地为您提供所需的信息。

Yelp 搜索页面
  1. 搜索栏:顶部有一个搜索栏,您可以在其中输入您要查找的内容,例如“咖啡”或“书店”。
  2. 筛选:在搜索栏旁边,您会找到过滤器。这些选项可帮助您缩小搜索范围,例如选择查看“正在营业”的地点或按“评分最高”对结果进行排序。
  3. 结果列表:在搜索栏和过滤器下方,您将看到与您的搜索匹配的企业列表。每个企业通常都会显示其名称、照片、评级,有时还会显示简短的描述或评论片段。
  4. 地图位置:页面右侧通常有一张地图,显示企业所在位置。这可以帮助您决定哪个地方离您最近或更容易到达。
  5. 其他详细信息:单击公司名称或照片通常会将您带到包含更多信息的详细页面。这可能包括营业时间、地址、电话号码以及其他 Yelp 用户的更多评论。

总之,Yelp 的搜索结果页面的结构是用户友好的。它以清晰的列表显示企业,提供有用的过滤器,并在您想了解有关特定地点的更多信息时提供其他详细信息。

识别数据点以进行抓取

在抓取 Yelp 等网站时,了解您想要提取哪些信息至关重要。这些特定的信息被称为“数据点”。识别正确的数据点可确保您的抓取有效并提供您需要的数据。以下是指导您的细分:

  1. 公司名称:餐厅、商店或服务提供商的名称。
  2. 评分:用户给出的平均分数,通常以星号或数字表示。
  3. 评论 :客户的实际评论或反馈。这可以深入了解企业的​​质量和声誉。
  4. 地址:企业的实际位置,包括街道、城市,有时甚至是社区。
  5. 电话号码:联系商家的联系电话。
  6. 营业时间:有关营业时间的信息,这对于计划前往的用户至关重要。
  7. 价格范围:对企业的成本或承受能力的估计,通常分为美元符号($ 到 $$$)。
  8. 图片:企业的视觉表现,可以包括内部照片、食物图像或其他相关图片。
  9. 网站网址:企业官方网站的链接(如果有)。
  10. 附加信息:根据业务类型,可能会有特定的数据点,例如餐厅的菜单项或水疗中心和沙龙提供的服务。

在规划您的抓取项目时,请列出这些数据点并根据您的要求对它们进行优先级排序。这种结构化方法可确保您收集所有必要的信息,而不会出现不必要的混乱,从而使您的抓取过程更加高效和集中。

设置环境

为了使用 Python 抓取 Yelp,拥有合适的工具至关重要。正确设置您的环境可确保流畅的抓取体验。让我们逐步完成启动并运行所有内容的初始步骤。

Python 网络抓取生态系统

Python 以其简单性和多功能性而闻名,是网络抓取任务的热门选择。其丰富的生态系统提供了大量专为抓取、数据提取和分析而定制的库。一个这样强大的工具是 BeautifulSoup4 (通常缩写为 BS4),一个帮助从 HTML 和 XML 文件中提取数据的库。加上 Crawlbase,它通过处理复杂的网络交互来简化抓取过程,以及 Pandas,一个数据操作库,可将抓取的数据构建为可读格式,您拥有适合任何抓取工作的强大工具包。

安装和设置必要的库

要为抓取任务配备 Python 环境,请执行以下关键步骤:

  1. 蟒蛇:如果您的系统上尚未安装 Python,请访问 官方网站 下载并安装适合您操作系统的版本。按照安装说明启动并运行 Python。
  2. 皮普:作为Python的包管理器,Pip方便了库的安装和管理。虽然许多 Python 安装都与 Pip 捆绑在一起,但请确保它在您的设置中可用。
  3. 虚拟环境:采用虚拟环境是一个谨慎的做法。它为您的项目创建一个隔离的空间,确保依赖项与其他项目保持隔离。要启动虚拟环境,请执行:
1
python -m venv myenv

打开命令提示符或终端并使用以下命令之一激活环境:

1
2
3
4
5
# 窗口
myenv\Scripts\activate

#macOS/Linux
资源 myenv/bin/激活
  1. 安装所需的库:下一步是安装必要的库。打开命令提示符或终端并运行以下命令:
1
2
3
4
5
点安装beautifulsoup4
点安装爬虫库
pip 安装熊猫
点安装 matplotlib
点安装 scikit-learn

安装这些库后,您就可以开始网络抓取之旅了。确保正确设置您的环境不仅可以为高效抓取铺平道路,还可以确保您充分利用可用工具的潜力。

选择正确的开发 IDE

选择正确的集成开发环境 (IDE) 可以显着提高生产力。 虽然您可以在简单的文本编辑器中编写 JavaScript 代码,但使用专用 IDE 可以提供代码完成、调试工具和版本控制集成等功能。

用于 JavaScript 开发的一些流行 IDE 包括:

  • Visual Studio 代码(VS 代码):VS Code 是 Microsoft 开发的免费开源代码编辑器。它拥有一个充满活力的社区,为 JavaScript 开发提供了广泛的扩展。
  • 网络风暴:WebStorm 是 JetBrains 的一款商业 IDE,以其智能编码帮助和强大的 JavaScript 支持而闻名。
  • 崇高的文字:Sublime Text 是一款轻量级、可自定义的文本编辑器,因其速度和可扩展性而受到开发人员的欢迎。

选择适合您的偏好和工作流程的 IDE。

利用 Crawlbase 抓取 API

Crawlbase 爬取 API 作为一种多功能解决方案,专为应对复杂的网络抓取而定制,特别是在 Yelp 等动态内容需要熟练处理的场景中。该 API 改变了游戏规则,简化了对 Web 内容的访问、渲染 JavaScript 以及呈现可供解析的 HTML 内容。

此 API 如何简化网页抓取任务

网络抓取的核心涉及从网站获取数据。然而,真正的挑战在于浏览迷宫般的 Web 结构、处理验证码等潜在陷阱以及确保数据完整性。 Crawlbase 通过提供以下功能来简化这些任务:

  1. JavaScript渲染:许多网站(包括 Airbnb)严重依赖 JavaScript 进行动态内容加载。 Crawlbase API 熟练地处理这些元素,确保全面访问 Airbnb 的动态渲染页面。
  2. 简化的请求:API 抽象化了管理的复杂性 HTTP请求、cookie 和会话。 这使您可以专注于完善抓取逻辑,而 API 可以无缝处理技术细微差别。
  3. 结构良好的数据:通过 API 获取的数据通常结构良好、精简 数据解析 和提取过程。 这可确保您能够高效地从 Airbnb 检索所需的定价信息。
  4. 可扩展性:Crawlbase Crawling API 通过高效支持可扩展的抓取 管理多个请求 同时。 在处理 Airbnb 上多样化且广泛的定价信息时,这种可扩展性尤其有利。

备注:Crawlbase 抓取 API 提供了大量可供您使用的参数,使您能够微调您的抓取请求。 这些参数可以根据您的独特需求进行定制,使您的网络抓取工作更加高效和精确。 您可以在以下位置探索可用参数的完整列表 API文档.

获取 Crawlbase 爬网 API 的令牌

要访问 Crawlbase 抓取 API,您需要一个 API 令牌。以下是获取指南的简单指南:

  1. 访问 Crawlbase 网站:打开您的网络浏览器并导航至 Crawlbase 注册页面 开始注册过程。
  2. 提供您的详细信息:系统会要求您提供电子邮件地址并为您的 Crawlbase 帐户创建密码。 填写所需信息。
  3. 企业验证:提交详细信息后,您可能需要验证您的电子邮件地址。 检查您的收件箱中是否有来自 Crawlbase 的验证电子邮件,然后按照提供的说明进行操作。
  4. 登录 :验证您的帐户后,返回 Crawlbase 网站并使用您新创建的凭据登录。
  5. 访问您的 API 令牌:您需要 API 令牌才能使用 Crawlbase 抓取 API。您可以找到您的 API 令牌 点击此处.

备注:Crawlbase 提供两种类型的令牌,一种用于静态网站,另一种用于动态或 JavaScript 驱动的网站。由于我们正在抓取 Yelp,因此我们将选择普通令牌。 Crawlbase 慷慨地为 Crawling API 提供 1,000 个免费请求的初始限额,使其成为我们网络抓取项目的绝佳选择。

Crawlbase Python 库

Crawlbase Python 库 提供了一种与 Crawlbase Crawling API 交互的简单方法。您可以使用这个轻量级且无依赖项的 Python 类作为 Crawlbase API 的包装器。首先,使用您的 Crawlbase 令牌初始化 Crawling API 类。然后,您可以通过提供要抓取的 URL 和任何所需的选项(例如自定义用户代理或响应格式)来发出 GET 请求。例如,您可以抓取网页并访问其内容,如下所示:

1
2
3
4
5
6
7
8
9
 爬行基地 进口 抓取API

# 初始化CrawlingAPI类
api = 爬行API({ '令牌': 'YOUR_CRAWLBASE_TOKEN' })

# 发出 GET 请求来抓取网页
响应 = api.get('https://www.example.com')
if 回复['状态代码'] == 200:
打印(回复['身体'])

该库简化了获取 Web 数据的过程,对于需要动态内容、IP 轮换和 Crawlbase API 的其他高级功能的场景特别有用。

使用 Python 创建 Yelp Scraper

Yelp 提供了大量信息,而 Python 强大的库使我们能够有效地提取这些数据。让我们深入研究使用 Python 获取和解析 Yelp 数据的复杂性。

为有针对性的搜索创建正确的 URL

要从 Yelp 检索特定数据,构建正确的搜索 URL 至关重要。例如,如果我们热衷于抓取旧金山的意大利餐厅,我们的 Yelp URL 将类似于:

1
HTTPS://www.yelp.com/search?find_desc=意大利+餐厅&f​​ind_loc=San+Francisco%2C+CA

这里:

  • find_desc 精准定位业务类别。
  • find_loc 指定位置。

利用 Crawlbase Python 库获取 Web 内容

Crawlbase提供了一种获取网页内容的有效方法。通过将其与 Python 集成,我们的抓取工作变得更加简化。用于获取 Yelp 内容的片段如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 爬行基地 进口 抓取API

# 将“YOUR_CRAWLBASE_TOKEN”替换为您的实际 Crawlbase API 令牌
api_令牌= 'YOUR_CRAWLBASE_TOKEN'
crawlbase_api = 爬行API({ '令牌': api_token })

耶尔普_网址 = “https://www.yelp.com/search?find_desc=Italian+Restaurants&find_loc=San+Francisco%2C+CA”

响应=crawlbase_api.get(yelp_url)

if 回复['状态代码'] == 200:
# 解码字节数据后提取的HTML内容
html_内容=响应['身体']。解码('拉丁1')
打印(html_内容)
其他:
打印(f"请求失败,状态码 {回复['状态代码']}: {回复['身体']}")

要启动 Yelp 抓取过程,请按照以下简单步骤操作:

  1. 创建脚本:首先创建一个新的 Python 脚本文件。命名它 yelp_scraping.py.
  2. 粘贴代码:复制之前提供的代码并将其粘贴到您新创建的 yelp_scraping.py 文件中。
  3. 执行:打开命令提示符或终端。
  4. 运行脚本:导航到包含的目录 yelp_scraping.py 并使用以下命令执行脚本:
1
蟒蛇 yelp_scraping.py

执行后,页面的 HTML 内容将显示在您的终端中。

HTML 输出

检查 HTML 以获取 CSS 选择器

从列表页面收集 HTML 内容后,下一步是研究其布局并找到我们想要的具体数据。这就是 Web 开发工具和浏览器开发工具可以提供很大帮助的地方。以下是有关如何使用这些工具有效抓取 Yelp 的简单指南。首先,检查 HTML 布局以确定我们感兴趣的区域。然后,搜索正确的 CSS 选择器以获取所需的数据。

Yelp 搜索页面检查
  1. 打开网页:导航至 Yelp 网站并登陆您感兴趣的房产页面。
  2. 右键单击并检查:在要提取的元素上使用右键单击能力,然后从上下文菜单中选择“检查”或“检查元素”。这个神秘的咒语将召唤浏览器的开发工具。
  3. 找到 HTML 源代码:在开发者工具的范围内,网页的 HTML 源代码将揭露其秘密。 将光标悬停在 HTML 面板中的各个元素上,然后见证网页的相应部分神奇地亮起。
  4. 识别 CSS 选择器:要从特定元素中释放数据,请在开发人员工具中右键单击它,然后优雅地选择“复制”>“复制选择器”。 这个优雅的操作会将该元素的 CSS 选择器传输到剪贴板,准备好在网页抓取咒语中使用。

一旦有了这些选择器,您就可以继续构建 Yelp 抓取工具以有效地提取所需信息。

使用 BeautifulSoup 解析 HTML

获取原始 HTML 内容后,接下来的挑战是提取有意义的数据。这就是 BeautifulSoup 发挥作用的地方。它是一个解析 HTML 和 XML 文档的 Python 库,提供用于导航解析树并在其中搜索的工具。

使用 BeautifulSoup,您可以精确定位特定的 HTML 元素并提取所需的信息。在我们的 Yelp 示例中,BeautifulSoup 帮助从获取的页面中提取餐厅名称、评分、评论计数、地址、价格范围和热门商品。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON

# 初始化Crawlbase API
API_TOKEN = 'YOUR_CRAWLBASE_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})

DEF fetch_yelp_page(网址):
"""获取并解码 Yelp 页面内容。"""
响应=crawling_api.get(url)
if 回复['状态代码'] == 200:
回报 回复['身体']。解码('拉丁1')
其他:
打印(f"请求失败,状态码 {回复['状态代码']}: {回复['身体']}")
回报 不包含

DEF 提取餐厅信息(列表卡):
"""从单个餐厅列表卡中提取详细信息。"""
name_element = Listing_card.select_one('div[class*="businessName"] h3 > span > a')
rating_element = Listing_card.select_one('div.css-volmcs + div.css-1jq1ouh > span:first-child')
review_count_element = Listing_card.select_one('div.css-volmcs + div.css-1jq1ouh > span:last-child')
流行_项目_元素=列表_卡.选择('div[class*="priceCategory"] div > p > span:first-child a')
价格范围元素 = 列表卡.select_one('div[class*="priceCategory"] div > p > span:not(.css-chan6m):nth-child(2)')
地址元素 = 列表卡.select_one('div[class*="priceCategory"] div > p > span:last-child')

回报 {
「餐厅名称」: name_element.text.strip() if 名称元素 其他 不包含,
“评分”: rating_element.text.strip() if 评级元素 其他 不包含,
「评论数」: review_count_element.text.strip() if 评论计数元素 其他 不包含,
“地址”: 地址元素.text.strip() if 地址元素 其他 不包含,
“价格范围”: Price_range_element.text.strip() if 价格范围元素 其他 不包含,
「热门商品」: ','.join([元素.text.strip() 对于 element in 流行_项目_元素]) if 流行_项目_元素 其他 不包含
}

DEF 提取餐厅信息(html_内容):
"""从 HTML 内容中提取餐厅详细信息。"""
汤 = BeautifulSoup(html_content, 'html.parser')
清单卡 = soup.select('div[data-testid="serp-ia-card"]:not(.ABP)')

回报 [提取餐厅信息(卡) 对于in 列表卡]

if __名字__ == “__主要的__”:
耶尔普_网址 = “https://www.yelp.com/search?find_desc=Italian+Restaurants&find_loc=San+Francisco%2C+CA”
html_content = fetch_yelp_page(yelp_url)

if html_内容:
餐厅数据=提取餐厅信息(html_内容)
打印(json.dumps(restaurants_data, 缩进=2))

此 Python 脚本使用 CrawlingAPI 从crawlbase库中获取网页内容。主要功能有:

  1. fetch_yelp_page(url):使用 Crawlbase 从给定 URL 检索 HTML 内容。
  2. extract_restaurant_info(listing_card):从 HTML 卡中解析单个餐厅的详细信息。
  3. extract_restaurants_info(html_content):从整个 Yelp 页面的 HTML 中收集所有餐厅详细信息。

直接运行时,它从旧金山的 Yelp 获取意大利餐厅数据并将其输出为格式化 JSON。

输出样本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
[
{
「餐厅名称」: “贝拉餐厅”,
“评分”: “4.3”,
「评论数」: “(1.9k 条评论)”,
“地址”: 《内里士满》,
“价格范围”: “$$”,
「热门商品」: “意大利、酒吧、面食店”
},
{
「餐厅名称」: “宝缇嘉”,
“评分”: “4.3”,
「评论数」: “(974 条评论)”,
“地址”: “使命”,
“价格范围”: “$$”,
「热门商品」: “意大利面、面食店、披萨”
},
{
「餐厅名称」: 《索托马雷》,
“评分”: “4.3”,
「评论数」: “(5.2k 条评论)”,
“地址”: “北海滩/电报山”,
“价格范围”: “$$”,
「热门商品」: 「海鲜、意大利、酒吧」
},
{
「餐厅名称」: “巴加特拉”,
“评分”: “4.8”,
「评论数」: “(50 条评论)”,
“地址”: “码头/牛洞”,
“价格范围”: ,
「热门商品」: “新美式、意式、地中海”
},
{
「餐厅名称」: 《奥费纳》,
“评分”: “4.5”,
「评论数」: “(58 条评论)”,
“地址”: “湖边”,
“价格范围”: ,
「热门商品」: 「意大利、酒吧」
},
{
「餐厅名称」: “卡萨罗奥斯特里亚”,
“评分”: “4.4”,
「评论数」: “(168 条评论)”,
“地址”: “码头/牛洞”,
“价格范围”: “$$”,
「热门商品」: “披萨、鸡尾酒吧”
},
{
「餐厅名称」: 《七座山》,
“评分”: “4.5”,
「评论数」: “(1.3k 条评论)”,
“地址”: 《俄罗斯山》,
“价格范围”: “$$$”,
「热门商品」: “意大利菜、酒吧”
},
{
「餐厅名称」: 《菲奥雷拉-日落》,
“评分”: “4.1”,
「评论数」: “(288 条评论)”,
“地址”: 《内在的夕阳》,
“价格范围”: “$$$”,
「热门商品」: “意大利菜、披萨、鸡尾酒吧”
},
{
「餐厅名称」: “面食供应公司”,
“评分”: “4.4”,
「评论数」: “(127 条评论)”,
“地址”: 《内里士满》,
“价格范围”: “$$”,
「热门商品」: 「面食店」
},
{
「餐厅名称」: “Trattoria da Vittorio - 旧金山”,
“评分”: “4.3”,
「评论数」: “(963 条评论)”,
“地址”: 《西门》,
“价格范围”: “$$”,
「热门商品」: “意大利比萨”
}
]

为 Yelp 合并分页

当抓取像 Yelp 这样跨多个页面显示结果的平台时,分页至关重要。每个页面通常包含结果的子集,如果不处理分页,您只需从初始页面中抓取数据。要检索全面的数据,必须迭代每一页结果。

为了通过 Yelp 实现这一点,我们将利用 URL 参数 &start= 它指定每个页面上显示结果的起点。

让我们更新现有代码以合并分页:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON

# 初始化Crawlbase API
API_TOKEN = 'YOUR_CRAWLBASE_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})

DEF fetch_yelp_page(网址):
"""获取并解码 Yelp 页面内容。"""
# ... [其余功能保持不变]

DEF 提取餐厅信息(列表卡):
"""从单个餐厅列表卡中提取详细信息。"""
# ... [其余功能保持不变]

DEF 提取餐厅信息(html_内容):
"""从 HTML 内容中提取餐厅详细信息。"""
# ... [其余功能保持不变]

if __名字__ == “__主要的__”:
基本网址 = “https://www.yelp.com/search?find_desc=Italian+Restaurants&find_loc=San+Francisco%2C+CA”
所有餐厅数据 = []
# 根据您想要抓取的结果数量调整范围
对于 开始 in 范围(0, 51, 10):
yelp_url = 基本网址 + f"&开始={开始}"
html_content = fetch_yelp_page(yelp_url)
if html_内容:
餐厅数据=提取餐厅信息(html_内容)
all_restaurants_data.extend(restaurants_data)

打印(json.dumps(all_restaurants_data, 缩进=2))

在更新后的代码中,我们循环遍历范围 start 值 (0, 10, 20, …, 50) 从 Yelp 搜索结果的每个页面获取数据。然后我们扩展 all_restaurants_data 列出每页的数据。如果您想抓取更多或更少的结果,请记住调整范围。

存储和分析 Yelp 数据

成功从 Yelp 中抓取数据后,接下来的关键步骤包括存储这些数据以供将来使用并从中提取见解。您收集的数据对于从业务策略到学术研究的各种应用来说都是非常宝贵的。本节将指导您如何有效地存储抓取的 Yelp 数据以及该数据的潜在应用。

将数据存储到 CSV 文件中

CSV 是一种广泛认可的表格数据文件格式。它提供了一种简单有效的方法来存档和共享您的 Yelp 数据。蟒蛇的 pandas 库提供了一个用户友好的界面来处理数据操作,包括将数据写入 CSV 文件的能力。

让我们更新之前的脚本以合并此更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 大熊猫 as pd

# 初始化Crawlbase API
API_TOKEN = 'YOUR_CRAWLBASE_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})

DEF fetch_yelp_page(网址):
"""获取并解码 Yelp 页面内容。"""
# ... [其余功能保持不变]

DEF 提取餐厅信息(列表卡):
"""从单个餐厅列表卡中提取详细信息。"""
# ... [其余功能保持不变]

DEF 提取餐厅信息(html_内容):
"""从 HTML 内容中提取餐厅详细信息。"""
# ... [其余功能保持不变]

DEF 保存到csv(数据列表,文件名):
"""使用 pandas 将数据保存到 CSV 文件。"""
df = pd.DataFrame(data_list)
df.to_csv(文件名,索引=)

if __名字__ == “__主要的__”:
基本网址 = “https://www.yelp.com/search?find_desc=Italian+Restaurants&find_loc=San+Francisco%2C+CA”
所有餐厅数据 = []
# 根据您想要抓取的结果数量调整范围
对于 开始 in 范围(0, 51, 10):
yelp_url = 基本网址 + f"&开始={开始}"
html_content = fetch_yelp_page(yelp_url)
if html_内容:
餐厅数据=提取餐厅信息(html_内容)
all_restaurants_data.extend(restaurants_data)

save_to_csv(所有餐厅数据, 'yelp_restaurants.csv')

save_to_csv 函数使用 pandas 将给定的数据列表转换为 DataFrame,然后使用提供的文件名将其保存为 CSV 文件。

yelp_restaurants.csv 预习:

yelp_restaurants.csv 预览

将数据存储到 SQLite 数据库中

SQLite 是一个轻量级的基于磁盘的数据库,不需要单独的服务器进程。它非常适合较小的应用程序或当您需要独立数据库时。蟒蛇的 sqlite3 库允许您与 SQLite 数据库无缝交互。

让我们更新之前的脚本以合并此更改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
进口 sqlite3
爬行基地 进口 抓取API
bs4 进口 美丽汤

# 初始化Crawlbase API
API_TOKEN = 'YOUR_CRAWLBASE_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})

DEF fetch_yelp_page(网址):
"""获取并解码 Yelp 页面内容。"""
# ... [其余功能保持不变]

DEF 提取餐厅信息(列表卡):
"""从单个餐厅列表卡中提取详细信息。"""
# ... [其余功能保持不变]

DEF 提取餐厅信息(html_内容):
"""从 HTML 内容中提取餐厅详细信息。"""
# ... [其余功能保持不变]

DEF 保存到数据库(数据列表、数据库名称):
"""将数据保存到 SQLite 数据库。"""
conn = sqlite3.connect(db_name)
光标 = conn.cursor()

# 创建表
游标.执行('''
如果不存在则创建表餐厅 (
id 整数主键自动增量,
名称文本,
评级真实,
评论计数 INTEGER,
地址文本,
价格范围文本,
流行_项目文本
)
''')

# 插入数据
对于 RESTAURANT in 数据列表:
游标.执行(“插入餐厅(名称、评分、评论计数、地址、价格范围、热门项目)值 (?, ?, ?, ?, ?, ?)”,
(餐厅[「餐厅名称」], 餐厅[“评分”], 餐厅[「评论数」], 餐厅[“地址”], 餐厅[“价格范围”], 餐厅[「热门商品」]))

conn.commit()
conn.close()

if __名字__ == “__主要的__”:
基本网址 = “https://www.yelp.com/search?find_desc=Italian+Restaurants&find_loc=San+Francisco%2C+CA”
所有餐厅数据 = []
# 根据您想要抓取的结果数量调整范围
对于 开始 in 范围(0, 51, 10):
yelp_url = 基本网址 + f"&开始={开始}"
html_content = fetch_yelp_page(yelp_url)
if html_内容:
餐厅数据=提取餐厅信息(html_内容)
all_restaurants_data.extend(restaurants_data)

save_to_database(all_restaurants_data, 'yelp_restaurants.db')

save_to_database 函数将列表中的数据存储到 SQLite 数据库中。它首先连接到数据库并确保存在名为“restaurants”的表并具有特定列。然后,它将列表中每个餐厅的数据插入到该表中。插入所有数据后,它保存更改并关闭数据库连接。

restaurants 表格预览:

餐厅 表格预览

如何将抓取的 Yelp 数据用于商业或研究

Yelp 拥有庞大的评论、评级和其他商业相关信息库,为企业和研究人员提供了丰富的见解金矿。抓取完这些数据后,下一步就是对其进行分析和可视化,从而获得可操作的见解。

业务洞察:

  1. 竞争力分析:通过分析竞争对手的评级和评论,企业可以确定自己的产品需要改进的领域。
  2. 客户喜好:了解客户喜欢或不喜欢类似业务的哪些方面,并相应地调整您的策略。
  3. 趋势去渍:通过分析评论模式和热门商品来识别市场中的新兴趋势。

研究机会:

  1. 消费者行为:深入研究客户评论,了解购买行为、偏好和痛点。
  2. 市场趋势:监控消费者情绪随时间的变化,以确定不断变化的市场趋势。
  3. 地理分析:比较不同地点的业务绩效、评级和评论。

可视化数据:

为了使数据更易于理解和吸引人,可视化发挥着至关重要的作用。让我们考虑一个简单的例子:一个条形图,显示平均评分在不同价格范围内的变化。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
进口 matplotlib.pyplot as PLT
进口 大熊猫 as pd
爬行基地 进口 抓取API
bs4 进口 美丽汤
sklearn。预处理 进口 标签编码器

# 初始化Crawlbase API
API_TOKEN = 'YOUR_CRAWLBASE_TOKEN'
爬行 API = 爬行 API({'令牌':API_TOKEN})

DEF fetch_yelp_page(网址):
"""获取并解码 Yelp 页面内容。"""
# ... [其余功能保持不变]

DEF 提取餐厅信息(列表卡):
"""从单个餐厅列表卡中提取详细信息。"""
# ... [其余功能保持不变]

DEF 提取餐厅信息(html_内容):
"""从 HTML 内容中提取餐厅详细信息。"""
# ... [其余功能保持不变]

DEF 绘图图(data):
# 将数据转换为 pandas DataFrame
df = pd.DataFrame(数据)

# 初始化标签编码器
label_encoder = LabelEncoder()

# 对“价格范围”列进行编码
df[“价格范围编码”] = label_encoder.fit_transform(df['价格范围'])

# 将“评级”列转换为浮点数
df['评分'] = pd.to_numeric(df['评分'],错误='胁迫', 垂头丧气='漂浮')

# 删除“Rating”为 NaN 的行
df = df.dropna(子集=['评分'])

# 计算每个价格范围的平均评分
平均评级 = df.groupby(“价格范围编码”)[“评分”]。意思是()

# 打印原始标签及其编码值
原始标签=标签编码器.classes_
对于 编码值,标签 in 枚举(原始标签):
打印(f"价格范围值: {编码值} 对应标签: {标签}")

# 创建条形图
plt.图(图大小=(10, 6))
avg_ ratings.plot(种类='酒吧', 颜色='天蓝色')
plt. 标题(“按价格范围划分的平均评分”)
plt.x标签('价格范围')
plt.ylabel(“平均评分”)
plt.xticks(旋转=45)
plt.网格(轴='你', 线型='--', 阿尔法 =0.7)
plt.tight_layout()

# 显示情节
plt.show()

if __名字__ == “__主要的__”:
基本网址 = “https://www.yelp.com/search?find_desc=Italian+Restaurants&find_loc=San+Francisco%2C+CA”
所有餐厅数据 = []
# 根据您想要抓取的结果数量调整范围
对于 开始 in 范围(0, 51, 10):
yelp_url = 基本网址 + f"&开始={开始}"
html_content = fetch_yelp_page(yelp_url)
if html_内容:
餐厅数据=提取餐厅信息(html_内容)
all_restaurants_data.extend(restaurants_data)

绘图图(所有餐厅数据)

输出图:

输出条形图

该图表可以成为了解客户对定价的看法的有用工具,并可以指导餐厅的定价策略或营销工作。

最后的话

本指南为您提供了使用 Python 和 Crawlbase 抓取 API 轻松抓取 Yelp 搜索列表的基本知识和工具。无论您是新手还是有一些经验,这里解释的想法都为您的努力提供了一个强有力的起点。

当您继续您的网络抓取之旅时,请记住这些技能的多功能性不仅限于 Yelp。探索我们针对以下平台的附加指南 Expedia的, deviantART的, Airbnb的Glassdoor,拓宽您的抓取专业知识。

网络抓取带来了挑战,我们对您成功的承诺超出了本指南的范围。 如果您遇到障碍或寻求进一步指导, Crawlbase支持团队 已准备好提供协助。 您在网络抓取方面的成功是我们的首要任务,我们期待在您的抓取之旅中为您提供支持。

常见问题解答

问:抓取 Yelp 数据的合法性是什么?

网络抓取活动通常在合法性和道德方面都存在微妙的界限。对于像 Yelp 这样的平台,首先查阅 Yelp 的服务条款和 robots.txt 文件。这些文件提供了有关平台允许和限制哪些活动的见解。此外,虽然 Yelp 的内容可公开访问,但您访问内容的方式和数量可能会被视为滥用或恶意。此外,从用户的评论或个人资料中删除个人数据可能会违反各个司法管辖区的隐私法规。始终优先考虑理解和遵守平台的准则和适用法律。

问:我应该多久更新一次抓取的 Yelp 数据?

更新抓取数据的频率取决于项目的性质以及 Yelp 上数据的动态性。如果您的目标是捕获实时趋势、用户评论或当前定价信息,则可能需要更频繁的更新。然而,过于频繁的抓取可能会给 Yelp 的服务器带来压力,并可能导致您的 IP 地址被封锁。建议保持平衡:确定项目及时更新的重要性,同时尊重 Yelp 的基础设施。监控 Yelp 的更新频率或设置重大变化警报也可以指导您的抓取间隔。

问:我可以将抓取的 Yelp 数据用于商业目的吗?

使用从 Yelp 等平台抓取的数据进行商业活动会带来复杂的挑战。 Yelp 的服务条款明确禁止抓取,未经许可使用其数据获取商业利益可能会导致法律后果。咨询法律专业人士以了解数据使用权和知识产权法的细微差别至关重要。如果确实需要在商业上利用 Yelp 的数据,请考虑联系 Yelp 的数据合作伙伴或许可部门。它们可能提供获得合法访问或合作机会的途径。始终优先考虑透明度、道德数据使用以及获得明确的许可以降低风险。

问:如何确保抓取的 Yelp 数据的准确性?

确保抓取数据的准确性和可靠性是任何数据驱动项目的基础。从 Yelp 或类似平台进行抓取时,首先要在抓取脚本中实现强大的错误处理机制。这些机制可以检测并纠正常见问题,例如连接超时、数据检索不完整或不匹配。定期根据实时源验证提取的数据,确保您的抓取逻辑与 Yelp 网站上的任何更改保持一致。此外,考虑在抓取后实施数据验证检查以捕获任何异常或不一致的情况。定期进行人工审核或与受信任的二手来源进行交叉引用可以充当进一步的验证层,从而提高抓取的 Yelp 数据集的整体质量和可信度。