python-forum.de Statusanzeige

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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
Fire Spike
User
Beiträge: 329
Registriert: Montag 13. Mai 2019, 16:05
Wohnort: Erde

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
Antworten