如何用Selenium和BS4抓取AJAX加载的Asda职位列表?
解决Asda职位列表无限滚动爬取问题
你的判断没错,这个网站确实采用了无限滚动加载机制,仅执行一次滚动+固定休眠的方式无法触发全部内容加载,下面是修正后的可行方案:
关键问题梳理
- 原代码仅执行一次滚动,无法触发后续内容加载逻辑
chrome_options参数已被废弃,需改用标准options参数传递配置- Headless模式下未设置窗口大小,可能导致页面布局异常,影响内容渲染
- 固定
time.sleep()可靠性差,应该用显式等待判断元素加载状态
修正后的代码
import time from selenium import webdriver from selenium.webdriver.chrome.options import Options from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from bs4 import BeautifulSoup # 配置Chrome浏览器选项 options = Options() options.add_argument('--headless=new') # 使用新版Headless模式,更贴近正常浏览器行为 options.add_argument('--window-size=1920,1080') # 设置窗口大小,避免布局异常 options.add_argument('--disable-blink-features=AutomationControlled') # 规避基础反爬检测 url = "https://www.asda.jobs/vacancy/find/results/" browser = webdriver.Chrome(options=options) browser.get(url) # 循环处理无限滚动:直到无法加载新内容 last_page_height = browser.execute_script("return document.body.scrollHeight") while True: # 滚动到当前页面底部 browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待内容加载(可根据实际网络速度调整时长) time.sleep(5) # 获取滚动后的页面高度 current_page_height = browser.execute_script("return document.body.scrollHeight") # 如果高度不再变化,说明已加载完所有内容 if current_page_height == last_page_height: break last_page_height = current_page_height # 显式等待目标容器加载完成,替代固定休眠 WebDriverWait(browser, 20).until( EC.presence_of_element_located((By.CLASS_NAME, "ListGridContainer")) ) # 解析页面内容 soup = BeautifulSoup(browser.page_source, 'html.parser') job_container = soup.find("div", class_="ListGridContainer") # 提取职位信息示例 if job_container: job_cards = job_container.find_all("div", class_="VacancyCard") for card in job_cards: job_title = card.find("h3", class_="VacancyCard-title").get_text(strip=True) job_location = card.find("div", class_="VacancyCard-location").get_text(strip=True) print(f"职位名称:{job_title} | 工作地点:{job_location}") browser.quit()
核心优化说明
- 循环滚动逻辑:通过对比滚动前后的页面高度,精准判断是否加载完所有内容
- 新版Headless模式:
--headless=new相比旧版更接近真实浏览器,减少被反爬机制识别的概率 - 显式等待:用
WebDriverWait替代固定休眠,确保目标元素完全加载后再进行解析 - 反爬规避:禁用自动化特征检测,降低网站拦截风险
内容的提问来源于stack exchange,提问作者ChrisB
相关产品推荐
相关产品推荐

