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

网页抓取遇8秒重定向等待,如何获取目标页面有效数据?

解决网页抓取中重定向等待导致获取错误页面的问题

我尝试抓取某网站的新闻标题和摘要,但遇到了问题:首次打开网站会触发重定向,需要等待8秒才能加载主页面,但当前代码获取到的是重定向页面的数据,而非主页面内容。以下是我的实现代码:

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup

# Specify the path to the ChromeDriver executable
chrome_driver_path = "C:/webdrivers/chromedriver"

# Initialize the webdriver
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))

# Navigate to website
driver.get("https://economictimes.indiatimes.com/markets/stocks/news")
time.sleep(10)
data2, data4 = [], []

while True:
    # Extract data
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    data = soup.find_all("div", {"class": "example-class"})
    for item in data:
        data2.append(item.find_all('h3'))
        data4.append(item.find_all('p'))

    try:
        # Find the "Load More" button
        load_more_button = driver.find_element_by_css_selector("div.autoload_continue")
        # Click the button
        load_more_button.click()
    except:
        break

# Close the browser
driver.quit()

print(data2)

优化方案及修改后的代码

核心问题在于固定等待不可靠,且元素定位和数据提取逻辑存在问题,以下是修正后的实现:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from bs4 import BeautifulSoup

# 初始化浏览器驱动
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://economictimes.indiatimes.com/markets/stocks/news")

# 显式等待主页面新闻容器加载完成,确保重定向完成
wait = WebDriverWait(driver, 15)
wait.until(EC.presence_of_element_located((By.CLASS_NAME, "eachStory")))

data_titles, data_summaries = [], []

while True:
    # 解析当前页面内容
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    # 定位实际的新闻条目容器
    news_items = soup.find_all("div", {"class": "eachStory"})
    
    for item in news_items:
        # 提取标题文本(判断元素存在避免报错)
        title_tag = item.find('h3')
        if title_tag:
            data_titles.append(title_tag.get_text(strip=True))
        # 提取摘要文本
        summary_tag = item.find('p')
        if summary_tag:
            data_summaries.append(summary_tag.get_text(strip=True))
    
    try:
        # 等待加载更多按钮可点击并触发点击
        load_more_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.autoload_continue")))
        load_more_button.click()
        # 等待新内容加载完成(通过检测旧元素失效判断)
        wait.until(EC.staleness_of(news_items[-1]))
    except:
        # 无更多内容或按钮不可点击时退出循环
        break

# 关闭浏览器
driver.quit()

# 输出结果
print("新闻标题列表:")
for title in data_titles:
    print("-", title)
print("\n新闻摘要列表:")
for summary in data_summaries:
    print("-", summary)

关键改进点

  • 替换固定等待为显式等待:通过WebDriverWait等待主页面的标志性元素(新闻容器eachStory)出现,确保页面完成重定向和加载,比time.sleep()更高效且能适配不同网络环境。
  • 修正废弃API和定位器:将已废弃的find_element_by_css_selector替换为标准的find_element结合By类;同时把占位符example-class替换为目标网站实际的新闻容器类名。
  • 优化数据提取逻辑:直接提取元素的文本内容并去除首尾空格,避免原代码中嵌套列表的问题,同时增加元素存在性判断,防止空值报错。
  • 加载更多逻辑优化:等待新内容加载完成后再继续循环,避免重复抓取旧数据。

内容的提问来源于stack exchange,提问作者Abhitay Shinde

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:05:25