basketball-reference-player-scraper
Version:
A simple web scraper for NBA player data via Basketball-Reference
43 lines (36 loc) • 1.54 kB
text/typescript
import { getDocument } from './Puppet'
import { nameCheck, getPlayerPageURL } from './Utils'
const BASE_URL = 'https://www.basketball-reference.com/'
const PLAYER_LIST_SELECTOR = 'th[data-stat="player"]'
export const getPlayerDocument = async (matchedPlayer: Element) => {
const { children } = matchedPlayer
const firstTag = children[0]
const tagName = firstTag.tagName.toLowerCase()
const isActive = tagName === 'strong'
const endpoint = getPlayerPageURL(isActive, children)
const playerURL = `${BASE_URL}${endpoint}`
const playerPage = await getDocument(playerURL)
return playerPage
}
export const findPlayer = async (query: string) => {
const hasQuery = query.length > 0
if (!hasQuery) {
throw new Error('Please provide a player name. (Last Name, First Name)')
}
const parsedQuery = query.split(',')
const surname = parsedQuery[0]
const fullName = parsedQuery.reverse().join(' ')
const normalizedName = fullName.toLowerCase().trim()
const firstChar = surname[0].toLowerCase()
const searchQuery = `${BASE_URL}/players/${firstChar}`
const document = await getDocument(searchQuery)
const playerList = document.querySelectorAll(PLAYER_LIST_SELECTOR)
const playerArray = Array.from(playerList)
const matchedPlayer = playerArray.find(nameCheck(normalizedName))
const hasMatch = matchedPlayer !== undefined
if (!hasMatch) {
throw new Error('No Player Found')
}
const playerPage = await getPlayerDocument(matchedPlayer)
return playerPage
}