Webscraper-Programmierung mit Python
Verfasst: Sonntag 26. Februar 2023, 10:27
Hallo zusammen,
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:
Der Streamlit-Bestandteil dient nur für mich zur Visualisierung, der Fokus liegt erst mal auf die Funktionalität das in Excel zu überführen. So weit besteht auch die Grundfunktionalität und das Erzeugen mit der Excel-Tabelle mit den entsprechend Daten ist erfolgreich. Einzig die Spalte "Teams" bereitet mir Probleme, weil das Skript neben den aktuellen Teams der Spieler auch die früheren Teams liefert, siehe hier:

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!
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!