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

如何用Python+Selenium抓取带横向滚动分页的PressReader新闻

解决PressReader横向滚动加载内容的抓取方案

核心思路

由于网站滚动后旧内容会被替换,不能等全部加载完成再统一提取,必须滚动一次、提取一次当前可见文章、保存一次,循环执行直到无法加载新内容为止。

具体实现步骤

  1. 初始化Selenium并加载目标页面
    配置ChromeDriver,打开搜索页面后等待初始内容加载完成:

    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
    import time
    
    driver = webdriver.Chrome()
    target_url = "https://www.pressreader.com/search?query=Evergrande&in=ALL&date=Anytime&hideSimilar=0&type=2&state=2"
    driver.get(target_url)
    # 等待初始文章列表加载
    WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, "div.search-result-item")))
    
  2. 循环滚动+提取+去重
    用文章链接作为唯一标识避免重复抓取,每次横向滚动一段距离,等待新内容加载后提取当前文章:

    collected_articles = set()
    last_scroll_position = 0
    
    while True:
        # 提取当前页面所有可见文章
        articles = driver.find_elements(By.CSS_SELECTOR, "div.search-result-item")
        for article in articles:
            title = article.find_element(By.CSS_SELECTOR, "h3").text.strip()
            link = article.find_element(By.CSS_SELECTOR, "a").get_attribute("href")
            if link not in collected_articles:
                collected_articles.add(link)
                # 可将标题、链接等信息写入文件或数据库
                print(f"标题:{title}\n链接:{link}\n---")
        
        # 横向滚动页面宽度的80%(可根据实际情况调整)
        new_scroll_position = last_scroll_position + driver.execute_script("return window.innerWidth * 0.8")
        driver.execute_script(f"window.scrollTo({new_scroll_position}, 0)")
        last_scroll_position = new_scroll_position
        
        # 等待新内容加载,判断是否滚动到尽头
        time.sleep(2)
        current_scroll_width = driver.execute_script("return document.documentElement.scrollWidth")
        # 滚动后宽度无变化,说明无新内容
        if last_scroll_position >= current_scroll_width:
            break
    
    driver.quit()
    
  3. 优化建议

    • 替换固定time.sleep()为显式等待,比如等待新的文章元素出现,提升可靠性:
      try:
          # 等待文章数量增加
          prev_count = len(collected_articles)
          WebDriverWait(driver, 5).until(lambda d: len(d.find_elements(By.CSS_SELECTOR, "div.search-result-item")) > prev_count)
      except:
          # 超时则判定无新内容,退出循环
          break
      
    • 若遇反爬,可添加随机等待时间、自定义User-Agent、使用代理IP等。

原方法无效原因

你之前执行的document.documentElement.scrollWidth=10000000仅强制修改了滚动宽度,但网站的加载逻辑是监听滚动事件,当滚动到特定位置时才触发新内容请求,强制修改宽度不会触发该逻辑,因此无法加载全部内容。而逐步滚动+即时提取的方式,能模拟用户操作触发加载机制,同时避免旧内容被替换后丢失。

内容的提问来源于stack exchange,提问作者Shu Cheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 10:52:42