如何用Selenium爬取Transfermarkt全页面?解决代码重复爬取首页问题
问题修复方案
你的代码重复爬第一页的核心原因是循环里每次都请求固定的第一页URL,没带页码参数。Transfermarkt的分页需要在URL末尾加上/page/页码来切换页面。下面是修复后的完整代码,同时优化了等待逻辑和文件操作:
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 # 使用with语句自动管理浏览器和文件,避免资源泄漏 with webdriver.Firefox() as driver, open("superliga.csv", "w", encoding="utf-8") as f: # 写入表头 f.write("Emri,Pozicioni,Mosha,Cmimi\n") # 爬取1-4页 for page in range(1, 5): # 构造带页码的URL url = f"https://www.transfermarkt.com/kategoria-superiore/marktwerte/wettbewerb/ALB1/page/{page}" driver.get(url) # 显式等待表格加载完成,代替固定sleep,更可靠 try: WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "/html/body/div[2]/main/div[2]/div[1]/div/div[3]/div/table/tbody/tr")) ) except Exception as e: print(f"第{page}页加载失败: {e}") continue # 获取球员行元素 elementet = driver.find_elements(By.XPATH, "/html/body/div[2]/main/div[2]/div[1]/div/div[3]/div/table/tbody/tr") for element in elementet: try: # 提取数据,用text属性代替innerHTML更稳定 Emri = element.find_element(By.XPATH, "./td[2]/table/tbody/tr[1]/td[2]/a").text.strip() Pozicioni = element.find_element(By.XPATH, "./td[2]/table/tbody/tr[2]/td").text.strip() Mosha = element.find_element(By.XPATH, "./td[4]").text.strip() Cmimi = element.find_element(By.XPATH, "./td[6]/a").text.strip() # 写入CSV,处理逗号转义(如果球员名字里有逗号) f.write(f'"{Emri}",{Pozicioni},{Mosha},"{Cmimi}"\n') except Exception as e: print(f"提取球员数据失败: {e}") continue
关键修改说明
- 分页URL构造:把循环变量
page拼接到URL末尾,实现切换不同页面 - 显式等待:用
WebDriverWait等待表格加载完成,比固定time.sleep更适配不同网络速度 - 文件操作优化:使用
with语句自动关闭文件和浏览器,避免资源泄漏 - 异常处理:加入try-except捕获加载和提取数据时的异常,防止程序直接崩溃
- 数据处理:用
text.strip()代替innerHTML,同时给含逗号的字段加双引号,避免CSV格式错误
内容的提问来源于stack exchange,提问作者leo
相关产品推荐
相关产品推荐

