The 4 Ways to Collect Football Data—and the Best Starting Point for Beginners
epl_schedule = fbref.read_schedule() returns the ff error: [12/15/25 09:01:24] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
1 of 5).
Traceback (most recent call last):
File "/usr/local/lib/python3.12/dist-packages/soccerdata/_common.py",
line 525, in _download_and_save
response.raise_for_status()
File "/usr/local/lib/python3.12/dist-packages/requests/models.py",
line 1026, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url:
https://fbref.com/en/comps/
[12/15/25 09:01:30] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
2 of 5).
[12/15/25 09:01:36] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
3 of 5).
[12/15/25 09:01:42] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
4 of 5).
[12/15/25 09:01:48] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
5 of 5).
---------------------------------------------------------------------------
ConnectionError Traceback (most recent call last)
/tmp/ipython-input-2124964271.py in <cell line: 0>()
----> 1 epl_schedule = fbref.read_schedule()
4 frames
/usr/local/lib/python3.12/dist-packages/soccerdata/_common.py in _download_and_save(self, url, filepath, var)
551 continue
552
--> 553 raise ConnectionError(f"Could not download {url}.")
554
555
ConnectionError: Could not download https://fbref.com/en/comps/.
Anyone with a help?
Hi Yohannes, Fbref increased their scraping protection a month ago, so soccerdata does not work since.
Any alternatives?
Nothing I can share at this point. But scraping using Selenium should still work.
longer deep dives and more python
Always want more football concepts. More python a plus too. I enjoyed this a lot still. Thank you for taking the time to write it up.
Thank you for taking the time to share your feedback 🙏
epl_schedule = fbref.read_schedule() returns the ff error: [12/15/25 09:01:24] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
1 of 5).
Traceback (most recent call last):
File "/usr/local/lib/python3.12/dist-packages/soccerdata/_common.py",
line 525, in _download_and_save
response.raise_for_status()
File "/usr/local/lib/python3.12/dist-packages/requests/models.py",
line 1026, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url:
https://fbref.com/en/comps/
[12/15/25 09:01:30] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
2 of 5).
Traceback (most recent call last):
File "/usr/local/lib/python3.12/dist-packages/soccerdata/_common.py",
line 525, in _download_and_save
response.raise_for_status()
File "/usr/local/lib/python3.12/dist-packages/requests/models.py",
line 1026, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url:
https://fbref.com/en/comps/
[12/15/25 09:01:36] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
3 of 5).
Traceback (most recent call last):
File "/usr/local/lib/python3.12/dist-packages/soccerdata/_common.py",
line 525, in _download_and_save
response.raise_for_status()
File "/usr/local/lib/python3.12/dist-packages/requests/models.py",
line 1026, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url:
https://fbref.com/en/comps/
[12/15/25 09:01:42] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
4 of 5).
Traceback (most recent call last):
File "/usr/local/lib/python3.12/dist-packages/soccerdata/_common.py",
line 525, in _download_and_save
response.raise_for_status()
File "/usr/local/lib/python3.12/dist-packages/requests/models.py",
line 1026, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url:
https://fbref.com/en/comps/
[12/15/25 09:01:48] ERROR Error while scraping https://fbref.com/en/comps/. Retrying... (attempt _common.py:545
5 of 5).
Traceback (most recent call last):
File "/usr/local/lib/python3.12/dist-packages/soccerdata/_common.py",
line 525, in _download_and_save
response.raise_for_status()
File "/usr/local/lib/python3.12/dist-packages/requests/models.py",
line 1026, in raise_for_status
raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 403 Client Error: Forbidden for url:
https://fbref.com/en/comps/
---------------------------------------------------------------------------
ConnectionError Traceback (most recent call last)
/tmp/ipython-input-2124964271.py in <cell line: 0>()
----> 1 epl_schedule = fbref.read_schedule()
4 frames
/usr/local/lib/python3.12/dist-packages/soccerdata/_common.py in _download_and_save(self, url, filepath, var)
551 continue
552
--> 553 raise ConnectionError(f"Could not download {url}.")
554
555
ConnectionError: Could not download https://fbref.com/en/comps/.
Anyone with a help?
Hi Yohannes, Fbref increased their scraping protection a month ago, so soccerdata does not work since.
Any alternatives?
Nothing I can share at this point. But scraping using Selenium should still work.
longer deep dives and more python
Always want more football concepts. More python a plus too. I enjoyed this a lot still. Thank you for taking the time to write it up.
Thank you for taking the time to share your feedback 🙏