Optimierung der Wikipedia-Auswertung: Neue Spaltenreihenfolge, Datum/Uhrzeit und Version

Spaltenreihenfolge angepasst:

G: Wikipedia URL

H: Erster Absatz des Wikipedia-Artikels

I: Branche (aus Infobox)

J: Umsatz (als Zahl in Mio €, z. B. "159")

K: Anzahl Mitarbeiter (aus Infobox)

Neue Felder:

Spalte N: Aktuelles Datum und Zeit

Spalte Q: Version

Infobox-Ausgabe entfernt:
Die komplette Infobox wird nicht mehr ausgegeben.

Normalisierung der Firmennamen:
Erweiterte Regex entfernt nun eine umfangreiche Liste gängiger Firmierungsformen (u.a. GmbH, G.m.b.H., UG, AG, OHG, KG, GmbH & Co. KG, AG & Co. KG, e.K., Ltd., S.a r.l., Stiftung, Genossenschaft, gGmbH, gUG, PartG, KGaA, SE, OG, e.U., etc.).

Erster Absatz:
Eine neue Methode extrahiert den ersten sinnvollen Absatz des Wikipedia-Artikels.

Umsatzformatierung:
Umsatz wird als reine Zahl (in Mio €) ausgegeben.

Google Sheet Update:
Aktualisierung erfolgt nun in separaten Ranges für die gewünschten Spalten (G:K, N und Q).
This commit is contained in:
2025-03-31 19:52:12 +00:00
parent 3176c701bc
commit caeb841e55

View File

@@ -12,7 +12,7 @@ import csv
# ==================== KONFIGURATION ====================
class Config:
VERSION = "1.1.3"
VERSION = "1.1.4"
LANG = "de"
CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
@@ -55,8 +55,20 @@ def normalize_company_name(name):
"""Entfernt gängige Firmierungsformen und normalisiert den Namen."""
if not name:
return ""
# Liste gängiger Firmierungsformen (inklusive "Gruppe")
pattern = r'\b(gmbh|ag|aktiengesellschaft|co\.?\s*kg|mbh|&\s*co\.?\s*kg|e\.v\.|limited|ltd|inc|corp|corporation|gruppe)\b'
# Liste gängiger Firmierungsformen
forms = [
r'gmbh', r'g\.m\.b\.h\.', r'ug', r'u\.g\.', r'ug \(haftungsbeschränkt\)',
r'u\.g\. \(haftungsbeschränkt\)', r'ag', r'a\.g\.', r'ohg', r'o\.h\.g\.',
r'kg', r'k\.g\.', r'gmbh & co\. kg', r'g\.m\.b\.h\. & co\. k\.g\.',
r'ag & co\. kg', r'a\.g\. & co\. k\.g\.', r'e\.k\.', r'e\.kfm\.', r'e\.kfr\.',
r'ltd\.', r'ltd & co\. kg', r's\.a r\.l\.', r'stiftung', r'genossenschaft',
r'ggmbh', r'gug', r'partg', r'partgmbb', r'kgaa', r'se', r'og', r'o\.g\.',
r'e\.u\.', r'ges\.n\.b\.r\.', r'genmbh', r'verein', r'kollektivgesellschaft',
r'kommanditgesellschaft', r'einzelfirma', r'sàrl', r'sa', r'sagl',
r'gmbh & co\. ohg', r'ag & co\. ohg', r'gmbh & co\. kgaa', r'ag & co\. kgaa',
r's\.a\.', r's\.p\.a\.', r'b\.v\.', r'n\.v\.'
]
pattern = r'\b(' + '|'.join(forms) + r')\b'
normalized = re.sub(pattern, '', name, flags=re.IGNORECASE)
normalized = re.sub(r'[\-]', ' ', normalized) # Ersetze Bindestriche durch Leerzeichen
normalized = re.sub(r'\s+', ' ', normalized).strip()
@@ -79,13 +91,11 @@ class GoogleSheetHandler:
self.sheet_values = self.sheet.get_all_values()
def get_start_index(self):
"""Ermittelt die erste leere Zeile in Spalte N"""
"""Ermittelt die erste leere Zeile in Spalte N (Index 14)"""
filled_n = [row[13] if len(row) > 13 else '' for row in self.sheet_values[1:]]
return next((i + 1 for i, v in enumerate(filled_n, start=1) if not str(v).strip()), len(filled_n) + 1)
def update_row(self, row_num, values):
"""Aktualisiert eine Zeile im Sheet (Spalten G bis K, also 5 Spalten)"""
self.sheet.update(range_name=f"G{row_num}:K{row_num}", values=[values])
# Für die neuen Updates nutzen wir separate Update-Aufrufe
# ==================== WIKIPEDIA SCRAPER ====================
class WikipediaScraper:
@@ -208,7 +218,6 @@ class WikipediaScraper:
match = re.search(r'(\d{1,3}(?:[.,]\d{3})*|\d+)', raw_value.replace('.', '').replace(',', '.'))
if match:
num = float(match.group(1))
# Umsatz in Mio € als Zahl (aufgerundet)
return str(int(round(num)))
return raw_value.strip()
if target == 'mitarbeiter':
@@ -310,16 +319,22 @@ class DataProcessor:
else:
company_data = {'url': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.', 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.'}
current_values = self.sheet_handler.sheet.row_values(row_num)
new_values = [
company_data.get('url', 'k.A.'), # Spalte G: Wikipedia URL
company_data.get('first_paragraph', 'k.A.'), # Spalte H: Erster Absatz
company_data.get('branche', 'k.A.'), # Spalte I: Branche
company_data.get('umsatz', 'k.A.'), # Spalte J: Umsatz (als Zahl in Mio €)
company_data.get('mitarbeiter', 'k.A.') # Spalte K: Anzahl Mitarbeiter
]
self.sheet_handler.update_row(row_num, new_values)
print(f"✅ Aktualisiert: URL: {new_values[0]}, Erster Absatz: {new_values[1][:30]}..., Branche: {new_values[2]}, Umsatz: {new_values[3]}, Mitarbeiter: {new_values[4]}")
# Update der Spalten:
# G: URL, H: erster Absatz, I: Branche, J: Umsatz (als Zahl), K: Mitarbeiter
self.sheet_handler.sheet.update(f"G{row_num}:K{row_num}", [[
company_data.get('url', 'k.A.'),
company_data.get('first_paragraph', 'k.A.'),
company_data.get('branche', 'k.A.'),
company_data.get('umsatz', 'k.A.'),
company_data.get('mitarbeiter', 'k.A.')
]])
# Spalte N: Datum und aktuelle Zeit
current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.sheet_handler.sheet.update(f"N{row_num}", [[current_dt]])
# Spalte Q: Version
self.sheet_handler.sheet.update(f"Q{row_num}", [[Config.VERSION]])
print(f"✅ Aktualisiert: URL: {company_data.get('url', 'k.A.')}, Erster Absatz: {company_data.get('first_paragraph', 'k.A.')[:30]}..., Branche: {company_data.get('branche', 'k.A.')}, Umsatz: {company_data.get('umsatz', 'k.A.')}, Mitarbeiter: {company_data.get('mitarbeiter', 'k.A.')}")
time.sleep(Config.RETRY_DELAY)
# ==================== MAIN ====================