使用BeautifulSoup和Selenium爬取Airbnb洛杉矶房源ID的异常求助
分析与修复你的Airbnb房源ID爬虫问题
看起来你的代码里有几个关键问题导致了结果不稳定和页面跳转混乱,咱们一步步拆解修复:
1. 变量名冲突导致分页逻辑彻底混乱
你外层循环用i作为分页计数器,但内层遍历房源的循环又重复用了i,这会直接覆盖外层的i值——比如内层循环执行完后,外层的i已经变成了当前页的房源数量,而不是原本的分页序号,这肯定会让页面跳转顺序完全乱套。
解决方法:把内层循环的变量换成别的名字,比如idx或者直接用enumerate遍历。
2. 缺少页面加载等待,动态元素还没渲染就解析
Airbnb的页面是动态加载的,Selenium调用driver.get()后立刻获取page_source,此时页面可能还在加载房源数据,目标元素还没渲染出来,所以BeautifulSoup找不到_f21qs6类的div,自然就没有输出。
解决方法:使用Selenium的显式等待,明确等待房源列表元素加载完成后再解析页面,避免过早抓取空白内容。
3. 分页URL重复请求+参数逻辑错误
你的代码在i=1的时候已经处理了第一页,之后又构造了section_offset=1的URL再次请求第一页,造成重复爬取。而且Airbnb的section_offset参数通常是从0开始计数的,第一页对应section_offset=0,第二页是section_offset=1,所以你的分页参数逻辑需要调整。
4. 混合Python2/3语法导致潜在报错
比如print first_url是Python2的写法,Python3里必须加括号print(first_url),这可能直接导致代码运行报错。另外旧版本Selenium的chrome_options参数现在已经改为options,executable_path的用法也有更新。
修正后的完整代码
from bs4 import BeautifulSoup 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 from selenium.webdriver.chrome.service import Service import time # 初始化浏览器配置 option = webdriver.ChromeOptions() option.add_argument("--incognito") # 新版本Selenium推荐使用Service指定驱动路径 service = Service("C:/Users/chromedriver.exe") driver = webdriver.Chrome(service=service, options=option) first_url = "https://www.airbnb.com/s/Los-Angeles--CA--United-States/select_homes?refinement_paths%5B%5D=%2Fselect_homes&place_id=ChIJE9on3F3HwoAR9AhGJW_fL-I&children=0&guests=1&query=Los%20Angeles%2C%20CA%2C%20United%20States&click_referer=t%3ASEE_ALL%7Csid%3Afcf33cf1-61b8-41d5-bef1-fbc5d0570810%7Cst%3AHOME_GROUPING_SELECT_HOMES&superhost=false&title_type=SELECT_GROUPING&allow_override%5B%5D=&s_tag=tm-X8bVo" total_pages = 3 for page_num in range(total_pages): # 构造分页URL:第一页section_offset=0,第二页=1,以此类推 if page_num == 0: current_url = first_url else: current_url = f"{first_url}§ion_offset={page_num}" print(f"正在爬取页面: {current_url}") driver.get(current_url) # 显式等待房源列表加载完成,最多等待10秒 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, "_f21qs6")) ) # 额外加短暂等待,确保动态内容完全渲染 time.sleep(2) except Exception as e: print(f"页面 {current_url} 加载超时,跳过: {str(e)}") continue # 解析页面 html = driver.page_source soup = BeautifulSoup(html, "html.parser") listings = soup.find_all("div", {"class": "_f21qs6"}) # 提取房源ID if not listings: print(f"页面 {current_url} 未找到房源") continue for idx, listing in enumerate(listings): try: only_id = listing['id'] print(f"房源ID: {only_id[8:]}") except KeyError: print(f"第{idx+1}个房源缺少ID属性,跳过") # 关闭浏览器 driver.quit()
额外注意事项
- 要确保Chrome浏览器和ChromeDriver的版本匹配,否则会出现启动失败的问题。
- Airbnb有反爬机制,频繁请求可能会被限制,建议在每次请求后加
time.sleep()等待,避免被封IP。 - 类名
_f21qs6是Airbnb的动态类名,可能会随时变化,如果之后爬不到数据,要检查页面元素的类名是否更新了。
内容的提问来源于stack exchange,提问作者Todd
相关产品推荐
相关产品推荐

