Я пытаюсь собрать статистику игроков MLB с сайта mlb.com, используя Selenium и BeautifulSoup, и возвращаю дубликаты многих игроков, а также скучаю по нескольким другим, просто проверив проверку зрения. Неясно, откуда берутся дубликаты или почему я скучаю по другим.
Я решил использовать Selenium вместо запросов, потому что данные хранятся в таблице, но не видны в HTML до тех пор, пока браузер загружает страницу. Есть идеи, откуда возникают ошибки целостности данных?
Заранее спасибо!
Основные моменты из моего сценария ниже
# Navigate to stats page
def getToStats():
url = ("http://mlb.mlb.com/stats/sortable.jsp?c_id=mlb#elem=%5Bobject+Object%5D&tab_level=child&click_text=Sortable+Player+hitting&game_type='R'&season=2019&season_type=ANY&league_code='MLB'§ionType=sp&statType=hitting&page=1&ts=1586832481387&playerType=ALL")
driver.get(url)
html = driver.page_source
# Get source HTML/CSS
def getCurrentURL():
url = driver.current_url
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
new_soup = soup.find("tbody")
return new_soup
def getPlayers(html):
players = []
for player in html.find_all('tr'):
players.append(player)
return players
def getPlayerStats(player):
playerRecord = []
for data in player.find_all('td'):
stat = data.text.replace('\xa0','') # Removes empty non-ASCII character attached to player last name
playerRecord.append(stat)
playerRecord.pop(0) # Removes MLB determined player rank
playerRecord.pop(2) # Removes empty non-ASCII element
return playerRecord
##################FUNCTIONS COMPLETE CODE EXECUTION BEGINS######################
playerData = []
driver = webdriver.Chrome()
getToStats()
html = getCurrentURL()
players = getPlayers(html)
for player in players:
playerData.append(getPlayerStats(player))
print('Page 1 retrieved')
pageNum = 2
for page in range(25):
element = driver.find_elements_by_class_name('paginationWidget-next')
driver.execute_script("arguments[0].click();", element[0])
next_html = getCurrentURL()
playerRecords = getPlayers(next_html)
for player in playerRecords:
playerData.append(getPlayerStats(player))
print('Page ' + str(pageNum) + ' retrieved')
pageNum = pageNum + 1
print('Found the data')
my_df = pd.DataFrame(playerData)
my_df.to_csv('mlb_stats_2019.csv', index = False, header = False)
print('Enjoy your CSV file')
Дублированный образец вывода