使用 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)