为什么使用BeautifulSoup无法获取Airbnb页面中指定类名的div元素?
无法定位元素的核心原因
- 动态渲染问题:Airbnb的房源列表内容是浏览器端通过JavaScript动态渲染生成的,你直接用
requests.get发起的静态HTTP请求只能拿到初始的HTML骨架,JS还没执行填充内容,自然不存在类名为_8s3ctt的div元素。 - 反爬拦截:Airbnb有成熟的反爬机制,无伪装的requests请求很容易被识别为爬虫,返回的实际是验证码页面、验证拦截页而非正常的搜索结果页,自然找不到目标元素。
- 类名不稳定:Airbnb前端使用CSS-in-JS类生成方案,
_8s3ctt这种带哈希后缀的类名是动态生成的,不同访问时段、不同地区、不同会话的类名可能都会发生变化,依赖这类类名定位本身就不可靠。
解决方法
- 替换静态请求为JS渲染工具:使用Selenium、Playwright等模拟真实浏览器的工具发起请求,等待页面完全加载后再提取元素,示例代码如下:
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def extract_listing(page_url): driver = webdriver.Chrome() # 需提前安装Chrome和对应版本的ChromeDriver driver.get(page_url) # 等待房源卡片元素加载完成,优先用更稳定的data-testid属性定位 wait = WebDriverWait(driver, 10) listings = wait.until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, 'div[data-testid="listing-card"]'))) # 提取内部链接 urls = [] for listing in listings: link = listing.find_element(By.CSS_SELECTOR, 'a[role="link"]') urls.append(link.get_attribute('href')) driver.quit() return urls
- 增加请求伪装:如果坚持用requests,需要先在浏览器中拿到正常访问的请求头,补充User-Agent、Cookie、Referer、Accept-Language等完整头信息,尽量模拟真实用户的请求,拿到正确的返回内容后再解析。拿到返回内容后可以先保存为本地HTML文件,确认是否存在目标元素再做后续解析。
- 替换定位规则:不要依赖动态哈希类名,改用Airbnb页面上固定的
data-testid属性、元素语义属性(比如aria-label)或者结构层级定位,稳定性更高。
内容的提问来源于stack exchange,提问作者nkon
相关产品推荐
相关产品推荐

