v1.2.2: Added Wikipedia categories extraction; updated update range to J:O

Zusammenfassung der Änderungen (v1.2.1 → v1.2.2)
Wikipedia-Kategorien:

Neue Methode extract_categories im WikipediaScraper extrahiert die Kategorien aus dem <div id="mw-normal-catlinks"> und gibt sie als kommagetrennten String zurück.

In extract_company_data wird das Ergebnis unter dem Schlüssel "categories" in die Rückgabe aufgenommen.

Update-Range:

Die Wikipedia-Daten werden nun in Spalten J bis O geschrieben (6 Spalten: URL, Absatz, Branche, Umsatz, Mitarbeiter, Kategorien).

Spaltenzuordnung:

Timestamp wird in Spalte Y und Version in Spalte Z aktualisiert.
This commit is contained in:
2025-04-01 09:39:36 +00:00
parent 8ef4280b2b
commit 8e13b5a345

View File

@@ -13,7 +13,7 @@ import csv
# ==================== KONFIGURATION ====================
class Config:
VERSION = "v1.2.1" # v1.2.1: Neue Spaltenzuordnung; Timestamp in Spalte Y, Version in Spalte Z
VERSION = "v1.2.2" # v1.2.2: Neue Spaltenzuordnung & Wikipedia-Kategorien extrahieren
LANG = "de"
CREDENTIALS_FILE = "service_account.json"
SHEET_URL = "https://docs.google.com/spreadsheets/d/1u_gHr9JUfmV1-iviRzbSe3575QEp7KLhK5jFV_gJcgo"
@@ -235,6 +235,15 @@ class WikipediaScraper:
except Exception as e:
debug_print(f"Fehler beim Extrahieren des ersten Absatzes: {e}")
return "k.A."
def extract_categories(self, soup):
"""Extrahiert Wikipedia-Kategorien als kommagetrennte Liste."""
cat_div = soup.find('div', id="mw-normal-catlinks")
if cat_div:
ul = cat_div.find('ul')
if ul:
cats = [clean_text(li.get_text()) for li in ul.find_all('li')]
return ", ".join(cats)
return "k.A."
def _extract_infobox_value(self, soup, target):
infobox = soup.find('table', class_=lambda c: c and any(kw in c.lower() for kw in ['infobox', 'vcard', 'unternehmen']))
if not infobox:
@@ -280,7 +289,7 @@ class WikipediaScraper:
def extract_company_data(self, page_url):
if not page_url:
return {'url': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.',
'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'full_infobox': 'k.A.'}
'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_infobox': 'k.A.'}
try:
response = requests.get(page_url)
soup = BeautifulSoup(response.text, Config.HTML_PARSER)
@@ -291,6 +300,7 @@ class WikipediaScraper:
raw_mitarbeiter = extracted_fields.get('Mitarbeiter', self._extract_infobox_value(soup, 'mitarbeiter'))
umsatz_val = extract_numeric_value(raw_umsatz, is_umsatz=True)
mitarbeiter_val = extract_numeric_value(raw_mitarbeiter, is_umsatz=False)
categories_val = self.extract_categories(soup)
first_paragraph = self.extract_first_paragraph(page_url)
return {
'url': page_url,
@@ -298,12 +308,13 @@ class WikipediaScraper:
'branche': raw_branche,
'umsatz': umsatz_val,
'mitarbeiter': mitarbeiter_val,
'categories': categories_val,
'full_infobox': full_infobox
}
except Exception as e:
debug_print(f"Extraktionsfehler: {str(e)}")
return {'url': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.',
'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'full_infobox': 'k.A.'}
'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_infobox': 'k.A.'}
@retry_on_failure
def search_company_article(self, company_name, website):
search_terms = self._generate_search_terms(company_name, website)
@@ -347,33 +358,34 @@ class DataProcessor:
if i >= self.sheet_handler.get_start_index():
self._process_single_row(i, row)
def _process_single_row(self, row_num, row_data):
# In beiden Modi (normal und Re-Evaluierung) verwenden wir nun das neue Schema:
# Firmenname: Spalte B (Index 1), Website: Spalte C (Index 2)
# Extrahierte Wikipedia-Daten werden in Spalten J bis N geschrieben.
# Timestamp (jetzt) in Spalte Y, Version in Spalte Z.
# Im neuen Schema: Firmenname in Spalte B (Index 1), Website in Spalte C (Index 2).
# Wikipedia-Daten werden in Spalten J bis O geschrieben:
# J: Wikipedia URL, K: Wikipedia Absatz, L: Wikipedia Branche, M: Wikipedia Umsatz, N: Wikipedia Mitarbeiter, O: Wikipedia Kategorien.
# Timestamp (jetzt) in Spalte Y und Version in Spalte Z.
company_name = row_data[1] if len(row_data) > 1 else ""
website = row_data[2] if len(row_data) > 2 else ""
update_range = f"J{row_num}:N{row_num}" # Wikipedia URL, Absatz, Branche, Umsatz, Mitarbeiter
dt_range = f"Y{row_num}" # Timestamp letzte Prüfung
ver_range = f"Z{row_num}" # Version
update_range = f"J{row_num}:O{row_num}"
dt_range = f"Y{row_num}"
ver_range = f"Z{row_num}"
print(f"\n[{datetime.now().strftime('%H:%M:%S')}] Verarbeite Zeile {row_num}: {company_name}")
article = self.wiki_scraper.search_company_article(company_name, website)
if article:
company_data = self.wiki_scraper.extract_company_data(article.url)
else:
company_data = {'url': 'k.A.', 'first_paragraph': 'k.A.', 'branche': 'k.A.',
'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'full_infobox': 'k.A.'}
'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.', 'full_infobox': 'k.A.'}
self.sheet_handler.sheet.update(values=[[
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.')
company_data.get('mitarbeiter', 'k.A.'),
company_data.get('categories', 'k.A.')
]], range_name=update_range)
current_dt = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.sheet_handler.sheet.update(values=[[current_dt]], range_name=dt_range)
self.sheet_handler.sheet.update(values=[[Config.VERSION]], range_name=ver_range)
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.')}")
print(f"✅ Aktualisiert: URL: {company_data.get('url', 'k.A.')}, 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.')}, Kategorien: {company_data.get('categories', 'k.A.')}")
if MODE == "2":
print("----- Vollständiger Infobox-Inhalt -----")
print(company_data.get("full_infobox", "k.A."))
@@ -399,4 +411,4 @@ if __name__ == "__main__":
num_rows = None
processor = DataProcessor()
processor.process_rows(num_rows)
print("\n✅ Wikipedia-Auswertung abgeschlossen (v1.2.0)")
print(f"\n✅ Wikipedia-Auswertung abgeschlossen ({Config.VERSION})")