返回博客
用例
Robert SfichiLast updated on Mar 31, 20261 min read

如何抓取Airbnb房源数据

如何抓取Airbnb房源数据

你是否曾遇到过这样的情况:想找到一个完美的度假胜地?或者你只是想了解自己的房源与邻居的相比如何?无论哪种情况,何不利用网络爬虫的强大功能来实现呢?

网络爬虫是一种软件工具,它能帮助你自动化完成从第三方网站收集有用数据的繁琐过程。大多数在线服务都会为开发者提供 API 接口,以便轻松读取其网站上的信息。遗憾的是,Airbnb 并不在此列。这正是网络爬虫大显身手的时候。

为什么有人要抓取 Airbnb 数据?

爱彼迎(Airbnb)是一个让人们仅凭网络连接即可出租房产的平台。它由布莱恩·切斯基(Brian Chesky)、内森·布莱查克(Nathan Blecharczyk)和乔·盖比亚(Joe Gebbia)于2008年创立,即使在疫情期间也取得了巨大成功。

虽然任何人只需访问Airbnb并搜索房源即可查看列表,但要获取包含以下信息的有效数据集却并非易事:

  • 某座城市有多少房源?
  • 房源定价如何?
  • 房源外观如何?
  • 房源评分如何?

当然,您获取这些信息自有您的考量,我相信我们定能为您提供帮助。

让我们开始吧!

使用网络爬虫 API 提取数据

为了能够提取所有必要的数据,请确保按照以下步骤操作。

1. 检查源代码

查看您想从 Airbnb 网站抓取的元素。在页面任意位置右键点击并选择“检查”选项,即可打开开发者工具。

假设我们想要获取待抓取房源的价格、图片、类型和评分。

首先,我们需要在 DOM 中找出共同的元素。看起来 _gigle7 就是我们要找的。

2. 选择网页抓取工具

为了获得最佳效果,我们建议使用我们的服务 WebScrapingAPI,因为本教程将以此为基础。您可以通过此链接免费试用。注册账户后,请返回本页面。

登录后,请前往仪表盘页面。在这里,您可以找到用于发送请求的私有 API 访问密钥、可用于测试产品的 API 沙盒,以及相关文档。

3. 设置项目

创建项目文件夹后,请运行以下命令:

npm init -y
npm install got jsdom

为了发送请求,我们将安装 got 模块;而为了满足 HTML 解析的需求,我们将使用 jsdom 包。

创建一个名为“index.js”的新文件并打开它。

4. 发起请求

现在我们来设置参数、发起请求并解析 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)

5. 获取 JSON 格式的数据

接下来,我们将深入挖掘,获取包含价格、图片类型和评分信息的具体元素。

在之前展示的代码行之后,复制以下内容:

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 数据非常简单。

  • 使用必要的参数向 WebScrapingAPI 发起请求:API 密钥以及需要抓取数据的 URL。
  • 使用 JSDOM 加载 DOM。
  • 通过查找特定类名来选中所有房源。
  • 对于每个房源,获取价格标签、图片、房源类型和评分。
  • 将每个房源添加到一个名为 results 的新数组中。
  • 将新创建的 results 数组输出到屏幕上。

响应结果应类似如下:

[
  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 在每个房源页面的顶部都提供了所有必要的信息。

如您所见,作为软件开发者,网络爬取可能是最有趣的消遣方式之一。您可以轻松获取所需数据,用于开发针对特定细分市场的全新应用,或单纯用于提升技能。如果您在操作过程中遇到任何问题,请随时在评论区寻求帮助,我们将很乐意为您提供协助!

如果本文未能帮助您充分了解网络爬虫的功能,您可以参考另一个示例,了解企业如何逐步构建网络爬虫。

感谢您的阅读!祝您爬取愉快!

关于作者
Robert Sfichi, 全栈开发工程师 @ WebScrapingAPI
Robert Sfichi全栈开发工程师

罗伯特·斯菲奇是 WebScrapingAPI 的团队成员,致力于产品开发,并协助构建可靠的解决方案,以支持该平台及其用户。

开始构建

准备好扩展您的数据收集规模了吗?

加入2,000多家企业,使用WebScrapingAPI在无需任何基础设施开销的情况下,以企业级规模提取网络数据。