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

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

目录

  1. 为什么要抓取 Yelp?
  • Yelp 数据抓取为何如此特别?
  1. Yelp 抓取库和工具
  • 使用 Python 进行 Yelp 网页抓取
  • 安装和设置必要的库
  • 选择正确的开发 IDE
  1. 利用 Crawlbase Crawling API
  • Crawlbase简介及其特点
  • 此 API 如何简化网页抓取任务
  • 获取 Crawlbase 的令牌 Crawling API
  • Crawlbase Python 库
  1. 如何使用 Python 创建 Yelp 爬虫
  • 为有针对性的搜索创建正确的 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 抓取库和工具

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

使用 Python 进行 Yelp 网页抓取

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

安装和设置必要的库

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

  1. Python :如果您的系统上尚未安装 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 Crawling API

这款 爬虫库 Crawling 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. 可扩展性: 爬行基地 Crawling API 通过高效支持可扩展抓取 管理多个请求 同时。 在处理 Airbnb 上多样化且广泛的定价信息时,这种可扩展性尤其有利。

备注: 爬行基地 Crawling API 提供多种参数供您使用,使您能够微调您的抓取请求。这些参数可以根据您的独特需求进行定制,使您的网页抓取工作更加高效和精确。您可以在 API文档.

获取 Crawlbase 的令牌 Crawling API

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

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

备注:Crawlbase 提供两种类型的令牌,一种用于静态网站,另一种用于动态或 JavaScript 驱动的网站。由于我们要抓取 Yelp,因此我们将选择普通令牌。Crawlbase 慷慨地为 Crawling API,使其成为我们网络抓取项目的绝佳选择。

Crawlbase Python 库

这款 Crawlbase Python 库 提供一种与 Crawlbase 交互的简单方法 Crawling API。您可以使用这个轻量级且无依赖关系的 Python 类作为 Crawlbase API 的包装器。首先,初始化 Crawling API 类与您的 Crawlbase 令牌。然后,您可以通过提供要抓取的 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 爬虫

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 内容后,下一步就是研究其布局,找到我们想要的具体数据。 网站开发工具 和浏览器开发人员工具可以提供很大帮助。以下是有关如何使用这些工具高效地从 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)

绘图图(所有餐厅数据)

输出图:

输出条形图

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

使用 Crawlbase 构建 Yelp 爬虫

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

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

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

常见问题

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

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

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

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

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

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

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