Ungelesene Beiträge anzeigen.

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Hallo,

ich würde mich gerne per request beim Forum anmelden und dann ca. alle 5min mit bs4 die Startpage scrapen um zu schauen ob neue, ungelesene Beiträge vorhanden sind. Dabei bin ich auf ein kleines Problem gestoßen und habe nun zwei Fragen.
  • @Damaskus: Ist es überhaupt ok das Forum hier zu scrapen?
  • folgender Code sollte eigentlich schon das einloggen übernehmen, allerdings funktioniert da was nicht richtig. Beim Anmelden per Internetbrowser steht nach dem Login, dass es fehlgeschlagende Anmeldeversuche gibt. Also scheint der Code da doch irgendwie zu funktionieren.

Code: Alles auswählen

from bs4 import BeautifulSoup
import requests

HEADERS = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0"}

with requests.Session() as session:
    user_data = {"username":"Jankie", "password":"xxx", "autologin":"on", "login":"Anmelden"}                    
    session.post("https://www.python-forum.de/ucp.php?mode=login", data=user_data)
    start_page = session.get("https://www.python-forum.de/", headers=HEADERS)
    soup = BeautifulSoup(start_page.content, "html.parser")
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Also gegen das eigentliche scrappen habe ich nichts, solange es sich im Rahmen hält und mir nicht den Server überlastet. Also alle 5 Minuten ist durchaus ok.
Aber der Hinweis, dass es natürlich auch zu einem blocken der IP Adresse kommen kann; Fail2ban - als Stichwort.

Ob das ganze überhaupte funktionieren kann? Keine Ahnung!
Habe ich bei phpBB noch nie probiert.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Okay vielen Dank.

Ich habe noch ein bisschen herumprobiert und leider habe ich es immer noch nicht hin bekommen, falls also jemand eine Idee oder einen Tipp hat wäre ich sehr dankbar. :)
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

So, ich habe noch mal bisschen rumgespielt und habe jetzt eine Möglichkeit gefunden wie ich es hin bekomme, folgender Code funktioniert bei mir:

Code: Alles auswählen

from bs4 import BeautifulSoup
import requests

HEADERS = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0",
           "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
           "Accept-Encoding":"gzip, deflate, br",
           "Accept-Language":"de,en-US;q=0.7,en;q=0.3",
           "Connection":"keep-alive",
           "Content-Type":"application/x-www-form-urlencoded"
           }
           
           
LOGIN_URL = "https://www.python-forum.de/ucp.php?mode=login"
PROTECTED_URL = "https://www.python-forum.de/viewonline.php"

def make_soup():
    with requests.Session() as session:
        page = session.get(LOGIN_URL, headers=HEADERS)
        soup_login_page = BeautifulSoup(page.content, "html.parser")    
        session_id = soup_login_page.find('input',{'name': 'sid'}).get('value')
        creation_time = soup_login_page.find('input',{'name': 'creation_time'}).get('value')
        form_token = soup_login_page.find('input',{'name': 'form_token'}).get('value')
        user_data = {"username":"Jankie", "password":"x", "autologin":"on", "login":"Anmelden", "sid":session_id, "creation_time":creation_time, "form_token":form_token} 
        session.post(LOGIN_URL, headers=HEADERS, data=user_data, verify=False)
        start_page = session.get(PROTECTED_URL, headers=HEADERS)
        soup_start_page = BeautifulSoup(start_page.content, "html.parser")
        return soup_start_page

        
        
def main():        
    soup =  make_soup()
    username = soup.find('span',{'class':'username'}).get_text()
    print(username)

main()
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Komischerweise funktioniert der Code nur manchmal.

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\xx\Desktop\new 2.py", line 36, in <module>
    main()
  File "C:\Users\xx\Desktop\new 2.py", line 33, in main
    username = soup.find('span',{'class':'username'}).get_text()
AttributeError: 'NoneType' object has no attribute 'get_text'
Hat da vielleicht noch jemand eine Idee?
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jankie: Du müsstest Dir in dem Fall halt mal das HTML ausgeben lassen und schauen wie das aussieht.

Ausserdem prüfst Du gar nicht ob der Server eine „ist okay“-Antwort gegeben hat oder der Körper eine HTML-Fehlerseite enthält. Schau Dir beispielsweise mal die `raise_for_status()`-Methode von den `Response`-Objekten an.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Habe mir das HTML mal angesehen. Sieht aus wie die Anmeldeseite, daher habe ich die Vermutung, dass das POST irgendwie nicht richtig klappt(?). Allerdings wird es trotzdem als Anmeldeversuch gewertet, denn wenn ich mich ins Forum einlogge erscheint die Meldung "Es gab x fehlgeschlagene Anmeldeversuche". Habe auch mal raise_for_status() versucht, da kommt keine Exception. Statuscode ist 200, also OK, wenn es klappt und wenn es nicht klappt.
Antworten