使用Selenium+BeautifulSoup爬取无限滚动网站:数据重复且卡在200条
无限滚动爬虫重复数据&爬取停滞问题解决思路
一、先把滚动逻辑改对
无限滚动最容易踩的坑就是没滚到新内容区,或者没等加载完就抓数据,直接导致重复抓取:
- 别用固定像素滚动,直接滚到页面最底部:
driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") - 必须等新内容加载完再继续,用页面高度变化做判断(比固定sleep靠谱):
from selenium.webdriver.support.ui import WebDriverWait last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等页面高度变化,确认新内容加载 WebDriverWait(driver, 10).until( lambda d: d.execute_script("return document.body.scrollHeight") > last_height ) new_height = driver.execute_script("return document.body.scrollHeight") # 高度不变就停,说明没新内容了 if new_height == last_height: break last_height = new_height
二、收集URL时直接去重,别等最后用drop_duplicates
用集合存URL,自动去重,避免重复URL占用资源,也减少后续解析的无用功:
house_urls = set() # 每次滚动后抓当前页面的URL current_links = driver.find_elements(By.CSS_SELECTOR, "替换成你实际的房源链接选择器") for link in current_links: url = link.get_attribute("href") if url: house_urls.add(url) # 最后转成列表用于解析 house_urls = list(house_urls)
三、排查是不是被反爬卡了
卡在200条大概率是网站限制了,试试这几个操作:
- 滚动后加个短等待,比如
time.sleep(1.5),别太猛刷 - 换个User-Agent,模拟真实浏览器:
from selenium.webdriver.chrome.options import Options opts = Options() opts.add_argument("user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36") driver = webdriver.Chrome(options=opts) - 检查是否需要登录,有些网站未登录只能看有限内容
四、确认解析用的选择器没问题
如果选择器选到了重复的元素(比如同一个房源有多个相同链接),也会导致重复数据。右键检查房源卡片,确保只抓每个房源唯一的那个链接元素。
内容的提问来源于stack exchange,提问作者Rasim Dilbani
相关产品推荐
相关产品推荐

