Puppeteer+Cheerio爬取Airbnb房源URL返回空数组求助
解决Airbnb爬虫无法获取房源链接的问题
问题根源
- 选择器失效:Airbnb页面结构已更新,原代码依赖的
[itemprop="url"]元素大概率已不存在或不再存储房源链接。 - 页面加载不充分:仅调用
page.goto(url)无法保证动态渲染的房源数据完全加载完成。 - 反爬识别:未模拟真实浏览器特征,可能被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
相关产品推荐
相关产品推荐

