Agoda 拥有数百万家酒店和房产列表。无论您是进行研究、构建旅行聚合器还是分析酒店价格,从 Agoda 抓取数据对您的项目都非常有用。

在本指南中,我们将向您展示如何从 Agoda 使用 Python 和 爬虫库 Crawling API。您将学习如何在浏览 Agoda 的滚动分页时提取酒店名称、价格、评论和评分。我们还将介绍如何设置 Python 环境并以 JSON 等结构化格式存储抓取的数据。

您将拥有一个可以抓取动态内容和获取酒店列表的 Agoda 网络抓取工具。除了介绍分页和利用 API 来促进抓取等中级主题外,本指南还专为初学者设计。

准备好开始了吗?我们将介绍以下内容:

目录

  1. 为什么要从 Agoda 抓取酒店数据?
  2. 从 Agoda 中提取的关键数据点
  3. 爬虫库 Crawling API 用于抓取 Agoda 上的酒店列表
  • 安装 Crawlbase Python 库
  1. 设置 Python 环境
  • 安装 Python 和所需的库
  • 用于网页抓取的 IDE
  1. 爬取 Agoda 的房源信息
  • 检查 HTML 以识别选择器
  • 编写 Agoda 搜索列表抓取工具
  • 处理基于滚动的分页
  • 将抓取的数据存储在 JSON 文件中
  • 完整的 Python 代码示例
  1. 总结
  2. 常见问题解答(FAQ)

为什么要从 Agoda 抓取酒店数据?

Agoda 是一个受欢迎的在线旅游预订网站,受到全球数百万用户的信赖,提供最优惠的酒店优惠。Agoda 的数据库中有数百万家住宿,是企业、研究人员和开发人员的宝贵信息宝库。通过抓取 Agoda 酒店数据,您可以获得手动难以获得的见解。

以下是抓取 Agoda 酒店数据有价值的一些原因:

1。 市场调查

抓取 Agoda 可帮助您分析酒店价格、趋势和可用性,以便旅行社、酒店经理和竞争对手优化定价并寻找机会。

2. 建立旅游聚合器

Agoda 数据为用户、旅游比较网站或应用程序提供实时酒店价格、评级、评论和空房情况。

3。 竞争对手分析

酒店可以使用 Agoda 的数据来跟踪竞争对手的定价、促销和评论,以改进价格和服务。

4. 个性化推荐

通过抓取 Agoda 的酒店数据,开发人员可以根据设施、评级和位置创建个性化的旅行建议。

5. 学术研究

研究人员可以使用 Agoda 的数据来研究旅游趋势、用户行为和接待能力,以完成学术项目和报告。

从 Agoda 中提取的关键数据点

从 Agoda 抓取酒店数据时,关注最有价值的数据点将帮助您获得最大的收益。以下是要提取的关键数据点:

从 Agoda 提取的关键数据点图像
  1. 饭店名称 – 酒店名称有助于识别酒店。
  2. 每晚价格 – 一晚住宿的费用。
  3. 总价 – 整个住宿的全价,含税。
  4. 酒店评级 – 通过顾客评级来评估房产的质量。
  5. 评论数 – 表明酒店的知名度和可信度。
  6. 地址 – 酒店所在的城市或街区。
  7. 項目設施 – 酒店提供的设施包括无线网络、游泳池、健身房等。
  8. 房型 – 住宿类型,例如酒店、度假村或公寓。
  9. 房间供应情况 – 有关特定日期内可用房间的信息。
  10. 酒店图片 – 房产的视觉效果有助于展示房源信息。

爬虫库 Crawling API 用于抓取 Agoda 上的酒店列表

爬虫库 Crawling API 是抓取 Agoda 数据的完美工具,它具有滚动时加载的动态内容。它处理 JavaScript 呈现的页面并绕过 IP 阻止等安全措施,因此抓取数据高效且流畅。

以下是 Crawlbase 适合 Agoda 抓取的原因:

  • 处理动态内容:Crawlbase 模拟人类滚动,因此当页面加载更多数据时,所有酒店列表都会被捕获。
  • IP旋转:轮换 IP 以避免 Agoda 的速率限制和阻止。
  • 快速和可靠:快速抓取大量数据。
  • 可定制的请求:根据您的需要调整标头、cookie 和请求参数。

Crawlbase Python 库

Crawlbase Python 库让使用 API 变得简单。首先,您需要您的 Crawlbase 访问令牌,您可以通过以下方式获取 报名 为了他们的服务。

以下是使用 Crawlbase 从 Agoda 获取数据的示例代码:

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

# 使用您的访问令牌初始化 Crawlbase API
爬行 API = 爬行 API({ '令牌': 'YOUR_CRAWLBASE_TOKEN' })

DEF make_crawlbase_request(网址):
响应=crawling_api.get(url)

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

请注意: 需要 Crawlbase 的 JS Token 才能抓取 JavaScript 内容。Crawlbase 为其免费提供 1,000 次请求 Crawling API。 请参阅 文件 了解更多。接下来,我们将为 Agoda 抓取设置您的 Python 环境!

在下一部分中,我们将为 Agoda 抓取设置您的 Python 环境!

设置 Python 环境

安装库和配置环境是开始 Agoda 抓取的先决条件。按照以下步骤完成设置。

安装 Python 和所需的库

确保你的电脑上安装了 Python。如果没有,请从 Python官方网站.

安装Python后,我们需要安装几个必需的库:

  1. Crawlbase Python 库:与 Crawlbase 交互 Crawling API.
  2. 美丽汤:解析HTML并提取数据。

您可以使用 pip 安装这些库:

1
pip 安装 crawlbase beautifulsoup4

用于网页抓取的 IDE

集成开发环境 (IDE) 将使编码和运行抓取工具更加容易。Python 的热门选择有:

选择一个适合您的,就可以了!

爬取 Agoda 的房源信息

在本节中,我们将抓取“吉隆坡”城市的 Agoda 房源列表。搜索网址为:

吉隆坡 的 Agoda 搜索网址

我们将通过以下步骤来有效地抓取列表:

检查 HTML 以识别选择器

在开始抓取之前,我们需要了解 Agoda 搜索结果页面的 HTML 结构,以便确定要提取的酒店数据的选择器。

  1. 打开 Agoda 网址:导航至吉隆坡的 Agoda 搜索结果页面。
  2. 检查页面:右键单击页面并选择“检查”或按 Ctrl + Shift + I 打开开发者工具。
检查 Agoda 酒店 HTML 结构的图像
  1. 确定关键要素:在页面的 HTML 结构中,找到包含酒店详细信息的元素。我们将重点关注:
  • 饭店名称:在 <h3> 元素与 data-selenium="hotel-name".
  • 价格:在 <div> 元素与 data-element-name="final-price".
  • 评分:在 <p> 元素与 data-element-name="review-score".
  • 林克酒店:在 <a> 用类标记 PropertyCard__Link 链接到酒店的页面。

编写 Agoda 搜索列表抓取工具

为了从 Agoda 抓取数据,我们将使用 Crawlbase Crawling API 处理动态内容并像真实浏览器一样呈现页面。这确保我们能够捕获所有酒店列表,即使是通过 JavaScript 加载的列表。

我们可以这样编写爬虫程序:

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

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

# 获取 Agoda 搜索结果页面的函数
DEF 获取agoda页面(网址):
响应=crawling_api.get(url)
if 回复[“标题”]['pc_status'] == '200':
回报 回复['身体']。解码('utf-8')
其他:
打印(“获取页面时出错。”)
回报 没有

# 从 HTML 内容中提取酒店数据的函数
DEF 提取数据(html_内容):
汤 = BeautifulSoup(html_content, 'html.parser')
酒店 = []

# 循环遍历页面上的所有酒店列表
饭店 in 汤.选择('div#contentContainer ol.酒店列表容器 > li.PropertyCard'):
名称 = 酒店.select_one('h3[data-selenium="酒店名称"]').text.strip() if 酒店.select_one('h3[data-selenium="酒店名称"]') 其他 ''
价格 = 酒店.select_one('div[数据元素名称="最终价格"]').text.strip() if 酒店.select_one('div[数据元素名称="最终价格"]') 其他 ''
评级 = 酒店.select_one('p[数据元素名称="评价分数"]').text.strip() if 酒店.select_one('p[数据元素名称="评价分数"]') 其他 ''
链接 = hotel.select_one(‘a.PropertyCard__Link’)['href'] if 酒店.select_one(‘a.PropertyCard__Link’) 其他 ''

酒店.附加({
“名称”: 姓名,
'价格': 价格,
'评分': 评分,
'关联': f"https://www.agoda.com{关联}" # 完成 URL
})

回报 酒店

处理基于滚动的分页

Agoda 采用滚动分页,因此当您向下滚动页面时,会出现更多酒店列表。我们可以指导 Crawlbase Crawling API 模拟滚动并捕获更多列表。

为了管理滚动,我们可以使用 scrollscroll_interval 选项。我们可以这样设置它们:

1
2
3
4
5
6
选项= {
'滚动': '真的',
'滚动间隔': '20' # 滚动 20 秒以加载更多列表
}

响应=crawling_api.get(url,选项)

这将使爬虫滚动 20 秒,确保在抓取之前加载所有酒店列表。

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

一旦我们有了数据,我们就需要将其保存为 JSON 等结构化格式,以便我们以后可以分析或处理数据。以下是我们将抓取的酒店数据保存到 JSON 文件的方法:

1
2
3
4
DEF 保存到json(数据,文件名='酒店数据.json'):
- open(文件名, 'w') as f:
json.dump(数据,f,缩进=4)
打印(f”数据保存至 {文档名称}")

完整的 Python 代码示例

现在我们已经准备好了所有组件,让我们将所有内容组合成一个完整的工作示例。此脚本将获取吉隆坡的 Agoda 搜索结果,提取酒店信息并将其存储在 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
 爬行基地 进口 抓取API
bs4 进口 美丽汤
进口 JSON

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

# 获取 Agoda 搜索结果页面的函数
DEF 获取agoda页面(网址):
选项= {
'滚动': '真的',
'滚动间隔': '20'
}

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

# 从 HTML 内容中提取酒店数据的函数
DEF 提取数据(html_内容):
汤 = BeautifulSoup(html_content, 'html.parser')
酒店 = []

# 循环遍历页面上的所有酒店列表
饭店 in 汤.选择('div#contentContainer ol.酒店列表容器 > li.PropertyCard'):
名称 = 酒店.select_one('h3[data-selenium="酒店名称"]').text.strip() if 酒店.select_one('h3[data-selenium="酒店名称"]') 其他 ''
价格 = 酒店.select_one('div[数据元素名称="最终价格"]').text.strip() if 酒店.select_one('div[数据元素名称="最终价格"]') 其他 ''
评级 = 酒店.select_one('p[数据元素名称="评价分数"]').text.strip() if 酒店.select_one('p[数据元素名称="评价分数"]') 其他 ''
链接 = hotel.select_one(‘a.PropertyCard__Link’)['href'] if 酒店.select_one(‘a.PropertyCard__Link’) 其他 ''

酒店.附加({
“名称”: 姓名,
'价格': 价格,
'评分': 评分,
'关联': f"https://www.agoda.com{关联}" # 完成 URL
})

回报 酒店

# 将数据保存到 JSON 文件的函数
DEF 保存到json(数据,文件名='酒店数据.json'):
- open(文件名, 'w') as f:
json.dump(数据,f,缩进=4)
打印(f”数据保存至 {文档名称}")

# 主脚本
if __名字__ == “__主要的__”:
网址= "https://www.agoda.com/search?city=14524&checkIn=2025-01-05&los=2&rooms=1&adults=2&checkOut=2025-01-09"
html_content = fetch_agoda_page(网址)

if html_内容:
酒店数据 = 提取酒店数据(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
[
{
“名称”: “Mercu 夏季套房 KLCC 的钻石套房 KL”,
“价钱”: “28 美元”,
“评分”: “7.7”,
“关联”: "https://www.agoda.com/axon-suite-klcc-by-home/hotel/kuala-lumpur-my.html?countryId=198&finalPriceView=1&isShowMobileAppPrice=false&cid=-1&numberOfBedrooms=&familyMode=false&adults=2&children=0&rooms=1&maxRooms=0&checkIn=2025-01-7&isCalendarCallout=false&childAges=&numberOfGuest=0&missingChildAges=false&travellerType=1&showReviewSubmissionEntry=false&currencyCode=USD&isFreeOccSearch=false&tspTypes=17&los=4&searchrequestid=c975ab20-8534-4286-8e45-b8f3b25524f3"
},
{
“名称”: “KLCC 城堡优雅夏日套房酒店”,
“价钱”: “34 美元”,
“评分”: “8.4”,
“关联”: "https://www.agoda.com/summer-suites-klcc-by-castle-classy/hotel/all/kuala-lumpur-my.html?countryId=198&finalPriceView=1&isShowMobileAppPrice=false&cid=-1&numberOfBedrooms=&familyMode=false&adults=2&children=0&rooms=1&maxRooms=0&checkIn=2025-01-7&isCalendarCallout=false&childAges=&numberOfGuest=0&missingChildAges=false&travellerType=1&showReviewSubmissionEntry=false&currencyCode=USD&isFreeOccSearch=false&tspTypes=3&los=4&searchrequestid=c975ab20-8534-4286-8e45-b8f3b25524f3"
},
{
“名称”: 《Deface Platinum 2 吉隆坡》,
“价钱”: “72 美元”,
“评分”: “8.5”,
“关联”: "https://www.agoda.com/deface-victory-suites-kuala-lumpur/hotel/kuala-lumpur-my.html?countryId=198&finalPriceView=1&isShowMobileAppPrice=false&cid=-1&numberOfBedrooms=&familyMode=false&adults=2&children=0&rooms=1&maxRooms=0&checkIn=2025-01-7&isCalendarCallout=false&childAges=&numberOfGuest=0&missingChildAges=false&travellerType=1&showReviewSubmissionEntry=false&currencyCode=USD&isFreeOccSearch=false&tspTypes=8,-1&los=4&searchrequestid=c975ab20-8534-4286-8e45-b8f3b25524f3"
},
{
“名称”: “吉隆坡里维埃拉城酒店 (Guestonic 酒店)”,
“价钱”: “20 美元”,
“评分”: “9.2”,
“关联”: "https://www.agoda.com/riveria-city-kuala-lumpur-by-guestonic/hotel/kuala-lumpur-my.html?countryId=198&finalPriceView=1&isShowMobileAppPrice=false&cid=-1&numberOfBedrooms=&familyMode=false&adults=2&children=0&rooms=1&maxRooms=0&checkIn=2025-01-7&isCalendarCallout=false&childAges=&numberOfGuest=0&missingChildAges=false&travellerType=1&showReviewSubmissionEntry=false&currencyCode=USD&isFreeOccSearch=false&tspTypes=5&los=4&searchrequestid=c975ab20-8534-4286-8e45-b8f3b25524f3"
},
.... 更多的
]

总结

使用 Python 和 Crawlbase 抓取酒店数据可让企业通过竞争分析、价格监控和市场研究获得洞察力。使用 爬虫库 Crawling API,您可以从 Agoda 等动态、JavaScript 密集型网站抓取数据,而不会遇到分页或内容加载延迟等常见问题。

在本博客中,我们介绍了从查找 Agoda 搜索结果页面上的关键 HTML 元素到编写和运行完整的 Python 抓取工具的所有内容。我们还展示了如何处理基于滚动的分页,并将抓取的数据存储在 JSON 文件中以供进一步分析。

如果您有兴趣了解如何从其他房地产网站抓取数据,请查看下面的有用指南。

📜 如何抓取 Realtor.com
📜 如何刮 Zillow
📜 如何抓取 Airbnb
📜 如何抓取 Booking.com
📜 如何抓取 Expedia

如果您有任何问题或反馈,我们的 支持团队 随时为您的网络抓取之旅提供帮助。请记住遵守道德准则并尊重网站的服务条款。快乐刮擦!

常见问题

网页抓取在法律上属于灰色地带。虽然抓取公开数据一般是可以接受的,但请务必查看 Agoda 的服务条款以确保合规。抓取时要负责任,避免将数据用于未经授权的用途。

问:如何处理 Agoda 上的 CAPTCHA 或反机器人措施?

Agoda 使用 CAPTCHA 和其他机器人检测技术。您可以使用 爬虫库 Crawling API,具有基于浏览器的渲染和IP轮换等功能。

问:我可以一次抓取多个城市的数据吗?

是的,您可以通过修改 Agoda URL 中的查询参数来抓取多个城市的数据。例如,更新 city 参数与所需城市的 ID 一致。只需确保遵循抓取最佳实践,例如限制请求频率,即可避免被阻止。