网页爬取故障:Python爬取梦幻橄榄球排名遇JS渲染及元素定位失败
解决梦幻橄榄球排名数据爬取问题
方案一:直接提取页面JS变量(无需Selenium,更适合零基础)
你提到用BeautifulSoup解析时只得到var ecrData,这其实是突破口——页面的排名数据大概率存在这个JS变量里,不用费劲解析渲染后的表格,直接提取这个变量的内容即可:
- 用
requests获取页面源码 - 用正则匹配出
ecrData对应的JSON字符串 - 转成Python可处理的字典,再导出为CSV
代码示例:
import requests import re import json import pandas as pd # 替换成你要爬的目标网页URL target_url = "你的目标网页地址" page_html = requests.get(target_url).text # 匹配var ecrData后面的JSON数据 data_pattern = re.compile(r'var ecrData = (.*?);', re.DOTALL) match_result = data_pattern.search(page_html) if match_result: # 提取并转成Python字典 raw_json = match_result.group(1) ranking_data = json.loads(raw_json) # 这里的'players'是假设的键名,实际要根据ecrData的结构调整 df = pd.DataFrame(ranking_data['players']) # 导出CSV df.to_csv('梦幻橄榄球排名.csv', index=False, encoding='utf-8-sig') print("数据已成功导出为CSV!") else: print("未找到ecrData变量,请检查正则表达式或页面结构")
方案二:修复Selenium定位失败问题
你遇到的NoSuchElementException和页面结构不一致问题,主要是页面未完全渲染就操作或定位器不准确导致的,按下面步骤调整:
核心解决点:
- 用显式等待替代直接定位,确保元素加载完成
- 避免用绝对XPATH,改用相对定位或属性模糊匹配
- 检查元素是否在iframe中,若有需先切换iframe
代码示例:
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 pandas as pd # 初始化浏览器驱动(需提前安装对应浏览器的驱动,如ChromeDriver) driver = webdriver.Chrome() driver.get("你的目标网页URL") try: # 显式等待表格加载,最长等待10秒,替换成实际的表格定位器 ranking_table = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//table[contains(@class, 'ranking-table')]")) ) # 提取表格行和列数据 table_rows = ranking_table.find_elements(By.TAG_NAME, "tr") table_content = [] for row in table_rows: cols = row.find_elements(By.TAG_NAME, "td") row_text = [col.text.strip() for col in cols] if row_text: # 跳过空行 table_content.append(row_text) # 转成DataFrame并导出 df = pd.DataFrame(table_content[1:], columns=table_content[0]) # 第一行作为表头 df.to_csv('梦幻橄榄球排名.csv', index=False, encoding='utf-8-sig') print("CSV导出成功!") except Exception as e: print(f"爬取出错:{str(e)}") finally: driver.quit()
额外注意事项:
- Selenium驱动版本必须和浏览器版本一致,否则会报错
- 如果浏览器检查元素时看到的结构和
page_source输出不同,说明页面是动态加载的,必须等待渲染完成再获取源码 - 若元素在iframe内,需先执行
driver.switch_to.frame("iframe_id_or_name"),操作完后切回主文档:driver.switch_to.default_content()
内容的提问来源于stack exchange,提问作者Kevin O'Keefe
相关产品推荐
相关产品推荐

