Nếu bạn cần một thư viện Python để lấy dữ liệu bóng đá từ FBref, Understat hay Sofascore mà không muốn tự viết toàn bộ scraper, SoccerData là lựa chọn đáng cân nhắc. Thư viện soccerdata python này trả về Pandas DataFrame với tên cột và ID chuẩn hóa, giúp bạn ghép dữ liệu nhiều nguồn chỉ trong vài dòng code. Bài viết do nhóm biên tập kỹ thuật Ngọc Trai MKT thực hiện, tham chiếu tài liệu tại GitHub SoccerData, FBref và Understat.
Thank you for reading this post, don't forget to subscribe!Vì sao nên chọn SoccerData thay vì tự viết scraper?
Vì bạn tránh được việc duy trì hàng trăm dòng code cho từng web nguồn. SoccerData đóng gói sẵn bộ truy xuất cho hơn 8 nguồn dữ liệu, xử lý cache và chuẩn hóa cột. Thay vì mất 3-5 ngày viết parser, bạn chỉ cần cài đặt, tạo instance và gọi phương thức đọc.
Tự viết scraper cũng dễ vỡ khi website thay đổi cấu trúc. Nếu bạn không theo dõi cập nhật, dữ liệu có thể sai âm thầm. SoccerData gộp các bản vá từ cộng đồng qua GitHub, giúp phát hiện lỗi nhanh hơn. Tuy nhiên, nó vẫn phụ thuộc vào web nguồn nên bạn cần có phương án thay thế.
| Tiêu chí | SoccerData | worldfootballR | StatsBomb |
|---|---|---|---|
| Ngôn ngữ | Python | R | Python, API |
| Nguồn chính | FBref, Understat, Sofascore, WhoScored | FBref, Understat, Transfermarkt | API StatsBomb |
| Dữ liệu xG | Có, từ Understat | Có, từ Understat và FBref | Có, do StatsBomb định nghĩa |
| Độ phức tạp | Trung bình, dùng với Pandas | Khá cao, cần biết R | Cần đăng ký API |
Khoản phí cũng là một lợi thế. Bạn không phải trả tiền cho gói API, nhưng phải trả bằng công sức theo dõi thay đổi HTML. Với dự án nhỏ hoặc luận văn, SoccerData phù hợp; với hệ thống sản xuất cần SLA, bạn nên kết hợp nhiều nguồn và lên kế hoạch dự phòng.
Xem mã nguồn và danh sách nguồn tại GitHub SoccerData. Nếu dùng R, bạn có thể thử worldfootballR. Nếu cần dữ liệu chuyên sâu có cấu trúc, hãy xem StatsBomb Data.
Các nguồn dữ liệu chính mà SoccerData hỗ trợ
SoccerData thiết kế riêng một class cho từng nguồn: FBref, Understat, Sofascore, WhoScored, Football-Data.co.uk, SoFIFA, ESPN và Club Elo. Mỗi class có danh sách league và method đọc dữ liệu riêng. Bạn không cần nhớ cú pháp khác nhau vì đầu ra được chuẩn hóa chung.

Danh sách nguồn cụ thể trong SoccerData giúp bạn hình dung phạm vi dữ liệu:
- FBref: lịch, kết quả, thống kê đội và cầu thủ từ nhiều giải đấu.
- Understat: xG, xA cho 5 giải châu Âu từ mùa 2014/15.
- Sofascore: dữ liệu trận đấu, phong độ cầu thủ.
- Football-Data.co.uk: CSV lịch sử, kèo châu Á, châu Âu từ mùa 1993/94.
- SoFIFA: chỉ số cầu thủ trong game FIFA.
- WhoScored: chấm điểm cầu thủ, thống kê nâng cao.
Với FBref, bạn có thể đọc lịch thi đấu, thống kê đội, thống kê cầu thủ ở nhiều hạng mục: standard, shooting, passing, defense… Understat cung cấp expected goals cho 5 giải châu Âu. Sofascore cung cấp dữ liệu trận đấu theo từng vòng. Football-Data.co.uk là nguồn CSV lịch sử quen thuộc với dân cá cược và nghiên cứu, xem thêm Football-Data.co.uk.
SoccerData thu thập dữ liệu từ FBref, Understat, Sofascore như thế nào?
SoccerData không gom dữ liệu vào một kho trung tâm; nó scrape trực tiếp từ trang nguồn khi bạn gọi method. Ví dụ, class FBref gửi request đến fbref.com và parse bảng HTML thành DataFrame, class Understat parse JSON nhúng trong trang, class Sofascore đọc dữ liệu trận đấu từ URL nội bộ.
Quy trình chung gồm: khởi tạo scraper với league và season, gọi method đọc, thư viện tải HTML/JSON, trích xuất bảng, chuẩn hóa tên cột và trả về DataFrame. Nhờ tách riêng từng class, SoccerData giảm thiểu rủi ro một nguồn lỗi kéo theo toàn bộ hệ thống.
Trong trường hợp nguồn chặn request, SoccerData có thể thất bại. Vì vậy, bạn không nên scrape quá nhiều mùa giải trong một lần chạy; hãy cách quãng request và dùng cache. GitHub repo cũng có issue template để báo cáo lỗi, giúp duy trì chất lượng scraper. Trang chủ FBref và Understat là hai nguồn chính được dùng nhiều nhất trong README.
Quy trình chuẩn hóa ID cầu thủ và đội bóng trong SoccerData hoạt động ra sao?
SoccerData dùng bộ ánh xạ nội bộ để tạo cột chuẩn như player, team, season. ID gốc của trang nguồn vẫn được giữ trong cột *_id, còn tên hiển thị được đồng bộ để tránh việc ‘Man Utd’ và ‘Manchester United’ bị tách thành hai hàng. Bạn vẫn nên kiểm tra dữ liệu trước khi merge.

Cụ thể, khi đọc dữ liệu từ FBref, thư viện đổi tên đội theo chuẩn chung của SoccerData. Khi đọc từ Understat, tên cầu thủ được bỏ dấu và chuyển sang cùng định dạng. Mục tiêu là giúp bạn nối bảng từ nhiều nguồn bằng key player-team-season thay vì tự map thủ công.
Hạn chế là không phải lúc nào tên cầu thủ cũng khớp hoàn toàn, nhất là với biệt danh hoặc tên hiển thị khác nhau. Do đó, bạn nên dùng cột *_id từ nguồn chính khi merge, hoặc giữ lại bảng mapping sau khi kiểm tra. Với dữ liệu chuyển nhượng, việc chuẩn hóa càng quan trọng vì cầu thủ có thể đổi đội giữa mùa.
Cách trích xuất dữ liệu Premier League 2020/21 bằng SoccerData
Để lấy dữ liệu Premier League 2020/21 từ FBref, bạn cài đặt soccerdata, import thư viện, khởi tạo FBref với league ‘ENG-Premier League’ và season ‘2021’. Sau đó, gọi read_schedule() cho lịch thi đấu, read_team_season_stats() cho thống kê đội, read_player_season_stats() cho thống kê cầu thủ. Kết quả là DataFrame với 380 trận của mùa giải.
- Cài đặt:
pip install soccerdata - Import:
import soccerdata as sd - Khởi tạo scraper:
fbref = sd.FBref(leagues='ENG-Premier League', seasons='2021') - Đọc lịch:
matches = fbref.read_schedule() - Thống kê đội:
team_stats = fbref.read_team_season_stats(stat_type='passing') - Thống kê cầu thủ:
player_stats = fbref.read_player_season_stats(stat_type='standard')
SoccerData dùng năm kết thúc mùa giải, nên mùa 2020/21 được khai báo là ‘2021’ thay vì ‘2020’. Nếu bạn dùng Understat, chỉ cần thay class: sd.Understat(leagues='ENG-Premier League', seasons='2021'). Các method đọc dữ liệu tương tự nhưng cột có thể khác đôi chút.
Khi chạy lần đầu, bạn sẽ thấy warning về việc tải dữ liệu từ nguồn công khai. Nên tôn trọng robots.txt, đặt User-Agent rõ ràng và không gửi quá nhiều request trong thời gian ngắn. Nếu chỉ cần một lần phân tích, bạn có thể lưu DataFrame ra CSV để dùng lại, tránh phụ thuộc vào cache.

SoccerData có hỗ trợ dữ liệu real-time phục vụ cá cược không?
Không. SoccerData chủ yếu phục vụ phân tích lịch sử, không phải real-time hay cá cược. Thư viện tải dữ liệu tại thời điểm gọi; không có websocket, không stream trận đấu trực tiếp. Nếu cần dữ liệu trực tiếp, bạn nên dùng API chính thức từ nhà cung cấp hoặc các nguồn dữ liệu thương mại.
Một trận đang diễn ra có tỉ số, sự kiện, thẻ phạt; SoccerData không đảm bảo phản ánh đúng thời điểm. Các web nguồn như FBref không cấp quyền khai thác thời gian thực để scrape. Vì thế, nếu mục tiêu là cá cược, bạn cần kênh dữ liệu trả phí. Với phân tích sau trận, SoccerData vẫn là lựa chọn rẻ và linh hoạt.
Thị trường cá cược cần dữ liệu với độ trễ thấp và nguồn cấp dữ liệu chính thức. SoccerData không cung cấp token, webhook hay tín hiệu giá kèo. Nếu bạn chỉ cần dữ liệu lịch sử để xây mô hình dự đoán, SoccerData vẫn hữu ích; nếu cần live odds, hãy dùng API từ nhà cái hoặc bên thứ ba chuyên về sports data.
Làm gì khi SoccerData ngừng hoạt động do web nguồn thay đổi?
Khi một scraper lỗi, bạn có thể kiểm tra issue trên GitHub và xác định nguồn dữ liệu bị hỏng. Nếu nguyên nhân do cấu trúc HTML thay đổi, bạn có thể fork repo, cập nhật selector, chạy test và tạo pull request. Dữ liệu đã cache vẫn đọc được nếu bạn không cần cập nhật mới.
Quy trình xử lý nhanh: 1) Đọc log lỗi; 2) Xóa cache nếu cần dữ liệu mới; 3) So sánh HTML hiện tại với phiên bản cũ; 4) Sửa trong file scraper tương ứng; 5) Chạy lại test. Nếu không tự sửa được, hãy chuyển tạm sang dữ liệu CSV từ Football-Data.co.uk hoặc chờ bản vá từ cộng đồng.

Ngoài cách tự sửa, bạn có thể giảm rủi ro bằng cách dùng nhiều nguồn song song. Khi FBref lỗi, hãy đọc từ Understat hoặc Football-Data.co.uk; dữ liệu có thể không chi tiết bằng nhưng vẫn đủ cho phân tích cơ bản. Việc có sẵn phương án dự phòng là kỹ năng quan trọng khi làm việc với scraper.
Bạn có thể tìm thêm bài viết về dữ liệu bóng đá tại Ngọc Trai MKT.
Câu hỏi thường gặp
SoccerData có miễn phí không?
Có. Thư viện soccerdata python được phát hành dưới giấy phép MIT, bạn có thể dùng miễn phí cho cả dự án cá nhân lẫn thương mại. Tuy vậy, bạn vẫn phải tuân thủ điều khoản của FBref, Understat, Sofascore và các web nguồn. Một số trang cấm thu thập dữ liệu tự động với quy mô lớn.
SoccerData lấy dữ liệu xG từ đâu?
Chủ yếu từ Understat. Understat cung cấp expected goals cho 5 giải châu Âu: Ngoại hạng Anh, La Liga, Serie A, Bundesliga, Ligue 1. SoccerData đọc dữ liệu này và trả về trong DataFrame có cột xG cho từng trận và từng cầu thủ. Nếu bạn cần xG cho giải đấu nhỏ hơn, cần dùng thêm nguồn khác.
Tôi có thể dùng SoccerData cho mục đích thương mại không?
Phần code của thư viện thì có, vì giấy phép MIT cho phép sử dụng thương mại. Tuy nhiên, dữ liệu thuộc về trang nguồn; một số trang như Understat chỉ cho phép dùng phi thương mại. Vì vậy, bạn cần kiểm tra điều khoản của từng nguồn và cân nhắc sử dụng API trả phí nếu cần dữ liệu ổn định.
Làm sao biết league ID chuẩn để truyền vào SoccerData?
Bạn nên mở notebook example hoặc đọc docstring trong source code của từng scraper. Ví dụ, với FBref, league ‘ENG-Premier League’ và mùa ‘2021’ cho Premier League 2020/21. Với Understat, danh sách league khác nhau. Thông tin này thay đổi theo version nên kiểm tra README là an toàn nhất.

