Seite 1 von 1

python-forum.de Statusanzeige

Verfasst: Mittwoch 30. Oktober 2019, 20:04
von Fire Spike
Hallo Ich habe ein Programm geschrieben das Infos über das Forum anzeigt: Benutzer die online sind und was sie machen, wie viele Themen/ Beiträge/Mitglieder es gibt, der neueste Benutzer und im welchem Unterforum es noch ungelesene Beiträge es gibt.
Das Programm sollte in dem Terminal zu 99.9 % laufen. Die IDLE weiss ich nicht.
Die Ausgabe ist schön und farbig dargestellt.
Bevor das Programm ausgeführt werden kann muss man noch den Benutzername und das Passwort im Code angeben.
Ich freue mich auf ein Feedback und werde neue Ideen umsetzen versuchen und den Code neu posten.

Code: Alles auswählen

from bs4 import BeautifulSoup
from urllib.request import urlopen
from termcolor import colored
import requests
import re
import shutil

terminal_länge, _ = shutil.get_terminal_size()

def status_parser():
    webseite = urlopen("https://www.python-forum.de/index.php")
    html = webseite.read().decode()
    soup = BeautifulSoup(html, "html.parser")

    werte = ["Themen insgesamt", "Beiträge insgesamt", "Mitglieder insgesamt", "neuestes Mitglied"]

    ausgabetext = ""
    abtrennung("Forumstatistik")
    for text in werte:
        ausgabetext += text + ": " + soup.find("div", "statistics").p.find(text=re.compile(text)).next.text + "\n"
    
    print(ausgabetext[:-1])
    print("\n")
def abtrennung(text):
    print(colored(text, "green"))
    
def online_benutzer_parser():
    with requests.Session() as session:
        benutzerdaten = {"username": "dein-benutzername",
                        "password": "dein-passwort",
                        "autologin": "on",
                        "login": "Anmelden"
                         }
        users = []
        aktivitäten = []
        session.post("https://www.python-forum.de/ucp.php?mode=login", data=benutzerdaten)
        html = session.get("https://www.python-forum.de/viewonline.php").text
        soup = BeautifulSoup(html, "html.parser")
        abtrennung("Benutzer die online sind")
        for tag in soup.find("div", "forumbg forumbg-table").table.tbody.find_all("tr"):
            try:
                user = tag.td.a.next
            except AttributeError:
                user = tag.td.span.next
            users.append(user)
        for tag in soup.find("div", "forumbg forumbg-table").table.tbody.find_all("tr"):
            aktivität = tag.contents[3].a.next
            aktivitäten.append(aktivität)
        
        max_länge = len(max(users, key=len))
        for i, a in zip(aktivitäten, users):
#             anzahl = int(max_länge + 5 - len(a))
            anzahl = int(terminal_länge - max_länge - len(a) - len(i) + 5)
            print(a, " " * anzahl, i)
            
        print(soup.find("div", "page-body").p.next)
        print("\n")
        forumstatus(session)
        
def forumstatus(session):
    html = session.get("https://www.python-forum.de/index.php").text
    soup = BeautifulSoup(html, "html.parser")
    abtrennung("Ungelesene Beiträge")
    for tag in soup.find_all("dl", "row-item forum_unread"):
        print(tag.div.a.next)
        
status_parser()
online_benutzer_parser()
Output:

Code: Alles auswählen

Forumstatistik
Themen insgesamt: 42187
Beiträge insgesamt: 346935
Mitglieder insgesamt: 17929
neuestes Mitglied: mxvmp


Benutzer die online sind
Fire Spike                                   Betrachtet „Wer ist online?“
Google [Bot]                                        Liest Thema in Qt/KDE
Bing [Bot]                                         Liest Thema in Tkinter
Sirius3                                                   Foren-Übersicht
Taioft                                                    Foren-Übersicht
Baidu [Spider]                                            Foren-Übersicht
Es ist 1 Gast online


Ungelesene Beiträge
Allgemeine Fragen

Re: python-forum.de Statusanzeige

Verfasst: Mittwoch 30. Oktober 2019, 21:03
von Fire Spike
jetzt noch eine variante die sich aktualisiert.
WARNUNG: der geht nur noch im terminal.

Code: Alles auswählen

from bs4 import BeautifulSoup
from urllib.request import urlopen
from termcolor import colored
import requests
import re
import shutil
import subprocess
import time
import os

terminal_länge, _ = shutil.get_terminal_size()

def status_parser():
    webseite = urlopen("https://www.python-forum.de/index.php")
    html = webseite.read().decode()
    soup = BeautifulSoup(html, "html.parser")

    werte = ["Themen insgesamt", "Beiträge insgesamt", "Mitglieder insgesamt", "neuestes Mitglied"]

    ausgabetext = ""
    abtrennung("Forumstatistik")
    for text in werte:
        ausgabetext += text + ": " + soup.find("div", "statistics").p.find(text=re.compile(text)).next.text + "\n"
    
    print(ausgabetext[:-1])
    print("\n")
def abtrennung(text):
    print(colored(text, "green"))

def leere_terminal():
    if os.name == 'nt': 
        subprocess.call('cls') 
  
    else: 
        subprocess.call('clear')
        
def online_benutzer_parser():
    with requests.Session() as session:
        benutzerdaten = {"username": "dein-benutzername",
                        "password": "dein-passwort",
                        "autologin": "on",
                        "login": "Anmelden"
                         }
        users = []
        aktivitäten = []
        session.post("https://www.python-forum.de/ucp.php?mode=login", data=benutzerdaten)
        html = session.get("https://www.python-forum.de/viewonline.php").text
        soup = BeautifulSoup(html, "html.parser")
        abtrennung("Benutzer die online sind")
        for tag in soup.find("div", "forumbg forumbg-table").table.tbody.find_all("tr"):
            try:
                user = tag.td.a.next
            except AttributeError:
                user = tag.td.span.next
            users.append(user)
        for tag in soup.find("div", "forumbg forumbg-table").table.tbody.find_all("tr"):
            aktivität = tag.contents[3].a.next
            aktivitäten.append(aktivität)
        
        max_länge = len(max(users, key=len))
        for i, a in zip(aktivitäten, users):
#             anzahl = int(max_länge + 5 - len(a))
            anzahl = int(terminal_länge - max_länge - len(a) - len(i) + 5)
            print(a, " " * anzahl, i)
            
        print(soup.find("div", "page-body").p.next)
        print("\n")
        forumstatus(session)
        
def forumstatus(session):
    html = session.get("https://www.python-forum.de/index.php").text
    soup = BeautifulSoup(html, "html.parser")
    abtrennung("Ungelesene Beiträge")
    for tag in soup.find_all("dl", "row-item forum_unread"):
        print(tag.div.a.next)

if __name__ == "__main__":
    try:
        while True:
            status_parser()
            online_benutzer_parser()
            time.sleep(10)
            leere_terminal()
    except KeyboardInterrupt:
            pass