使用 BeautifulSoup - Python 从 www.transfermarkt.co.uk 抓取数据
Scraping data from www.transfermarkt.co.uk using BeautifulSoup - Python
我是抓取的初学者 我正在尝试从该网站抓取数据(使用 beautifulSoup):
https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1
学习这个不完整的教程:https://fcpython.com/scraping/introduction-scraping-data-transfermarkt
更准确地说,在这个网站部分(基本上是一个带有一些历史信息的足球运动员名单):
首先我已经识别出我感兴趣的元素,例如:
- 玩家名
- 价值
- 年龄
- 赛季
其次,我为每个对象创建了 1 个对象,以便将所有这些数据放入 pandas 数据框。
这是我的代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd , numpy as np
headers = {'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}
page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1"
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')
Players = pageSoup.find_all("a", {"class": "spielprofil_tooltip"})
Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})
Age = pageSoup.find_all("td", {"class": "zentriert"})
最后,在 for 循环中,我创建了一个包含我想要的所有信息的 Pandas 数据框:
PlayersList = []
ValuesList = []
value_pre = []
rank = []
age = []
season = []
team = []
missing = []
for i in range(0,25):
PlayersList.append(Players[i].text)
ValuesList.append(Values[i].text)
value_pre.append(Values_pre[2*i].text)
rank.append(Age[(5*i)].text)
age.append(Age[1 + (5*i)].text)
season.append(Age[2 + (5*i)].text)
missing.append(Age[3 + (5*i)].text)
team.append(Age[4 + (5*i)].text)
df = pd.DataFrame({"Players":PlayersList,"Value_post":ValuesList , "value_pre":value_pre , "rank": rank , "age":age , "season":season , "missing": missing , "team":team })
df.head()
我得到的结果是这样的 pandas 数据框:
我的问题:
如果我在 for 循环中的 range()
上输入一个大于 25 的数字,我会得到这个错误:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-202-326415267fee> in <module>
9
10 for i in range(0,26):
---> 11 PlayersList.append(Players[i].text)
12 ValuesList.append(Values[i].text)
13 value_pre.append(Values_pre[2*i].text)
IndexError: list index out of range
由于屏幕上的 table 每个 table 页面显示 25 个玩家,我可以只抓取前 25 个玩家信息。
如果我转到第二页(看屏幕),url 不会改变,那么我如何在 python 上控制它?
我的目标是提取网站内的所有玩家(及其信息)。
在你的url末尾添加例如&page=2
来查询第二页,这样就变成了:
?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1&page=2
注意:为了便于阅读,我缩短了 url。
解释如何遍历页面的代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd , numpy as np
headers = {'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}
# iterate from page 1 to page 10
for pagenum in range(1, 11):
page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1&page=" + str(pagenum)
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')
Players = pageSoup.find_all("a", {"class": "spielprofil_tooltip"})
Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})
Age = pageSoup.find_all("td", {"class": "zentriert"})
print(Players)
我是抓取的初学者 我正在尝试从该网站抓取数据(使用 beautifulSoup): https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1
学习这个不完整的教程:https://fcpython.com/scraping/introduction-scraping-data-transfermarkt
更准确地说,在这个网站部分(基本上是一个带有一些历史信息的足球运动员名单):
首先我已经识别出我感兴趣的元素,例如:
- 玩家名
- 价值
- 年龄
- 赛季
其次,我为每个对象创建了 1 个对象,以便将所有这些数据放入 pandas 数据框。
这是我的代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd , numpy as np
headers = {'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}
page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1"
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')
Players = pageSoup.find_all("a", {"class": "spielprofil_tooltip"})
Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})
Age = pageSoup.find_all("td", {"class": "zentriert"})
最后,在 for 循环中,我创建了一个包含我想要的所有信息的 Pandas 数据框:
PlayersList = []
ValuesList = []
value_pre = []
rank = []
age = []
season = []
team = []
missing = []
for i in range(0,25):
PlayersList.append(Players[i].text)
ValuesList.append(Values[i].text)
value_pre.append(Values_pre[2*i].text)
rank.append(Age[(5*i)].text)
age.append(Age[1 + (5*i)].text)
season.append(Age[2 + (5*i)].text)
missing.append(Age[3 + (5*i)].text)
team.append(Age[4 + (5*i)].text)
df = pd.DataFrame({"Players":PlayersList,"Value_post":ValuesList , "value_pre":value_pre , "rank": rank , "age":age , "season":season , "missing": missing , "team":team })
df.head()
我得到的结果是这样的 pandas 数据框:
我的问题:
如果我在 for 循环中的 range()
上输入一个大于 25 的数字,我会得到这个错误:
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-202-326415267fee> in <module>
9
10 for i in range(0,26):
---> 11 PlayersList.append(Players[i].text)
12 ValuesList.append(Values[i].text)
13 value_pre.append(Values_pre[2*i].text)
IndexError: list index out of range
由于屏幕上的 table 每个 table 页面显示 25 个玩家,我可以只抓取前 25 个玩家信息。
如果我转到第二页(看屏幕),url 不会改变,那么我如何在 python 上控制它?
我的目标是提取网站内的所有玩家(及其信息)。
在你的url末尾添加例如&page=2
来查询第二页,这样就变成了:
?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1&page=2
注意:为了便于阅读,我缩短了 url。
解释如何遍历页面的代码:
import requests
from bs4 import BeautifulSoup
import pandas as pd , numpy as np
headers = {'User-Agent':
'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.106 Safari/537.36'}
# iterate from page 1 to page 10
for pagenum in range(1, 11):
page = "https://www.transfermarkt.co.uk/transfers/transferrekorde/statistik?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1&page=" + str(pagenum)
pageTree = requests.get(page, headers=headers)
pageSoup = BeautifulSoup(pageTree.content, 'html.parser')
Players = pageSoup.find_all("a", {"class": "spielprofil_tooltip"})
Values = pageSoup.find_all("td", {"class": "rechts hauptlink"})
Age = pageSoup.find_all("td", {"class": "zentriert"})
print(Players)