You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer+Cheerio爬取Airbnb房源URL返回空数组求助

解决Airbnb爬虫无法获取房源链接的问题

问题根源

  1. 选择器失效:Airbnb页面结构已更新,原代码依赖的[itemprop="url"]元素大概率已不存在或不再存储房源链接。
  2. 页面加载不充分:仅调用page.goto(url)无法保证动态渲染的房源数据完全加载完成。
  3. 反爬识别:未模拟真实浏览器特征,可能被Airbnb的反爬机制拦截,导致数据无法正常渲染。

修复方案

1. 更新元素选择器

现在Airbnb的房源链接通常封装在带data-testid="listing-card-link"属性的<a>标签中,直接提取该标签的href属性即可获取房源URL。

2. 优化页面加载策略

使用networkidle2等待网络请求基本停止,确保动态数据完全渲染;同时设置合理超时时间避免请求失败。

3. 模拟真实浏览器

设置合法的User-Agent,避免被反爬机制识别为爬虫。

4. 直接在Puppeteer中提取数据

跳过Cheerio,直接用Puppeteer的$$eval方法从动态DOM中提取链接,避免静态HTML和动态DOM的差异问题。

修复后的完整代码

const puppeteer = require("puppeteer");

const url = "https://www.airbnb.co.in/s/Haridwar--Uttarakhand/homes?tab_id=home_tab&refinement_paths%5B%5D=%2Fhomes&flexible_trip_lengths%5B%5D=one_week&price_filter_input_type=0&price_filter_num_nights=5&l2_property_type_ids%5B%5D=1&search_type=autocomplete_click&query=Haridwar%2C%20Uttarakhand&place_id=ChIJyVfuuA5HCTkR8_VApnaRRE4&date_picker_type=calendar&source=structured_search_input_header";

async function scrapHomesPage(url) {
    try {
        const browser = await puppeteer.launch({ headless: false });
        const page = await browser.newPage();

        // 设置真实浏览器的User-Agent
        await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36');

        // 等待页面加载完成,网络请求基本停止
        await page.goto(url, { waitUntil: 'networkidle2', timeout: 60000 });

        // 等待房源链接元素加载完成
        await page.waitForSelector('a[data-testid="listing-card-link"]', { timeout: 30000 });

        // 提取所有房源链接
        const homes = await page.$$eval('a[data-testid="listing-card-link"]', links => links.map(link => link.href));

        console.log(homes);

        await browser.close();
    } catch (err) {
        console.error(err);
    }
}

scrapHomesPage(url);

额外说明

如果页面需要滚动加载更多房源,可以在等待初始元素后添加滚动逻辑:

// 模拟滚动到底部,加载更多房源
await page.evaluate(async () => {
    await new Promise((resolve) => {
        let totalHeight = 0;
        const distance = 100;
        const timer = setInterval(() => {
            const scrollHeight = document.body.scrollHeight;
            window.scrollBy(0, distance);
            totalHeight += distance;

            if (totalHeight >= scrollHeight) {
                clearInterval(timer);
                resolve();
            }
        }, 100);
    });
});
// 等待新加载的房源元素
await page.waitForSelector('a[data-testid="listing-card-link"]', { timeout: 30000 });

内容的提问来源于stack exchange,提问作者Ujjval76

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:10:27