NoPaste

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:
  1. #!/usr/bin/env python3
  2.  
  3. import re
  4. import json
  5. import requests
  6. import pprint
  7. from bs4 import BeautifulSoup
  8. import time
  9.  
  10. # URL der Webseite
  11. url  = 'https://debianforum.de/forum/'  # Hier die URL der gewünschten Seite einfügen
  12. output_file = "/var/www/data.megabert.de/wwwroot/dfde_statistics.json"
  13. # öffentliche URL: https://data.megabert.de/dfde_statistics.json
  14.  
  15. # HTML-Inhalt der Webseite abrufen
  16. response = requests.get(url)
  17. html_data = response.text
  18.  
  19. # BeautifulSoup-Objekt erstellen
  20. soup = BeautifulSoup(html_data, 'html.parser')
  21.  
  22. # Alle <a>-Elemente mit der Klasse 'forumtitle' und die entsprechenden <dd>-Elemente mit 'topics' und 'posts'
  23. forum_data = soup.find_all('a', class_='forumtitle')
  24.  
  25. # Ergebnis ausgeben
  26. data = { 'forums' : [] }
  27.  
  28. for forum in forum_data:
  29.     forum_title = forum.text.strip()  # Titel des Forums
  30.     parent = forum.find_parent('dl')  # Suche den übergeordneten <dl>-Tag
  31.     matches = re.findall(r'f=(\d+)', forum["href"])
  32.     forum_id=int(matches[0])
  33.  
  34.     topics = parent.find('dd', class_='topics').text.strip()  # Anzahl der Themen
  35.     pattern = r'(\d+)'
  36.     matches = re.findall(pattern, topics)
  37.     topics = int(matches[0])
  38.  
  39.     posts = parent.find('dd', class_='posts').text.strip()    # Anzahl der Beiträge
  40.     pattern = r'(\d+)'
  41.     matches = re.findall(pattern, posts)
  42.     posts = int(matches[0])
  43.  
  44.     forum_entry = {
  45.             'forum_title' : forum_title,
  46.             'forum_id'    : forum_id,
  47.             'topic_count' : topics,
  48.             'post_count'  : posts,
  49.     }
  50.     data["forums"].append(forum_entry)
  51.  
  52. # --- Daten aus dem "users online" Block extrahieren ---
  53.  
  54. online_list = soup.find('div',class_='online-list');
  55. online_list_text = online_list.select_one("p").text;
  56. pattern = r'(\d+)\s+(Besucher|sichtbare Mitglieder|unsichtbares? Mitglied|Gäste)'
  57. matches = re.findall(pattern, online_list_text)
  58. number = [int(match[0]) for match in matches]
  59.  
  60. data["online_users"] = {
  61.         "visitors"      : number[0],
  62.         "visible"       : number[1],
  63.         "hidden"        : number[2],
  64.         "guests"        : number[3],
  65. }
  66.  
  67. # --- Daten aus dem Statistikblock extrahieren ---
  68.  
  69. statistics = soup.find('div',class_='statistics').text;
  70. pattern = r'(Beiträge insgesamt|Themen insgesamt|Mitglieder insgesamt)\s(\d+)'
  71. matches = re.findall(pattern, statistics)
  72. number  = [int(match[1]) for match in matches]
  73.  
  74. data["statistics"] = {
  75.     "posts"   : number[0],
  76.     "threads" : number[1],
  77.     "users"   : number[2],
  78. }
  79.  
  80. data["generated_utc"] = int(time.time())
  81.  
  82. # --- Daten als kompaktes JSON exportieren und in Datei schreiben ---
  83.  
  84. json_object = json.dumps(data, separators=(',', ':'))
  85. f = open(output_file, "w")
  86. f.write(str(json_object))
  87. f.close()

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN