#selenium #web-scraping #jupyter-notebook
Вопрос:
Я извлекаю статистику НБА из своей учетной записи yahoo fantasy. Ниже приведен код, который я сделал в блокноте jupyter, используя selenium. На каждой странице показано 25 игроков и в общей сложности 720 игроков. Я сделал цикл for, который будет очищать игроков с шагом 25, а не по одному.
for k in range (0,725,25): Players = driver.find_elements_by_xpath('//tbody/tr/td[2]/div/div/div/div/a') Team_Position = driver.find_elements_by_xpath('//span[@class= "Fz-xxs"]') Games_Played = driver.find_elements_by_xpath('//tbody/tr/td[7]/div') Minutes_Played = driver.find_elements_by_xpath('//tbody/tr/td[11]/div') FGM_A = driver.find_elements_by_xpath('//tbody/tr/td[12]/div') FTM_A = driver.find_elements_by_xpath('//tbody/tr/td[14]/div') Three_Points = driver.find_elements_by_xpath('//tbody/tr/td[16]/div') PTS = driver.find_elements_by_xpath('//tbody/tr/td[17]/div') REB = driver.find_elements_by_xpath('//tbody/tr/td[18]/div') AST = driver.find_elements_by_xpath('//tbody/tr/td[19]/div') ST = driver.find_elements_by_xpath('//tbody/tr/td[20]/div') BLK = driver.find_elements_by_xpath('//tbody/tr/td[21]/div') TO = driver.find_elements_by_xpath('//tbody/tr/td[22]/div') NBA_Stats = [] for i in range(len(Players)): players_stats = {'Name': Players[i].text, 'Position': Team_Position[i].text, 'GP': Games_Played[i].text, 'MP': Minutes_Played[i].text, 'FGM/A': FGM_A[i].text, 'FTM/A': FTM_A[i].text, '3PTS': Three_Points[i].text, 'PTS': PTS[i].text, 'REB': REB[i].text, 'AST': AST[i].text, 'ST': ST[i].text, 'BLK': BLK[i].text, 'TO': TO[i].text} driver.get('https://basketball.fantasysports.yahoo.com/nba/28951/players?status=ALLamp;pos=Pamp;cut_type=33amp;stat1=S_AS_2021amp;myteam=0amp;sort=ARamp;sdir=1amp;count=' str(k))
Браузер будет переходить постранично после того, как это будет сделано. Я распечатываю результаты. Это всего лишь 1 игрок. Что я сделал не так?
Комментарии:
1. добавьте некоторые задержки с
time.sleep()
(не предпочтительно) или с явным ожиданием селениумов. Возможно, происходит то, что код выполняется слишком быстро и пытается получить элемент, которого больше нет или который еще не отрисован.2. еще одна вещь, которую я бы изменил здесь, это то, что похоже, что вы анализируете
lt;tablegt;
теги. Используйте панд.read_html()
. Это намного проще в использовании3. У меня также есть сильное подозрение, что мы можем получить эти данные через api
Ответ №1:
Трудно понять, в чем здесь проблема, не посмотрев на исходную страницу (можете ли вы указать URL-адрес?), Однако, взглянув на это:
next = driver.find_element_by_xpath('//a[@id = "yui_3_18_1_1_1636840807382_2187"]')
«1636840807382 «выглядит как временная метка Javascript, поэтому я бы предположил, что ссылка, которую вы там жестко закодировали, генерируется динамически, поэтому элемент» yui_3_18_1_1_1636840807382_2187 » больше не существует.
Комментарии:
1. Я заметил, что элемент изменится, если он перейдет на следующую страницу. Поэтому я ищу текст по ссылкам, который называется «Следующие 25».