【问题标题】:Scrape tables with python for player lists使用 python 刮表以获取玩家列表
【发布时间】:2023-03-06 19:54:01
【问题描述】:

我正在尝试为该网站的玩家抓取 EA 体育足球表:

https://www.easports.com/fifa/ultimate-team/fut/database/results?position_secondary=LF,CF,RF,ST,LW,LM,CAM,CDM,CM,RM,RW,LWB,LB,CB,RB,RWB

我已经运行了这个简单的代码,但是我无法获得任何输出 代码:

import requests, bs4

r = requests.get('https://www.easports.com/fifa/ultimate-team/fut/database/results?position_secondary=LF,CF,RF,ST,LW,LM,CAM,CDM,CM,RM,RW,LWB,LB,CB,RB,RWB')
soup = bs4.BeautifulSoup(r.text, 'lxml')
contents = soup.find(class_='contrast-white')

谁能帮帮我?

【问题讨论】:

  • 你能分享一下预期的输出吗?顺便说一句,我无法在浏览器上提供的 url 上找到该类的任何元素。
  • 嗨@bla 预期的输出将是:CRISTIANO RONALDO OVR POS PAC DRI SHO DEF PAS PHY TEAM OF THE YEAR 99 LW 98 99 99 50 94 95 CRISTIANO RONALDO TEAM OF THE SEASON GOLD 99 ST 97 98 99 47 93 96 CRISTIANO RONALDO FUT CHAMPIONS GOLD 99 ST 97 98 99 47 93 96 SUÁREZ FESTIVAL OF FUTBALL 99 ST 94 99 99 61 97 96 PELÉ ICONS 98 ST 95 96 96 60 93 76 OVR MESSI TEAM OF THE YEAR 98 RW 96 99 97 45 98 81 在这种情况下应该是什么类?感谢您的回复。

标签: python python-2.7 web-scraping beautifulsoup


【解决方案1】:

所以该页面的问题在于这些元素是由 javascript 动态生成的。

对我们来说幸运的是,大部分数据来自 api 调用。所以我们可以使用我们的浏览器cookie来绕过这个限制,向实际的api发出请求。

这是我想出的,希望它符合您的需求:

import requests

def parse_item(item):
    attr_list = item['attributes']

    return {
        'name': item['name'],
        'type': item['playerType'],
        'OVR': item['composure'],
        'POS': item['position'],
        'PAC': get_attr_by_name(attr_list, 'PAC'),
        'DRI': get_attr_by_name(attr_list, 'DRI'),
        'SHO': get_attr_by_name(attr_list, 'SHO'),
        'DEF': get_attr_by_name(attr_list, 'DEF'),
        'PAS': get_attr_by_name(attr_list, 'PAS'),
        'PHY': get_attr_by_name(attr_list, 'PHY'),
    }

def get_attr_by_name(attr_list, attr_name):
    attr_name = attr_name.upper()

    try:
        return next(item['value'] for item in attr_list if item['name'].endswith(attr_name))
    except:
        return None


cookies = {
    'hl': 'us',
    'ak_bmsc': '2F856B67859A41FAFB7A62172F068FA7C99F9D14F555000037F4435B86E7E136~plcKkcciaz+3qtfstmojfDw6NLaOVQ0MD41+JJKpeGyyladBNwRB0lLcC8lVi+ELaolN0j0Yzs6HiXjknNAgxjejeFu1I32ZeiaXDNykNhtnNweIIWc26f6y1G6fcpEnkqc2shuFIGn0qSRkilVLfccdJ9pi6yVVjS09lvCSNsi8dNPeU8QUxup+jHmez3zlPebfRyk1zZ8bFb6DBiZ0Dyj6fJepQ89AJ6Kcaf5Ynd3FgefDstwDxcRbDKnssM14iLiSjwri5VWdNP4KtsmmP2as63Xxc5MaVBbTjyk2i5/o8Rj852VMkBWPlskrlkBkliBwOTM4rIFXxZhSSwO2+gog==',
    'bm_sv': '830B3A15206003312D12E0B6FB4A2696~GupjwX5n1ZUaBybPwNV8B+/mIEouVASaWGBxPDg0p/S9lbZ98ziLYDEUArV6w2sGEn7NdWMub6mV5tEsGLoEgI48TmNE1/TUwtEyJcmtg2SlGBlGzFi64B2XdCR6oL2xy92x6zdNb6kOL3U+8YaBhQxd5nutL7sFddcENkQOb3E=',
    'DOT_COM_PHPSESSID': 'e4r4ekoramipe1qvahf0fp2630',
    'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0',
}

params = {
    'jsonParamObject': {
        'page': 1,
        'position': 'LF,CF,RF,ST,LW,LM,CAM,CDM,CM,RM,RW,LWB,LB,CB,RB,RWB'
    }
}

r = requests.get(
    'https://www.easports.com/fifa/ultimate-team/api/fut/item',
    params=params,
    cookies=cookies
)

items = r.json()['items']

data = [parse_item(item) for item in items]

json 很大,所以我写了几个函数来帮助从中提取所需的数据。

data 是一个字典列表。这是单个元素的样子:

>>> data[0]
{'name': 'Cristiano Ronaldo', 'type': 'TEAM OF THE YEAR', 'OVR': 99, 'POS': 'LW', 'PAC': 98, 'DRI': 98, 'SHO': 99, 'DEF': 50, 'PAS': 94, 'PHY': 95}

您可能需要将cookies 上的值更改为浏览器设置的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-09
    • 2021-11-12
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2014-08-10
    相关资源
    最近更新 更多