【问题标题】:Webscraping an alternate version/hidden item from a webpage using python beautifulsoup使用 python beautifulsoup 从网页中抓取替代版本/隐藏项
【发布时间】:2021-02-01 05:00:11
【问题描述】:

我正在尝试从网站上抓取有关前 14 名橄榄球运动员的信息(得分、铲球次数、上场时间、位置等)。 对于每个玩家,我从这个页面获得信息: http://www.lnr.fr/rugby-top-14/joueurs/nicholas-abendanon 对于每个球员,我可以轻松获得 2015-2016 赛季的信息,但我还需要 2014-2015 赛季的信息。

问题是,当我打开相应的链接 (http://www.lnr.fr/rugby-top-14/joueurs/nicholas-abendanon#season=14535) 时,源代码是相同的,我的程序抓取的信息是 2015-2016 年的数据。 即使它出现在网页上,我似乎也找不到获取前几季信息的方法。 有谁知道如何解决这个问题?

这是我作为示例给出的播放器的代码。

import bs4
from lxml import html
import requests
import string
import _pickle as pickle
from bs4 import BeautifulSoup
    
dic={}
url_player='http://www.lnr.fr/rugby-top-14/joueurs/nicholas-abendanon'
page = requests.get(url_player)
html=page.content
parsed_html = BeautifulSoup(html)
body=parsed_html.body
saison14_15=body.find('a',attrs={'data-title':'Saison 2014-2015'})
link=saison14_15['href']
url_season='http://www.lnr.fr/rugby-top-14/joueurs/nicholas-abendanon'+link
page_season = requests.get(url_season)
html_season=page_season.content
parsed_html_season = BeautifulSoup(html_season)
body_season=parsed_html_season.body

dic['nom']=body_season.find('h1',attrs={'id':'page-title'}).text
dic[body_season.find('span',attrs=     {'class':'title'}).text]=body_season.find('span',attrs={'class':'text'}).text
info1=body_season.find('ul',attrs={'class':'infos-list small-bold'})
try:
    for item in info1.findAll('li'):
        dic[item.find('span',attrs={'class':'title'}).text]=item.find('span',attrs={'class':'text'}).text 
    info2=body_season.find('ul',attrs={'class':'fluid-block-grid-3 team-stats'})
    if info2 is not None :
        for item in info2.findAll('li'):   
            dic[item.find('span',attrs={'class':'title'}).text]=item.find('span',attrs={'class':'text'}).text
    info3=body_season.find('ul',attrs={'class':'number-list small-block-grid-2'})
    if info3 is not None :
        for item in info3.findAll('li'):   
            dic[item.find('span',attrs={'class':'title'}).text]=item.find('span',attrs={'class':'text'}).text
except:
    dic=dic`

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    当您选择 2014-2015 赛季时,页面会发出 AJAX 请求

    http://www.lnr.fr/ajax_player_stats_detail?player=33249&compet_type=1&=undefined&season=14535&_filter_current_tab_id=panel-filter-season&ajax-target-selector=%23player_stats_detail_block
    

    如果您随后切换回 2015-2016,它会发出 AJAX 请求

    http://www.lnr.fr/ajax_player_stats_detail?player=33249&compet_type=1&=undefined&season=18505&_filter_current_tab_id=panel-filter-season&ajax-target-selector=%23player_stats_detail_block
    

    每个请求都会返回一块插入到页面中的 HTML。

    如果你能弄清楚playerseason需要的参数,我建议你直接请求数据(完全不加载父页面)。

    【讨论】:

    • 看起来它在删除你提到的 URL 时工作得很好!谢谢。但是,你能解释一下你是怎么找到这些的吗?或者在某个地方我可以了解更多关于 Ajax 请求的信息。我希望下次能够自己解决问题。
    • 我使用带有 Firebug 插件的 Firefox; Firebug 控制台有一个 Network 选项卡,它显示页面发出的任何 ajax 请求。它是深入了解页面工作原理的绝佳工具。
    • 我又打扰你了。我有一个新问题。我正在尝试从此页面中删除“XV de départ”玩家姓名:[lnr.fr/rugby-top-14/matchs/….如您所见,它位于折叠的表格内。我使用了 chrome 'inspect' 插件,但找不到任何 ajax 请求或其他导致包含此信息的 html 代码的请求。你知道怎么找回吗?
    • 这有点棘手,但我找到了。他们正在使用某种实时数据链接;在你看到<script type="text/javascript"> $(function () {new Live.LiveControler($('.page-content'), "\/fdmi?nid=361667",等的页面中。如果你得到http://www.lnr.fr/fdmi?nid=361667,它会返回json;你想要的数据在data["teams"][0]["lineup"]data["teams"][1]["lineup"]中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 2018-04-25
    • 2014-06-20
    相关资源
    最近更新 更多