Just Eat 是全球领先的在线食品配送平台之一,它将数百万消费者与他们最喜欢的餐厅联系起来。该平台提供有关餐厅列表、菜单、评分和评论的详细信息,对于希望分析食品配送趋势或构建数据驱动解决方案的企业、研究人员和开发人员来说,它是一个金矿。

2023 年,Just Eat 推出了 5.2十亿€,结束了 60千万 全球活跃用户超过 374,000 在全球范围内与餐厅合作,提供丰富的菜系选择。英国网站在餐厅和外卖类别中排名第一,是市场领导者。

在这篇博客中,我们将使用 Python 和 Crawlbase 爬取 Just Eat Crawling API。您将学到以下内容:

  • 提取餐厅和菜单数据。
  • 处理基于滚动的分页。
  • 保存并构造抓取的数据。

让我们开始吧!

目录

  1. 为什么要抓取 Just Eat 数据?
  2. 从 Just Eat 中提取的关键数据点
  3. 爬虫库 Crawling API 只吃刮痧
  • 安装 Crawlbase Python 库
  1. 设置 Python 环境
  • 安装 Python 和所需的库
  • 选择正确的 IDE 进行网页抓取
  1. 抓取 Just Eat 餐厅列表
  • 检查 HTML 以识别选择器
  • 编写 Just Eat 搜索列表抓取工具
  • 处理基于滚动的分页
  • 将抓取的数据存储在 JSON 文件中
  • 完整的 Python 代码示例
  1. 在 Just Eat 上抓取餐厅菜单
  • 检查菜单页面 HTML 中的选择器
  • 编写菜单抓取工具
  • 处理菜单分页
  • 将菜单数据存储在 JSON 文件中
  • 完整的 Python 代码示例
  1. 总结
  2. 常见问题解答(FAQ)

为什么要抓取 Just Eat 数据?

Just Eat 是外卖行业的巨头,拥有丰富的数据,可以用于很多事情。下图显示了抓取 Just Eat 数据的一些原因:

从 Just Eat 提取数据的原因

从 Just Eat 中提取的关键数据点

从 Just Eat 抓取数据时,你应该关注最有价值和最相关的信息。下图显示了你可以从平台中提取的内容:

从 Just Eat 抓取的关键数据点

爬虫库 Crawling API 只吃刮痧

这款 爬虫库 Crawling API 让 Just Eat 数据抓取变得简单直接。以下是 Just Eat 为何 Crawling API 非常适合 Just Eat 抓取:

  • 处理 JavaScript 渲染的内容:Just Eat 使用 JavaScript 显示餐厅详情和菜单。Crawlbase 确保在抓取之前所有内容都已完全加载。
  • IP旋转:Crawlbase 会轮换 IP 以避免被阻止,这样您就可以抓取多个页面而不会达到速率限制或 CAPTCHA。
  • 可定制的请求:您可以自定义标头、cookie 和其他参数以满足您的需求。
  • 基于滚动的分页:Just Eat 使用无限滚动来加载更多结果。Crawlbase 支持长时间滚动,因此您可以获取所有数据。

Crawlbase Python 库

Crawlbase 提供了 Python 库 使用其产品。通过它,您可以使用 Crawling API 很容易。首先,您需要您的 Crawlbase 访问令牌,您可以通过 报名 为了他们的服务。

Crawlbase 提供两种类型的令牌。一种是用于静态站点的普通令牌,另一种是用于 JS 呈现站点的 JS 令牌。Crawlbase 为其免费提供 1,000 个请求 Crawling API。 请参阅 文件 了解更多信息。

在下一部分中,我们将介绍如何为 Just Eat 抓取设置 Python 环境。

设置 Python 环境

在我们开始抓取 Just Eat 数据之前,您需要设置 Python 环境。良好的环境意味着您的脚本将顺利运行。

安装 Python 和所需的库

首先,确保你的系统上安装了 Python。你可以从 Python官方网站。安装后,通过在终端或命令提示符中运行以下命令来检查安装:

1
python --version

然后,使用 pip 安装所需的库。在本教程中,您需要:

  • **crawlbase**:用于与 Crawlbase 交互 Crawling API.
  • **beautifulsoup4**:用于解析HTML并提取数据。

运行以下命令安装所有依赖项:

1
pip 安装 crawlbase beautifulsoup4

选择正确的 IDE 进行网页抓取

选择正确的 IDE(集成开发环境)可以让编程生活更加轻松。以下是一些流行的 Python IDE:

  1. VS代码:轻量、强大,并且具有出色的 Python 扩展。
  2. PyCharm:功能齐全,具有先进的调试和测试工具。
  3. Jupyter笔记本:适用于探索性数据分析和逐步代码执行。

选择一种适合您的工作流程的。对于本博客,我们建议使用 VS Code,以简化操作。

抓取 Just Eat 餐厅列表

在本节中,我们将使用 Python 和 Crawlbase 从 Just Eat 中抓取餐厅列表 Crawling API。我们将介绍如何查找 HTML 选择器、编写抓取工具、滚动分页以及将数据存储在 JSON 文件中。

检查 HTML 以识别选择器

要抓取数据,首先需要了解 Just Eat 网站的结构。您可以按照以下方法检查 HTML:

  1. 打开网站:导航到特定城市的 Just Eat 搜索结果页面,例如, 伦敦桥地区的 Just Eat 列表.
  2. 打开开发者工具:右键单击页面上的任意位置,然后选择“检查”(或按 Ctrl + Shift + I 在Windows上或 Cmd + Option + I 在 Mac 上)。
HTML 检查的屏幕截图 - Just Eat 餐厅列表
  1. 找到关键元素:
  • 餐厅名称: 摘自 <div> - data-qa="restaurant-info-name".
  • 菜式: 摘自 <div> - data-qa="restaurant-cuisine".
  • 评分: 摘自 <div> - data-qa="restaurant-ratings".
  • 餐厅链接:提取 href 来自 <a> 标签放在餐厅卡内,并在其前面加上 https://www.just-eat.co.uk.

编写 Just Eat 搜索列表抓取工具

现在您已经确定了选择器,您可以编写抓取程序了。下面是使用 Crawlbase 和 BeautifulSoup 抓取餐厅列表的示例 Python 脚本:

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
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON

# 使用你的 token 初始化 Crawlbase API
CRAWLBASE_TOKEN = 'YOUR_CRAWLBASE_TOKEN'
爬行 API = 爬行 API({'令牌': CRAWLBASE_TOKEN})

# 获取和解析 Just Eat 列表的函数
DEF 获取餐厅列表(网址):
选项= {
'ajax_等待': '真的', # 等待动态内容
'页面等待': '3000', # 等待 3 秒以加载页面
}

响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200':
回报 回复['身体']。解码('utf-8')
其他:
打印(f“无法获取页面。状态: {回复[“标题”]['pc_status']}")
回报 没有

DEF 解析餐厅(html_内容):
汤 = BeautifulSoup(html_content, 'html.parser')
餐厅 = []
restaurant_cards = soup.select('div[data-qa="餐厅卡"]')

in 餐厅卡:
名称 = 卡.select_one('div[data-qa="餐厅信息名称"]').text.strip() if 卡片.选择一个('div[data-qa="餐厅信息名称"]') 其他 ''
美食 = 卡片.select_one('div[data-qa="餐厅菜系"]').text.strip() if 卡片.选择一个('div[data-qa="餐厅菜系"]') 其他 ''
评分 = 卡片.select_one('div[data-qa="餐厅评级"]').text.strip() if 卡片.选择一个('div[data-qa="餐厅评级"]') 其他 ''
链接 = 卡.select_one('一种')['href'] if 卡片.选择一个('一种') 其他 ''

餐厅.附加({
“名称”: 姓名,
‘美食’:美食,
'评分': 评分,
'关联': f“https://www.just-eat.co.uk{关联}"
})

回报 餐厅

处理基于滚动的分页

Just Eat 使用基于滚动的分页功能,以便在您向下滚动时加载更多结果。Crawlbase Crawling API 支持自动滚动,因此您不必手动管理。

通过设置 scrollscroll_interval 在 API 请求中,您将获取所有列表。您无需添加 page_wait作为 scroll_interval 将以相同的方式工作。

1
2
3
4
选项= {
'滚动': '真的',
'滚动间隔': '20' # 滚动 20 秒
}

将抓取的数据存储在 JSON 文件中

抓取数据后,将其存储在 JSON 文件中以供进一步分析。以下是保存结果的方法:

1
2
3
4
DEF 保存到json(数据,文件名=‘just_eat_restaurants.json’):
- open(文件名, 'w', 编码='utf-8') as f:
json.dump(数据,f,ensure_ascii=, 缩进=4)
打印(f“数据已成功保存至 {文档名称}")

完整的 Python 代码示例

以下是包含所有步骤的完整脚本:

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
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON

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

# 获取和解析 Just Eat 列表的函数
DEF 获取餐厅列表(网址):
选项= {
'滚动': '真的',
'滚动间隔': '20'
}

响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200':
回报 回复['身体']。解码('utf-8')
其他:
打印(f“无法获取页面。状态: {回复[“标题”]['pc_status']}")
回报 没有

DEF 解析餐厅(html_内容):
汤 = BeautifulSoup(html_content, 'html.parser')
餐厅 = []
restaurant_cards = soup.select('div[data-qa="餐厅卡"]')

in 餐厅卡:
名称 = 卡.select_one('div[data-qa="餐厅信息名称"]').text.strip() if 卡片.选择一个('div[data-qa="餐厅信息名称"]') 其他 ''
美食 = 卡片.select_one('div[data-qa="餐厅菜系"]').text.strip() if 卡片.选择一个('div[data-qa="餐厅菜系"]') 其他 ''
评分 = 卡片.select_one('div[data-qa="餐厅评级"]').text.strip() if 卡片.选择一个('div[data-qa="餐厅评级"]') 其他 ''
链接 = 卡.select_one('一种')['href'] if 卡片.选择一个('一种') 其他 ''

餐厅.附加({
“名称”: 姓名,
‘美食’:美食,
'评分': 评分,
'关联': f“https://www.just-eat.co.uk{关联}"
})

回报 餐厅

DEF 保存到json(数据,文件名=‘just_eat_restaurants.json’):
- open(文件名, 'w', 编码='utf-8') as f:
json.dump(数据,f,ensure_ascii=, 缩进=4)
打印(f“数据已成功保存至 {文档名称}")

if __名字__ == “__主要的__”:
# Just Eat 搜索结果 URL
网址= “https://www.just-eat.co.uk/area/ec4r3tn”
html_content = 获取餐厅列表(网址)

if html_内容:
餐厅 = 解析餐厅 (html_content)
保存到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
[
{
“名称”: “鱿鱼游戏-韩式炸鸡”,
“美食”: “亚洲菜,鸡肉”,
“评分”: “3.4(18)”,
“关联”: “https://www.just-eat.co.uk/restaurants-squid-game---korean-fried-chicken---walworth-walworth/menu”
},
{
“名称”: “芒加尔塔”,
“美食”: “土耳其、地中海”,
“评分”: “4.5(26)”,
“关联”: “https://www.just-eat.co.uk/restaurants-tower-mangal-southwark/menu”
},
{
“名称”: “南意大利”,
“美食”: “意大利披萨”,
“评分”: “3(2)”,
“关联”: “https://www.just-eat.co.uk/restaurants-sud-italia-aldgate/menu”
},
{
“名称”: “城市巧克力制造商(伦敦)”,
“美食”: “甜点、华夫饼”,
“评分”: “3.6(200+)”,
“关联”: “https://www.just-eat.co.uk/restaurants-theurbanchocolatier-aldgate/menu”
},
{
“名称”: “面团披萨”,
“美食”: “意大利披萨”,
“评分”: “4.5(5)”,
“关联”: “https://www.just-eat.co.uk/restaurants-motherdough-pizza-shad-thames/menu”
},
.... 更多的
]

使用此脚本,您可以从 Just Eat 抓取餐厅列表。在下一节中,我们将抓取餐厅菜单以获取更多详细信息。

在 Just Eat 上抓取餐厅菜单

在 Just Eat 上抓取餐厅菜单将为您提供菜单产品、价格和餐点定制选项的详细信息。在本节中,我们将向您展示如何查找菜单页面的 HTML 结构、编写抓取工具、处理分页以及将菜单数据存储在 JSON 文件中。

检查菜单页面 HTML 中的选择器

在编写抓取工具之前,请检查菜单页面的 HTML 结构以找到关键元素:

  1. 打开菜单页面:单击餐厅列表即可访问其菜单页面。
  2. 检查 HTML:右键单击并选择“检查”(或按 Ctrl + Shift + I/Cmd + Option + I)打开开发者工具。
  1. 找到关键元素:
  • 分类: 在发现 <section> - data-qa="item-category". 名字在 <h2> - data-qa="heading".
  • 菜品名称:内部 <h2> - data-qa="heading".
  • 菜品价格:内部 <span> 以...开头的类 "formatted-currency-style".
  • 菜品描述:内部 <div> 以...开头的类 "new-item-style_item-description".

编写菜单抓取工具

确定 HTML 选择器后,编写 Python 脚本来抓取菜单详细信息。以下是示例实现:

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
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON
进口 re

# 使用你的 token 初始化 Crawlbase API
CRAWLBASE_TOKEN = 'YOUR_CRAWLBASE_TOKEN'
爬行 API = 爬行 API({'令牌': CRAWLBASE_TOKEN})

DEF 获取菜单页面(网址):
选项= {
'ajax_等待': '真的',
'页面等待': '3000'
}
响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200':
回报 回复['身体']。解码('utf-8')
其他:
打印(f“无法获取菜单页面。状态: {回复[“标题”]['pc_status']}")
回报 没有

DEF 解析菜单(html_内容):
汤 = BeautifulSoup(html_content, 'html.parser')
菜单 = []

# 查找类别和菜单项
类别=汤.选择('部分[data-qa="商品类别"]')
类别 in 类别:
类别名称 = 类别.select_one('h2[data-qa="heading"]:first-child').text.strip() if 类别.选择一个('h2[data-qa="heading"]:first-child') 其他 '未分类'
菜单项 = 类别.选择('div[data-qa="商品类别列表"] div[data-qa="商品"]')

项目 in 菜单项:
名称 = 项目.select_one('h2[data-qa="标题"]').text.strip() if item.select_one('h2[data-qa="标题"]') 其他 ''
价格 = item.select_one('span[class^="格式化货币样式"]').text.strip() if item.select_one('span[class^="格式化货币样式"]') 其他 ''
描述 = re.sub(r'\s+', '', 项目.选择一个('div[class^="new-item-style_item-description"]').text.strip()) if item.select_one('div[class^="new-item-style_item-description"]') 其他 ''

菜单.附加({
“类别”:类别名称,
“名称”: 姓名,
'价格': 价格,
'描述': 描述
})

回报 菜单

处理菜单分页

与 SERP 一样,Just Eat 菜单页面也使用基于滚动的分页。Crawlbase Crawling API 可以通过启用滚动选项来处理分页。使用这些选项:

1
2
3
4
选项= {
'滚动': '真的',
'滚动间隔': '15' # 滚动 15 秒
}

根据需要添加滚动时间,以确保在抓取之前加载所有菜单项。

将菜单数据存储在 JSON 文件中

抓取菜单数据后,将其保存为 JSON 文件,以便于访问和分析。操作方法如下:

1
2
3
4
DEF 保存菜单到json(数据,文件名=‘just_eat_menu.json’):
- open(文件名, 'w', 编码='utf-8') as f:
json.dump(数据,f,ensure_ascii=, 缩进=4)
打印(f“菜单数据已成功保存至 {文档名称}")

完整的 Python 代码示例

以下是抓取菜单的完整脚本:

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
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON
进口 re

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

DEF 获取菜单页面(网址):
选项= {
'滚动': '真的',
'滚动间隔': '15' # 滚动 15 秒以加载所有项目
}
响应=crawling_api.get(url,选项)
if 回复[“标题”]['pc_status'] == '200':
回报 回复['身体']。解码('utf-8')
其他:
打印(f“无法获取菜单页面。状态: {回复[“标题”]['pc_status']}")
回报 没有

DEF 解析菜单(html_内容):
汤 = BeautifulSoup(html_content, 'html.parser')
菜单 = []

# 查找类别和菜单项
类别=汤.选择('部分[data-qa="商品类别"]')
类别 in 类别:
类别名称 = 类别.select_one('h2[data-qa="heading"]:first-child').text.strip() if 类别.选择一个('h2[data-qa="heading"]:first-child') 其他 '未分类'
菜单项 = 类别.选择('div[data-qa="商品类别列表"] div[data-qa="商品"]')

项目 in 菜单项:
名称 = 项目.select_one('h2[data-qa="标题"]').text.strip() if item.select_one('h2[data-qa="标题"]') 其他 ''
价格 = item.select_one('span[class^="格式化货币样式"]').text.strip() if item.select_one('span[class^="格式化货币样式"]') 其他 ''
描述 = re.sub(r'\s+', '', 项目.选择一个('div[class^="new-item-style_item-description"]').text.strip()) if item.select_one('div[class^="new-item-style_item-description"]') 其他 ''

菜单.附加({
“类别”:类别名称,
“名称”: 姓名,
'价格': 价格,
'描述': 描述
})

回报 菜单

DEF 保存菜单到json(数据,文件名=‘just_eat_menu.json’):
- open(文件名, 'w', 编码='utf-8') as f:
json.dump(数据,f,ensure_ascii=, 缩进=4)
打印(f“菜单数据已成功保存至 {文档名称}")

if __名字__ == “__主要的__”:
# 菜单页面 URL 示例
菜单网址= “https://www.just-eat.co.uk/restaurants-mcdonalds-londonbridgesouthwark/menu”
html_content = fetch_menu_page(菜单网址)

if html_内容:
菜单数据 = 解析菜单(html内容)
保存菜单到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
[
{
“类别”: “什么是新的?”,
“名称”: “特里的巧克力橙子派”,
“价钱”: “2.49英镑”,
“说明”: “酥脆的巧克力糕点,里面填满了特里巧克力橙味巧克力甘纳许。过敏原信息可在 www.mcdonalds.co.uk/nutrition 上查看”
},
{
“类别”: “什么是新的?”,
“名称”: “大幅度鬼脸摇晃”,
“价钱”: “3.99英镑”,
“说明”: “奶昔基底混合蓝莓味糖浆。过敏原信息可在 www.mcdonalds.co.uk/nutrition 上查看”
},
{
“类别”: “什么是新的?”,
“名称”: “中度鬼脸摇晃”,
“价钱”: “3.59英镑”,
“说明”: “奶昔基底混合蓝莓味糖浆。过敏原信息可在 www.mcdonalds.co.uk/nutrition 上查看”
},
{
“类别”: “什么是新的?”,
“名称”: “MILKY WAY® 迷你麦旋风®”,
“价钱”: “1.89英镑”,
“说明”: “软质奶制品冰淇淋上点缀着牛奶巧克力星星和麦芽味碎块,顶部淋上巧克力酱。过敏原信息可在 www.mcdonalds.co.uk/nutrition 上查看”
},
{
“类别”: “什么是新的?”,
“名称”: “银河® 麦旋风®”,
“价钱”: “2.59英镑”,
“说明”: “软质奶制品冰淇淋上点缀着牛奶巧克力星星和麦芽味碎块,顶部淋上巧克力酱。过敏原信息可在 www.mcdonalds.co.uk/nutrition 上查看”
},
.... 更多的
]

总结

使用 Python 和 爬虫库 Crawling API 是企业、开发者和研究人员获取宝贵见解的绝佳方式。从餐厅列表到菜单数据,它使数据收集和组织变得轻而易举,便于分析或应用开发。

确保您的抓取行为符合道德准则和网站的服务条款。通过正确的方法,您可以利用网络数据做出明智的决策并创建有效的解决方案。

如果您想进行更多网页抓取,请查看我们关于抓取其他主要网站内容的指南。

📜 如何抓取亚马逊
📜 如何刮沃尔玛
📜 如何抓取Monster.com
📜 如何抓取 Groupon
📜 如何抓取 TechCrunch 的内容
📜 如何从 Agoda 抓取酒店数据

请联系我们 支持 如果您有任何疑问,祝您抓取愉快!

常见问题

网络抓取的合法性取决于网站的条款和条件以及您对数据的预期用途。请务必查看 Just Eat 的条款和条件,不要违反这些条款和条件。始终确保您的抓取活动合乎道德规范并遵守当地数据隐私法规。

问:如何处理 Just Eat 上的动态内容和分页?

Just Eat 使用 JavaScript 呈现内容和基于滚动的分页。使用 Crawlbase Crawling API,页面已完全呈现,您可以抓取动态内容。 Crawlbase 的 scroll 参数允许您有效地处理无限滚动。

问:我可以提取 Just Eat 上特定餐厅的菜单信息吗?

是的,使用正确的选择器和工具,您可以获取各个餐厅的菜单信息,包括菜品名称、描述和价格。Crawlbase Crawling API 确保所有动态内容(包括菜单详细信息)均已完全呈现以供抓取。

问:如何防止刮刀被堵塞?

为了避免被阻止,请使用 IP 轮换、请求延迟和用户代理标头等技术来模拟真实用户。Crawlbase Crawling API 通过处理 IP 轮换、用户代理管理和反机器人措施为您完成所有这些工作。