【问题标题】:Cannot Scrape Fantasy Table Using Python无法使用 Python 抓取 Fantasy 表
【发布时间】:2019-12-16 22:02:11
【问题描述】:

我正在尝试从以下站点抓取幻想玩家数据:http://www.fplstatistics.co.uk/。该表格在打开网站时出现,但在我抓取网站时不可见。

我尝试了以下方法:

import requests as rq
from bs4 import BeautifulSoup

fplStatsPage = rq.get('http://www.fplstatistics.co.uk')
fplStatsPageSoup = BeautifulSoup(fplStatsPage.text, 'html.parser')
fplStatsPageSoup

桌子也不见了。代替桌子应该在哪里的东西是:

<div>
                The 'Player Data' is out of date.
                <br/> <br/>
                You need to refresh the web page.
                <br/> <br/>
                Press F5 or hit <i class="fa fa-refresh"></i>
</div>

只要表格更新,此消息就会出现在网站上。

然后我查看了开发人员工具,看看是否可以找到检索表数据的 URL,但我没有运气。可能是因为我不知道如何很好地阅读开发人员工具。

然后我尝试使用 Selenium 刷新页面,如上述消息所示:

from selenium import webdriver
import time

chromeDriverPath = '/Users/SplitShiftKing/Downloads/Software/chromedriver'
driver = webdriver.Chrome(chromeDriverPath)
driver.get('http://www.fplstatistics.co.uk')
driver.refresh()
#To give site enough time to refresh
time.sleep(15)
html = driver.page_source
fplStatsPageSoup = BeautifulSoup(html, 'html.parser')
fplStatsPageSoup

输出与以前相同。该表出现在网站上,但不在输出中。

我们将不胜感激。我已经查看了关于溢出的类似问题,但我一直无法找到解决方案。

【问题讨论】:

    标签: python web-scraping beautifulsoup selenium-chromedriver


    【解决方案1】:

    为什么不直接去获取数据的源头。您唯一需要解决的是列名,但这会在一个请求中为您获取所有数据,而无需使用 selenium:

    import pandas as pd
    import requests
    from bs4 import BeautifulSoup
    import re
    
    s = requests.Session()
    url = 'http://www.fplstatistics.co.uk/'
    
    headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Mobile Safari/537.36'}
    
    response = s.get(url, headers=headers)
    soup = BeautifulSoup(response.text, 'html.parser')
    scripts = soup.find_all('script')
    for script in scripts:
        if '"iselRow"' in script.text:
            iselRowVal = re.search('"value":(.+?)}\);}', script.text).group(1).strip()
    
    
    url = 'http://www.fplstatistics.co.uk/Home/AjaxPricesFHandler'
    
    payload = {
    'iselRow': iselRowVal,
    '_': ''}
    
    
    jsonData = requests.get(url, params=payload).json()
    df = pd.DataFrame(jsonData['aaData'])
    

    输出:

    print (df.head(5).to_string())
      0               1        2  3  4    5    6      7  8    9      10     11     12  13  14              15                                                16
    0            Mustafi  Arsenal  D  A  0.3  5.2  £5.2m  0  ---    110  -95.6  -95.6  -1  -1         Mustafi  Everton(A) Bournemouth(A) Chelsea(H) Man Utd(H) 
    1           Bellerín  Arsenal  D  I  0.3  5.4  £5.4m  0  ---  54024    2.6    2.6  -2  -2        Bellerin  Everton(A) Bournemouth(A) Chelsea(H) Man Utd(H) 
    2          Kolasinac  Arsenal  D  I  0.6  5.2  £5.2m  0  ---   5464  -13.9  -13.9  -2  -2       Kolasinac  Everton(A) Bournemouth(A) Chelsea(H) Man Utd(H) 
    3     Maitland-Niles  Arsenal  D  A  2.6  4.6  £4.6m  0  ---  11924  -39.0  -39.0  -2  -2  Maitland-Niles  Everton(A) Bournemouth(A) Chelsea(H) Man Utd(H) 
    4           Sokratis  Arsenal  D  S  1.5  4.9  £4.9m  0  ---  19709  -29.4  -29.4  -2  -2        Sokratis  Everton(A) Bournemouth(A) Chelsea(H) Man Utd(H) 
    

    【讨论】:

    • 嘿chitown88,感谢您的回复,但这对我不起作用。它说我打印时数据框是空的。当我访问 url 时,基本上什么都没有。你是怎么找到那个网址的?
    • 嗯,很有趣。我在上面做了修改。你能试试看会发生什么吗? (我通过开发工具(Ctrl-Shift-I)找到了该网址
    • 哇,太棒了!那么你在 DevTools 中的哪个位置找到了那个 url?另外,您怎么知道名称为“iselRow”的脚本是检索表的脚本?我认为参数基本上成为对 url 的查询是否正确?
    • 是的,需要进行一些调查才能找到所有这些信息。 iselRow 部分对于这个来说是独一无二的。通常参数/查询不是动态的(除非它要求你有一个 cookie)。但这是我为另一个用户写的一个小教程,它基本上展示了我如何找到信息:click hear
    • 您的指南说如果双击名称后没有出现,请寻找另一种方法来获取第 4 步中的数据。还有什么办法?硒?我正在尝试抓取另一个网站。
    【解决方案2】:

    通过请求driver.page_source,您取消了您从 Selenium 获得的任何好处:页面源不包含您想要的表格。该表在页面加载后通过 Javascript 动态更新。您需要在driver 上检索表使用方法,而不是使用BeautifulSoup。例如:

    >>> from selenium import webdriver
    >>> d = webdriver.Chrome()
    >>> d.get('http://www.fplstatistics.co.uk')
    >>> table = d.find_element_by_id('myDataTable')
    >>> print('\n'.join(x.text for x in table.find_elements_by_tag_name('tr')))
    Name
    Club
    Pos
    Status
    %Owned
    Price
    Chgs
    Unlocks
    Delta
    Target
    Kelly Crystal Palace D A 30.7 £4.3m 0 --- 0
    101.0
    Rico Bournemouth D A 14.6 £4.3m 0 --- 0
    100.9
    Baldock Sheffield Utd D A 7.1 £4.8m 0 --- 88 99.8
    Rashford Man Utd F A 26.4 £9.0m 0 --- 794 98.6
    Son Spurs M A 21.6 £10.0m 0 --- 833 98.5
    Henderson Sheffield Utd G A 7.8 £4.7m 0 --- 860 98.4
    Grealish Aston Villa M A 8.9 £6.1m 0 --- 1088 98.0
    Kane Spurs F A 19.3 £10.9m 0 --- 3961 92.9
    Reid West Ham D A 4.6 £3.9m 0 --- 4029 92.7
    Richarlison Everton M A 7.7 £7.8m 0 --- 5405 90.3
    

    【讨论】:

    • 非常感谢您!我不知道“myDataTable”元素。如何获得显示站点组成的不同元素的驱动程序视图?
    • 我刚刚在浏览器中检查了网页以找到表 ID(在本例中使用 Chrome 中的“开发者工具”功能)。
    猜你喜欢
    • 1970-01-01
    • 2018-11-17
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2018-09-12
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多