英超官网球员图片爬取求助:获取完整球员姓名及图片链接
问题分析
你的问题核心在于两点:
- 目标页面是动态渲染页面,初始HTTP请求仅返回前10条球员数据,更多内容需要滚动页面触发AJAX加载,
requests无法执行JavaScript,因此拿不到完整数据。 - 球员图片采用懒加载机制,真实图片链接存储在
data-src属性中,直接提取src只能拿到占位图(即显示"player missing"的图片)。
Python 解决方案
使用selenium模拟浏览器行为,实现滚动加载所有球员数据,并提取正确的图片链接:
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 import time # 初始化Chrome浏览器(需提前安装ChromeDriver并配置环境变量) driver = webdriver.Chrome() driver.get("https://www.premierleague.com/players") # 自动关闭Cookie弹窗(若存在) try: accept_btn = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "onetrust-accept-btn-handler")) ) accept_btn.click() except: pass # 无弹窗则跳过 # 循环滚动页面,加载所有球员数据 last_height = driver.execute_script("return document.body.scrollHeight") while True: driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") time.sleep(3) # 等待页面加载 new_height = driver.execute_script("return document.body.scrollHeight") if new_height == last_height: break # 页面高度不再变化,说明加载完成 last_height = new_height # 提取球员姓名与图片链接 player_rows = driver.find_elements(By.CSS_SELECTOR, "tr.player") player_data = [] for row in player_rows: name = row.find_element(By.CSS_SELECTOR, "td.playerName > a").text img_elem = row.find_element(By.CSS_SELECTOR, "td.playerPhoto img") img_url = img_elem.get_attribute("data-src") player_data.append({"姓名": name, "图片链接": img_url}) # 转为DataFrame并输出 df = pd.DataFrame(player_data) print(df) # 关闭浏览器 driver.quit()
代码说明
- 用
selenium处理JavaScript渲染的动态内容,模拟真实用户的滚动操作 - 从
data-src属性提取真实图片链接,解决"player missing"的问题 - 自动处理Cookie弹窗,避免后续操作被拦截
R 解决方案
使用RSelenium模拟浏览器行为,结合rvest解析页面数据:
library(RSelenium) library(rvest) library(dplyr) # 启动Chrome浏览器 rD <- rsDriver(browser = "chrome", port = 4567L) remDr <- rD[["client"]] remDr$navigate("https://www.premierleague.com/players") # 处理Cookie弹窗 tryCatch({ accept_btn <- remDr$findElement(using = "id", value = "onetrust-accept-btn-handler") accept_btn$clickElement() }, error = function(e) {}) # 滚动加载所有球员 last_height <- as.numeric(remDr$executeScript("return document.body.scrollHeight")[[1]]) while(TRUE) { remDr$executeScript("window.scrollTo(0, document.body.scrollHeight);") Sys.sleep(3) new_height <- as.numeric(remDr$executeScript("return document.body.scrollHeight")[[1]]) if(new_height == last_height) break last_height <- new_height } # 解析页面并提取数据 page_source <- remDr$getPageSource()[[1]] soup <- read_html(page_source) players_df <- soup %>% html_elements("tr.player") %>% purrr::map_dfr(function(row) { name <- row %>% html_element("td.playerName > a") %>% html_text() img_url <- row %>% html_element("td.playerPhoto img") %>% html_attr("data-src") tibble(姓名 = name, 图片链接 = img_url) }) print(players_df) # 关闭浏览器 remDr$close() rD[["server"]]$stop()
注意事项
- Python环境需安装依赖:
pip install selenium pandas,并匹配对应浏览器的驱动(如ChromeDriver) - R环境需安装依赖:
install.packages(c("RSelenium", "rvest", "dplyr")),同样需要配置浏览器驱动
内容的提问来源于stack exchange,提问作者user14412363
相关产品推荐
相关产品推荐

