如何解决Selenium爬取Facebook Marketplace无限滚动重复读取问题
解决Selenium爬取Facebook Marketplace重复读取房源的问题
你当前代码的核心问题是每次滚动页面后重新获取全部房源元素,然后从头遍历整个列表,导致之前已经处理过的前24条被重复读取。
解决方案思路
维护一个记录已处理房源的唯一标识集合,每次只处理新增的未被记录过的房源:
- 用房源的页面唯一属性(比如Facebook给每个房源分配的
data-id、详情页链接等)作为去重标识,避免重复处理。 - 初始加载后,遍历处理未在集合中的条目,处理完将标识存入集合。
- 滚动页面后,重新获取所有房源元素,过滤出不在集合中的新增条目,只处理这些内容。
修改后的代码示例
from selenium.webdriver.common.by import By import random from time import sleep # 初始化已处理房源的标识集合,用页面元素的唯一属性(这里假设用data-id,需根据实际页面调整) processed_listings = set() # 初始获取所有房源元素 current_listings = driver.find_elements(By.XPATH, '//div[@class="x3ct3a4"]') while True: # 遍历当前房源,跳过已处理的条目 for listing in current_listings: # 获取房源的唯一标识,替换成你实际找到的页面属性 listing_id = listing.get_attribute('data-id') if listing_id in processed_listings: continue sleep(random.randint(1, 2)) # 点击打开房源详情 listing.click() sleep(random.randint(1, 2)) # 这里读取你需要的房源数据(示例:标题、价格等) # title = driver.find_element(By.XPATH, '//h1[contains(@class, "x193iq5w")]').text # price = driver.find_element(By.XPATH, '//span[contains(@class, "x193iq5w")]').text # 关闭详情页 close_button = driver.find_element(By.XPATH, close_xpath) close_button.click() sleep(random.randint(1, 2)) # 将已处理的房源标识加入集合 processed_listings.add(listing_id) # 滚动页面加载更多房源 driver.execute_script('window.scrollTo(0, document.body.scrollHeight);') sleep(random.randint(2, 4)) # 重新获取所有房源元素 current_listings = driver.find_elements(By.XPATH, '//div[@class="x3ct3a4"]') # 退出条件:如果没有新增房源,终止循环 if len(current_listings) == len(processed_listings): print("已加载完所有房源,停止爬取") break
关键说明
- 确认房源元素的唯一属性:如果
data-id不存在,可以用房源详情页的href链接、或者标题+价格的组合作为标识(优先用页面自带的唯一ID,避免重复风险)。 - 新增了循环终止条件,防止页面到底后无限滚动。
- 每次循环只处理未被记录的新增房源,彻底解决重复读取问题。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

