你是否曾遇到过这样的情况:想找到一个完美的度假胜地?或者你只是想了解自己的房源与邻居的相比如何?无论哪种情况,何不利用网络爬虫的强大功能来实现呢?
网络爬虫是一种软件工具,它能帮助你自动化完成从第三方网站收集有用数据的繁琐过程。大多数在线服务都会为开发者提供 API 接口,以便轻松读取其网站上的信息。遗憾的是,Airbnb 并不在此列。这正是网络爬虫大显身手的时候。

你是否曾遇到过这样的情况:想找到一个完美的度假胜地?或者你只是想了解自己的房源与邻居的相比如何?无论哪种情况,何不利用网络爬虫的强大功能来实现呢?
网络爬虫是一种软件工具,它能帮助你自动化完成从第三方网站收集有用数据的繁琐过程。大多数在线服务都会为开发者提供 API 接口,以便轻松读取其网站上的信息。遗憾的是,Airbnb 并不在此列。这正是网络爬虫大显身手的时候。
爱彼迎(Airbnb)是一个让人们仅凭网络连接即可出租房产的平台。它由布莱恩·切斯基(Brian Chesky)、内森·布莱查克(Nathan Blecharczyk)和乔·盖比亚(Joe Gebbia)于2008年创立,即使在疫情期间也取得了巨大成功。
虽然任何人只需访问Airbnb并搜索房源即可查看列表,但要获取包含以下信息的有效数据集却并非易事:
当然,您获取这些信息自有您的考量,我相信我们定能为您提供帮助。
让我们开始吧!
为了能够提取所有必要的数据,请确保按照以下步骤操作。
查看您想从 Airbnb 网站抓取的元素。在页面任意位置右键点击并选择“检查”选项,即可打开开发者工具。
假设我们想要获取待抓取房源的价格、图片、类型和评分。
首先,我们需要在 DOM 中找出共同的元素。看起来 _gigle7 就是我们要找的。
为了获得最佳效果,我们建议使用我们的服务 WebScrapingAPI,因为本教程将以此为基础。您可以通过此链接免费试用。注册账户后,请返回本页面。
登录后,请前往仪表盘页面。在这里,您可以找到用于发送请求的私有 API 访问密钥、可用于测试产品的 API 沙盒,以及相关文档。
创建项目文件夹后,请运行以下命令:
npm init -ynpm install got jsdom
为了发送请求,我们将安装 got 模块;而为了满足 HTML 解析的需求,我们将使用 jsdom 包。
创建一个名为“index.js”的新文件并打开它。
现在我们来设置参数、发起请求并解析 HTML。在之前创建的文件中编写以下代码:
const {JSDOM} = require("jsdom")
const got = require("got")
(async () => {
const params = {
api_key: "YOUR_API_KEY",
url: "https://www.airbnb.com/s/Berlin/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_dates%5B%5D=april&flexible_trip_dates%5B%5D=may&flexible_trip_lengths%5B%5D=weekend_trip&date_picker_type=calendar&source=structured_search_input_header&search_type=filter_change&place_id=ChIJAVkDPzdOqEcRcDteW0YgIQQ&checkin=2021-04-01&checkout=2021-04-08"
}
const response = await got('https://api.webscrapingapi.com/v1', {searchParams: params})
const {document} = new JSDOM(response.body).window
const places = document.querySelectorAll('._gig1e7')
})()如前所述,所有相关信息都位于 _gigle7 元素下,因此我们将获取所有被赋予 _gigle7 类的元素。您可以在定义常量 places 的那行代码之后添加一个 console.log() 语句,以便在屏幕上查看结果。
console.log(places)
接下来,我们将深入挖掘,获取包含价格、图片类型和评分信息的具体元素。
在之前展示的代码行之后,复制以下内容:
const results = []
places.forEach(place => {
if (place) {
const price = place.querySelector('._ls0e43')
if (price) place.price = price.querySelector('._krjbj').innerHTML
const image = place.querySelector('._91slf2a')
if (image) place.image = image.src
const type = place.querySelector('._b14dlit')
if (type) place.type = type.innerHTML
const rating = place.querySelector('._10fy1f8')
if (rating) place.rating = rating.innerHTML
results.push(place)
}
})
console.log(results)如您所见,对于首页获取的每个房源,我们会提取价格标签元素、图片源地址、房源类型以及评分。最终,我们将得到一个对象数组,其中每个对象都将包含此列表中的所有元素。
现在我们已经编写了抓取 Airbnb 信息所需的所有代码,index.js 文件应大致如下所示:
const {JSDOM} = require("jsdom");
const got = require("got");
(async () => {
const params = {
api_key: "YOUR_API_KEY",
url: "https://www.airbnb.com/s/Berlin/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_dates%5B%5D=april&flexible_trip_dates%5B%5D=may&flexible_trip_lengths%5B%5D=weekend_trip&date_picker_type=calendar&source=structured_search_input_header&search_type=filter_change&place_id=ChIJAVkDPzdOqEcRcDteW0YgIQQ&checkin=2021-04-01&checkout=2021-04-08"
}
const response = await got('https://api.webscrapingapi.com/v1', {searchParams: params})
const {document} = new JSDOM(response.body).window
const places = document.querySelectorAll('._gig1e7')
const results = []
places.forEach(place => {
if (place) {
const price = place.querySelector('._ls0e43')
if (price) place.price = price.querySelector('._krjbj').innerHTML
const image = place.querySelector('._91slf2a')
if (image) place.image = image.src
const type = place.querySelector('._b14dlit')
if (type) place.type = type.innerHTML
const rating = place.querySelector('._10fy1f8')
if (rating) place.rating = rating.innerHTML
results.push(place)
}
})
console.log(results)
})()如您所见,使用 WebScrapingAPI 抓取 Airbnb 数据非常简单。
响应结果应类似如下:
[
HTMLDivElement {
price: '$47 per night, originally $67',
image: 'https://a0.muscache.com/im/pictures/miso/Hosting-46812239/original/c56d6bb5-3c2f-4374-ac01-ca84a50d31cc.jpeg?im_w=720',
type: 'Room in serviced apartment in Friedrichshain',
rating: '4.73'
},
HTMLDivElement {
price: '$82 per night, originally $109',
image: 'https://a0.muscache.com/im/pictures/miso/Hosting-45475252/original/f6bd7cc6-f72a-43ef-943e-deba27f8253d.jpeg?im_w=720',
type: 'Entire serviced apartment in Mitte',
rating: '4.80'
},
HTMLDivElement {
price: '$97 per night, originally $113',
image: 'https://a0.muscache.com/im/pictures/92966859/7deb381e_original.jpg?im_w=720',
type: 'Entire apartment in Mitte',
rating: '4.92'
},
HTMLDivElement {
price: '$99 per night, originally $131',
image: 'https://a0.muscache.com/im/pictures/f1b953ca-5e8a-4fcd-a224-231e6a92e643.jpg?im_w=720',
type: 'Entire apartment in Prenzlauer Berg',
rating: '4.90'
},
HTMLDivElement {
price: '$56 per night, originally $61',
image: 'https://a0.muscache.com/im/pictures/bb0813a6-e9fe-4f0a-81a8-161440085317.jpg?im_w=720',
type: 'Entire apartment in Tiergarten',
rating: '4.67'
},
...
]我们目前面临的限制之一是,只能从搜索结果的单个页面中抓取信息。这个问题可以通过使用某种无头浏览器(如 Puppeteer)或浏览器自动化工具(如 Selenium)来解决。这将帮助我们完成在网页浏览器中手动能做的大部分操作,例如填写表单或点击按钮。
若想进一步了解这些技术,建议您查阅我们的《JavaScript与Node.js网页抓取终极指南》。
如您所见,我们仅用几分钟就成功构建了一个基础的网页抓取工具。从此刻起,一切皆由您的想象力决定。若您雄心勃勃,甚至可以利用收集到的数据,在地图上可视化房产的分布与聚集情况。Airbnb 在每个房源页面的顶部都提供了所有必要的信息。
如您所见,作为软件开发者,网络爬取可能是最有趣的消遣方式之一。您可以轻松获取所需数据,用于开发针对特定细分市场的全新应用,或单纯用于提升技能。如果您在操作过程中遇到任何问题,请随时在评论区寻求帮助,我们将很乐意为您提供协助!
如果本文未能帮助您充分了解网络爬虫的功能,您可以参考另一个示例,了解企业如何逐步构建网络爬虫。
感谢您的阅读!祝您爬取愉快!
