TransferMarkt复杂页面转会数据爬取:空DataFrame问题求助
排查TransferMarkt英超转会数据爬取空DataFrame问题
以下是几个常见的排查方向和解决方法:
1. 请求头缺失触发反爬机制
TransferMarkt会校验请求的User-Agent等头部信息,未携带合法请求头时,服务器可能返回空页面或反爬拦截内容。检查你的请求代码是否添加了完整请求头:
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } response = requests.get(target_url, headers=headers)
调试时可先打印response.status_code确认返回200,再打印response.text前1000字符,验证是否是正常页面内容。
2. 页面元素选择器定位错误
TransferMarkt的转会表格结构有明确标识:
- 转入(In)表格带有
data-tab="in"属性,转出(Out)表格带有data-tab="out"属性,表格本身通常有class="responsive-table" - 若你使用的选择器(如错误的class名称、标签层级)不正确,会导致BeautifulSoup无法找到目标表格。
示例正确的表格定位代码:
# 定位转入表格 in_table = soup.find('table', attrs={'data-tab': 'in'}) # 定位转出表格 out_table = soup.find('table', attrs={'data-tab': 'out'})
若in_table或out_table返回None,说明选择器不匹配当前页面结构,需对照页面截图调整选择器。
3. 动态内容加载问题
如果页面的转会表格是通过JavaScript动态渲染的,仅用requests获取的静态HTML中不会包含表格数据。此时需要改用selenium或playwright模拟浏览器加载页面后再提取内容:
from selenium import webdriver from selenium.webdriver.common.by import By import pandas as pd driver = webdriver.Chrome() driver.get(target_url) # 等待表格加载,可添加显式等待 in_table = driver.find_element(By.CSS_SELECTOR, 'table[data-tab="in"]') # 后续提取逻辑... driver.quit()
4. 数据提取逻辑漏洞
即使成功定位到表格,错误的行/列提取逻辑也会导致空DataFrame:
- 需排除表头行、空行(如带有
class="thead"的行) - 提取单元格内容时,要使用
.text.strip()清理空白字符,避免提取到空字符串 - 检查表格列的索引是否正确,比如球员名、转会费所在的
<td>位置是否和页面结构一致
示例完整的表格数据提取逻辑:
def extract_transfer_data(table): if not table: return pd.DataFrame() # 获取所有数据行(排除表头) rows = table.find_all('tr', class_=['odd', 'even']) transfer_data = [] for row in rows: cols = row.find_all('td') if len(cols) >= 5: # 确保有足够的列数据 player = cols[1].text.strip() club = cols[3].text.strip() fee = cols[4].text.strip() transfer_data.append({ 'Player': player, 'Club': club, 'Transfer Fee': fee }) return pd.DataFrame(transfer_data) in_transfers_df = extract_transfer_data(in_table) out_transfers_df = extract_transfer_data(out_table)
5. 目标页面URL错误
确认你爬取的球队转会页面URL是否正确,需包含正确的球队ID、赛季参数。比如阿森纳2023/24赛季的转会页URL为:https://www.transfermarkt.co.uk/arsenal-fc/transfers/verein/11/saison_id/2023,参数错误会导致页面无转会数据。
内容的提问来源于stack exchange,提问作者Stuart Macfarlane
相关产品推荐
相关产品推荐

