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:
@@ -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})")
|
||||
|
||||
Reference in New Issue
Block a user