Дождитесь загрузки страницы перед очисткой

#python #web-scraping #beautifulsoup

#python #веб-очистка #beautifulsoup

Вопрос:

Я пытаюсь создать несколько страниц футбольного веб-сайта. Все ссылки находятся в списке 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"))
  

Ответ №1:

Страница, которую вы пытаетесь очистить, использует Javascript для загрузки нужного вам списка проигрывателей.

Вариант 1: Вы можете использовать этот новый модуль под названием requests-html (сам никогда не пробовал), который утверждает, что поддерживает Javascript.

Вариант 2: Используя devtools в Chrome, я смог найти фактический запрос XHR, сделанный page, чтобы получить список игроков. Этот код может получить требуемый результат с помощью модуля 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=trueamp;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. Да, это сработало отлично, однако без добавления » premierleague.com » и ‘?se=79’ к URL-адресу

2. На самом деле, я видел такое дополнение в вашем коде, о котором идет речь. В любом случае, если вы нашли решение своей проблемы, пожалуйста, выберите ответ, чтобы закрыть вопрос.

Ответ №2:

Я нашел одно решение.Вы должны использовать selenium webdriver в headless режиме и получить page_source из драйвера и предоставить некоторые time.sleep() .Я проверил данные, которые он показывает, как ожидалось.

Однако я не знаю вашего списка URL, поэтому вы можете создать свой список и попробовать это.Дайте мне знать, если вам понадобится дополнительная помощь.

 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)