首页 > 解决方案 > 在抓取之前等待页面加载

问题描述

我试图浏览足球网站的多个页面。所有链接都在列表 teamLinks 中。其中一个链接的示例是:“ http://www.premierleague.com//clubs/1/Arsenal/squad?se=79 ”。我只是想知道是否可以让请求功能等到页面完全更新后再实现。如果您单击链接,它将最初显示 2018/2019 小队,然后刷新到我想要的 2017/2018 小队。

playerLink1 = []
playerLink2 = []

for i in range(len(teamLinks)):

    # Request
    squadPage = requests.get(teamlinks[i])
    squadTree = html.fromstring(squadPage.content)

    #Extract the player links.
    playerLocation = squadTree.cssselect('.playerOverviewCard')

    #For each player link within the team page.
    for i in range(len(playerLocation)):

        #Save the link, complete with domain.
        playerLink1.append("http://www.premierleague.com/" + 
        playerLocation[i].attrib['href'] + '?se=79')
        #For the second link, change the page from player overview to stats
        playerLink2.append(playerLink1[i].replace("overview", "stats"))

标签: pythonweb-scrapingbeautifulsoup

解决方案


您尝试抓取的页面正在使用 Javascript 加载您想要的播放器列表。

选项 1:您可以使用这个名为requests-html 的新模块(我自己从未尝试过),它声称支持 Javascript。

选项 2:使用 Chrome 的 devtools,我可以找到页面发出的实际 XHR 请求以获取播放器列表。此代码可以使用 requests 模块获取您所需的输出。

import json
playerLink1 = []
playerLink2 = []
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.75 Safari/537.36',
'Origin': 'https://www.premierleague.com',
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Referer': 'https://www.premierleague.com//clubs/1/Arsenal/squad?se=79'}

res = requests.get('https://footballapi.pulselive.com/football/teams/1/compseasons/79/staff?altIds=true&compCodeForActivePlayer=EN_PR', headers=headers)

player_data = json.loads(res.content.decode('utf-8'))

for player in player_data['players']:
    href = 'https://www.premierleague.com/players/{}/{}/'.format(player['id'], player['name']['display'].replace(' ', '-'))
    playerLink1.append("http://www.premierleague.com/" + href + "overview" + '?se=79')
    playerLink2.append(href + "stats")

推荐阅读