【问题标题】:Scraping data from www.transfermarkt.co.uk using BeautifulSoup - Python使用 BeautifulSoup - Python 从 www.transfermarkt.co.uk 抓取数据
【发布时间】:2021-12-17 03:23:11
【问题描述】:

我是抓取的初学者,我正在尝试从这个网站抓取数据(使用 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()

我得到的结果是这样的熊猫数据框:

我的问题: 如果我在 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

由于屏幕上的表格按每个表格页面显示 25 名玩家,我可以只抓取前 25 名玩家信息。

如果我转到第二页(见屏幕),url 不会改变,那么我如何在 python 上控制呢?

我的目标是提取网站内的所有玩家(及其信息)。

【问题讨论】:

    标签: python-3.x web-scraping beautifulsoup request


    【解决方案1】:

    只需在您的网址末尾添加例如&amp;page=2 即可查询第二页,因此它变为:

    ?saison_id=alle&land_id=0&ausrichtung=&spielerposition_id=&altersklasse=&leihe=&w_s=&plus=1&page=2

    注意:为了便于阅读,我缩短了网址。

    解释如何遍历页面的代码:

    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)
    

    【讨论】:

    • 您完全理解我的问题,这就是我正在寻找的解决方案。现在如何在我的代码中使用 page=2 参数让 for 循环为该表的每一页工作?谢谢@whispored2001
    • 查看我的更新答案。不知道是不是你要找的。如果需要,请澄清。
    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多