You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 02:01:03