返回博客
使用案例
罗伯特·斯菲奇2021年5月26日阅读时间:7分钟

如何抓取 AirBnB 列表数据

如何抓取 AirBnB 列表数据

为什么有人要窃取 Airbnb 的数据?

Airbnb 是一个平台,人们只需连接互联网就有机会出租自己的房产。它于 2008 年由 Brian Chesky、Nathan Blecharczyk 和 Joe Gebbia 创立,即使在大流行病期间也取得了巨大成功。

每个人只需访问 Airbnb 并搜索一个地方,就能找到平台上的房源,但要找到一个包含以下信息的有意义的数据集却不容易:

  • 一个城市有多少房源?
  • 它们是如何定价的?
  • 它们看起来像什么?
  • 它们是如何评级的?

当然,您有自己的理由想了解这些信息,我相信我们可以帮助您。

让我们开始吧!

使用网络扫描应用程序接口提取数据

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

1.检查源代码

检查你有兴趣从 Airbnb 网站上抓取的元素。右键单击页面上的任意位置,选择 "检查 "选项,即可看到开发工具。

比方说,我们想获得要搜索的地方的价格、图片、类型和评级。

首先,我们要找到 DOM 中的公共元素。看来 _gigle7 就是我们要找的。

Airbnb在柏林的住宿搜索结果,与Chrome开发者工具中检查房源标记代码的界面并列显示

2.选择网络搜索器

为了获得最佳效果,我们建议使用我们的服务WebScrapingAPI,因为我们的教程将以此为基础。您可以访问此链接免费试用。创建一个账户,完成后返回本页。

登录后,进入仪表板页面。在这里,您可以找到您的私人 API 访问密钥(我们将使用该密钥进行请求)、API playground(您可以在此测试我们的产品)和文档。

一个三步快速入门面板,展示 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 类的所有元素。你可以在我们不断定义地点的那行后面添加一个 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 的新数组中。
  • 将新创建的结果数组记录到屏幕上。

回复应该是这样的

[
  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技术,我们建议您查看我们的《使用 JavaScript 和 Node.Js 进行网络抓取的终极指南》

网络搜索的力量

正如你所看到的,我们只用了几分钟就建立了一个基本的网络搜刮器。从这里开始,你的想象力将受到限制。如果你有足够的雄心壮志,你甚至可以利用收集到的数据在地图上直观地显示房源的分布和集中情况。Airbnb 会在任何房源页面的头部为你提供所有必要的信息。

正如你所看到的,作为一名软件开发人员,网络搜索是最有趣的消磨时间的方式之一。你可以轻松获取所有需要的数据,为特定的利基市场创建一个新的应用程序,或者只是训练自己的技能。如果您在使用过程中遇到任何问题,请随时在评论区寻求帮助,我们将竭诚为您服务!

如果这篇文章还不能帮助你充分了解网络刮擦的功能,你可以看看另一个例子,了解企业如何一步步建立网络刮擦。

感谢您抽出宝贵时间!祝您刮得愉快

关于作者
罗伯特·斯菲奇,WebScrapingAPI 全栈开发工程师
罗伯特-斯菲奇全栈开发工程师

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

开始构建

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

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