网页抓取遇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
相关产品推荐
相关产品推荐

