J'essaie de scinder plusieurs pages d'un site Web de football. Tous les liens sont dans la liste teamLinks. Un exemple d'un des liens est : 'http://www .premierleague.com//clubs/1/Arsenal/squad?se=79'. Je me demandais juste s'il était possible de faire en sorte que la fonction de requête attende que la page soit complètement mise à jour avant d'être implémentée. Si vous cliquez sur le lien, il affichera initialement l'équipe 2018/2019, puis actualisera l'équipe 2017/2018 qui est celle que je veux.

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"))
1
Nico Sánchez 17 mars 2019 à 22:12

2 réponses

Meilleure réponse

La page que vous essayez de supprimer utilise Javascript pour charger la liste des joueurs que vous souhaitez.

Option 1 : Vous pouvez utiliser ce nouveau module appelé requests-html (je n'ai jamais essayé moi-même) qui prétend prendre en charge Javascript.

Option 2 : À l'aide des outils de développement de Chrome, j'ai pu trouver la demande XHR réelle effectuée par page pour obtenir la liste des joueurs. Ce code peut obtenir votre sortie requise avec le module de requêtes.

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")
1
Kamal 18 mars 2019 à 05:26

J'ai trouvé une solution.Vous devez utiliser le sélénium webdriver en mode headless et obtenir le page_source du pilote et donner un time.sleep(). J'ai vérifié les données qu'il montre comme attendu.

Cependant, je ne connais pas votre liste d'URL, vous pouvez donc créer votre liste et l'essayer. Faites-moi savoir si vous avez besoin d'aide.

from selenium import webdriver
from bs4 import BeautifulSoup
import time

teamlinks=['http://www.premierleague.com//clubs/1/Arsenal/squad?se=79','http://www.premierleague.com//clubs/1/Arsenal/squad?se=54']
playerLink1 = []
playerLink2 = []


    for i in range(len(teamlinks)):
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_argument('--headless')
        chrome_options.add_argument('window-size=1920x1080');
        driver = webdriver.Chrome(options=chrome_options)
        driver.get(teamlinks[i])
        time.sleep(10)
        squadPage=driver.page_source
        soup = BeautifulSoup(squadPage, 'html.parser')
        playerLocation = soup.findAll('a', class_=re.compile("playerOverviewCard"))
        for i in range(len(playerLocation)):

            #Save the link, complete with domain.
            playerLink1.append("http://www.premierleague.com/" +
            playerLocation[i]['href'] + '?se=79')
            #For the second link, change the page from player overview to stats
            playerLink2.append(playerLink1[i].replace("overview", "stats"))
        driver.quit()
    print(playerLink2)
2
KunduK 17 mars 2019 à 23:26