如何用Python+Selenium抓取带横向滚动分页的PressReader新闻
解决PressReader横向滚动加载内容的抓取方案
核心思路
由于网站滚动后旧内容会被替换,不能等全部加载完成再统一提取,必须滚动一次、提取一次当前可见文章、保存一次,循环执行直到无法加载新内容为止。
具体实现步骤
初始化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")))循环滚动+提取+去重
用文章链接作为唯一标识避免重复抓取,每次横向滚动一段距离,等待新内容加载后提取当前文章: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()优化建议
- 替换固定
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
相关产品推荐
相关产品推荐

