dfde_statistics_extractor.py
von heisenberg- SNIPPET_DESC:
- Extrahiert Statistikdaten vom deutschen phpBB
- SNIPPET_CREATION_TIME:
- 23.10.2024 18:59:21
- SNIPPET_PRUNE_TIME:
- Unendlich
- SNIPPET_TEXT:
-
- #!/usr/bin/env python3
- import re
- import json
- import requests
- import pprint
- from bs4 import BeautifulSoup
- import time
- # URL der Webseite
- url = 'https://debianforum.de/forum/' # Hier die URL der gewünschten Seite einfügen
- output_file = "/var/www/data.megabert.de/wwwroot/dfde_statistics.json"
- # öffentliche URL: https://data.megabert.de/dfde_statistics.json
- # HTML-Inhalt der Webseite abrufen
- response = requests.get(url)
- html_data = response.text
- # BeautifulSoup-Objekt erstellen
- soup = BeautifulSoup(html_data, 'html.parser')
- # Alle <a>-Elemente mit der Klasse 'forumtitle' und die entsprechenden <dd>-Elemente mit 'topics' und 'posts'
- forum_data = soup.find_all('a', class_='forumtitle')
- # Ergebnis ausgeben
- data = { 'forums' : [] }
- for forum in forum_data:
- forum_title = forum.text.strip() # Titel des Forums
- parent = forum.find_parent('dl') # Suche den übergeordneten <dl>-Tag
- matches = re.findall(r'f=(\d+)', forum["href"])
- forum_id=int(matches[0])
- topics = parent.find('dd', class_='topics').text.strip() # Anzahl der Themen
- pattern = r'(\d+)'
- matches = re.findall(pattern, topics)
- topics = int(matches[0])
- posts = parent.find('dd', class_='posts').text.strip() # Anzahl der Beiträge
- pattern = r'(\d+)'
- matches = re.findall(pattern, posts)
- posts = int(matches[0])
- forum_entry = {
- 'forum_title' : forum_title,
- 'forum_id' : forum_id,
- 'topic_count' : topics,
- 'post_count' : posts,
- }
- data["forums"].append(forum_entry)
- # --- Daten aus dem "users online" Block extrahieren ---
- online_list = soup.find('div',class_='online-list');
- online_list_text = online_list.select_one("p").text;
- pattern = r'(\d+)\s+(Besucher|sichtbare Mitglieder|unsichtbares? Mitglied|Gäste)'
- matches = re.findall(pattern, online_list_text)
- number = [int(match[0]) for match in matches]
- data["online_users"] = {
- "visitors" : number[0],
- "visible" : number[1],
- "hidden" : number[2],
- "guests" : number[3],
- }
- # --- Daten aus dem Statistikblock extrahieren ---
- statistics = soup.find('div',class_='statistics').text;
- pattern = r'(Beiträge insgesamt|Themen insgesamt|Mitglieder insgesamt)\s(\d+)'
- matches = re.findall(pattern, statistics)
- number = [int(match[1]) for match in matches]
- data["statistics"] = {
- "posts" : number[0],
- "threads" : number[1],
- "users" : number[2],
- }
- data["generated_utc"] = int(time.time())
- # --- Daten als kompaktes JSON exportieren und in Datei schreiben ---
- json_object = json.dumps(data, separators=(',', ':'))
- f = open(output_file, "w")
- f.write(str(json_object))
- f.close()
Quellcode
Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN