eines vorweg: Ich bin blutiger Anfänger und wage mich mit einem 'ambitionierten' Projekt mit Python heran. Ich möchte einen Webscraper programmieren, der bestimmte Informationen von einer CS:GO-Statistik ausliest und in eine .csv überführt. Ich habe mithilfe von einigen Tutorials, die ich online gefunden habe und ein wenig Hilfe von stackoverflow schon ein funktionierendes Skript zusammenbekommen, das aber nicht ganz perfekt funktioniert.
Zur Ausgangslage: Ich möchte Daten von dieser Seite hier abgreifen https://www.hltv.org/stats/players?star ... 2023-02-26
Das geschieht mit folgendem Code:
Code: Alles auswählen
#dependencies
import streamlit as st
import requests
import pandas as pd
from bs4 import BeautifulSoup
st.set_page_config(page_title='CS:GO Players Market Values')
st.header('Display CS:GO Players Market Values below')
st.subheader('Who is the most expensive player?')
url = 'https://www.hltv.org/stats/players?startDate=2022-02-26&endDate=2023-02-26&matchType=Lan'
#empty array
player_list = []
#requesting and parsing the HTML file
response = requests.get(url)
#print(response.status_code)
soup = BeautifulSoup(response.text, 'html.parser')
#selecting the table
table = soup.find('table', class_ = 'stats-table')
#print(table)
#storing all rows into one variable
for player_data in table.find_all('tbody'):
rows = player_data.find_all('tr')
#looping through the HTML table to scrape the data
for row in rows:
nick = row.find_all('td')[0].text
team = [t.get('title') for t in row.find_all('td')[1].find_all('img')]
maps = row.find_all('td')[2].text
rounds = row.find_all('td')[3].text
kddiff = row.find_all('td')[4].text
killdeath = row.find_all('td')[5].text
rating = row.find_all('td')[6].text
#print(nick)
#print(team)
#sending scraped data to the empty array
player_list.append({
'Name': nick,
'Team': team,
'Maps': maps,
'Rounds': rounds,
'K/D diff': kddiff,
'K/D': killdeath,
'Rating': rating,
})
#print(player_list)
#creating a dataframe
df = pd.DataFrame(player_list)
#naming the columns
df.columns = ['Player', 'Team', 'Maps', 'Rounds', 'K/D D', 'K/D', 'Rating']
#exporting data into Excel
df.to_csv('PlayerData.csv')
print(df.to_markdown())
st.text(df.to_markdown())

Daher ist meine Frage zunächst einmal wie ich den command: team = [t.get('title') for t in row.find_all('td')[1].find_all('img')] so modifizieren kann, dass ich nur das aktuelle Team erhalte. Im Quelltext der Ursprungswebsite ist das aktuelle team in dieser Form hinterlegt: <td class="teamCol" data-sort="Outsiders"> .
Hat da jemand eine Idee?
Weiterhin würde ich gerne zu den Spielern von anderen Websites weitere Informationen abrufen und mit in die .CSV schreiben. Ich würde z.B. gerne das Alter der Spieler über Liquipedia scrapen und die Anzahl der Follower von Twitter abrufen. Ich weiß, dass es grundsätzlich möglich sein sollte, das beides zu erreichen doch wie lautet da der Ansatz, dass ich beides Teil meines von meinem player_list [] Objekt werden lasse? Die größte Herausforderung, die ich hier sehe ist, dass ich die beiden Datensätze irgendwie verknüpfen muss, so dass dem richtigen Spieler die richtige Information von z.B. Liquipedia zugeordnet wird.
Für eure Hilfe bin ich sehr dankbar!