Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Created on 03.05.2017
- @author: Tolga
- '''
- import os #um Ordner zu erstellen
- import re
- import datetime
- import time
- import requests
- from bs4 import BeautifulSoup
- # Allow access to command-line arguments
- import sys
- # Import the core and GUI elements of Qt
- from PySide.QtCore import *
- from PySide.QtGui import *
- # Create the QApplication object
- qt_app = QApplication(sys.argv)
- #Hier wird das Hauptfenster erzeugt und alle Signal-/Slot Verbindungen werden aufgebaut.
- class Mainwindow(QWidget):
- def __init__(self):
- self.liste = []
- self.username = None
- self.password = None
- self.erg = 0
- self.session = None
- self.liste = []
- QWidget.__init__(self)
- self.setWindowTitle('Widget')
- #self.setMinimumWidth(800)
- self.setMinimumHeight(600)
- self.mainLayout = QHBoxLayout()
- self.rechtesLayout = QVBoxLayout()
- self.spacer1 = QSpacerItem(1,1 , QSizePolicy.Minimum, QSizePolicy.Expanding)
- self.rechtesLayout.addItem(self.spacer1)
- self.usernameline = QLineEdit("Username")
- #self.usernameline.inputContext(self.login)
- self.pwline = QLineEdit("Keyword")
- #self.pwline.getText(self.pw)
- self.rechtesLayout.addWidget(self.usernameline)
- self.rechtesLayout.addWidget(self.pwline)
- self.buttondownload = QPushButton("Download")
- self.buttondownload.clicked.connect(self.login)
- self.rechtesLayout.addWidget(self.buttondownload)
- self.buttonCancel = QPushButton("Close")
- self.rechtesLayout.addWidget(self.buttonCancel)
- self.buttonCancel.clicked.connect(self.close)
- self.spacer = QSpacerItem(100, 500, QSizePolicy.Expanding)
- self.rechtesLayout.addItem(self.spacer)
- self.linkesLayout = QVBoxLayout()
- self.check = QFileDialog()
- self.linkesLayout.addWidget(self.check)
- self.listwidget = QListWidget()
- self.linkesLayout.addWidget(self.listwidget)
- self.mainLayout.addLayout(self.linkesLayout)
- self.mainLayout.addLayout(self.rechtesLayout)
- self.setLayout(self.mainLayout)
- def datetime_from_last_modified(self,lm_string):
- """erzeugt ein datetime-Objekt aus dem String "Sun, 23 Mar 2014 21:59:39 GMT" """
- #https://docs.python.org/3.5/library/datetime.html#strftime-strptime-behavior
- erg = datetime.datetime.strptime(lm_string, "%a, %d %b %Y %H:%M:%S %Z")
- #print(erg)
- return erg
- def download_and_save_links(self,linkliste, session, count):
- """Bekommt eine Liste von Links (<a>...</a>) uebergeben und speichert das Linkziel als Datei im Zielordner "ordner" """
- #Zuerst pruefen, ob Dateiordner existiert und falls nicht dann anlegen.
- directory =("INFO2", "SuP", "FM2", "FMPraktikum", "KlinischeSysteme", "Eelektrotechnik", "1", "2", "3", "4", "5", "6")
- ordner="gespidertes" + directory[count]
- if not os.path.exists(ordner):
- os.makedirs(ordner)
- #Hilfreich: http://stackoverflow.com/questions/13137817/how-to-download-image-using-requests
- for link in linkliste:
- datei_url = link.get('href')
- print("\nspeichere", datei_url)
- r = session.get(datei_url, stream=True)
- if r.status_code == 200:
- #print(r.headers)
- #Falls keine Zwischenseite kommt, wird der try-Block komplett durchlaufen
- #andernfalls wird in den except-Block gesprungen
- try:
- cd = r.headers["content-disposition"]
- #Beispiel: 'content-disposition': 'inline; filename="Praktikumsregeln und Abgaberegeln \xc3\x9cbungsaufgaben Informatik II 2014-03-11.pdf"'
- filename = cd[cd.find('="')+2: -1]#.decode('utf-8')
- #kompletten Dateinamen incl. Pfad erzeugen. Das koennte man zwar auch mit Stringoperationen machen, aber so ist es Betriebssystemunabhaengig.
- dateiname = os.path.join(ordner, filename)
- #TODO:
- #Hier koennte man noch eine Optimierung einbauen dass eine Datei nur dann herunter geladen wird,
- #wenn Sie neuer ist als die existierende (bzw. wenn sie noch nicht existiert)
- with open(dateiname, 'wb') as f:
- for chunk in r.iter_content():
- f.write(chunk)
- #Jetzt noch das Datei-Datum korrekt setzen
- access_time = datetime.datetime.now()
- access_time_int = time.mktime(access_time.timetuple())
- last_modification_time = self.datetime_from_last_modified(r.headers['last-modified'])
- last_modification_time_int = time.mktime(last_modification_time.timetuple())
- times = (access_time_int, last_modification_time_int)
- os.utime(dateiname, times)
- print("\t*ok*")
- except:
- downloadLink=""
- #Hier jetzt die Seite neu crawlen
- courseSeite = session.get(datei_url)
- print("Zwischenseite gefunden:", datei_url)
- print(courseSeite.status_code)
- ganzeZwischenGanz = BeautifulSoup(courseSeite.text, "html.parser")
- for link in ganzeZwischenGanz.find_all('a'):
- if "pluginfile.php" in str(link):
- downloadLink=link.get('href')
- print("Link in Zwischenseite gefunden", downloadLink)
- r = session.get(downloadLink, stream=True)
- if r.status_code == 200:
- cd = r.headers["content-disposition"]
- #Beispiel: 'content-disposition': 'inline; filename="Praktikumsregeln und Abgaberegeln \xc3\x9cbungsaufgaben Informatik II 2014-03-11.pdf"'
- filename = cd[cd.find('="')+2: -1]#.decode('utf-8')
- #kompletten Dateinamen incl. Pfad erzeugen. Das koennte man zwar auch mit Stringoperationen machen, aber so ist es Betriebssystemunabhaengig.
- dateiname = os.path.join(ordner, filename)
- #TODO:
- #Hier koennte man noch eine Optimierung einbauen dass eine Datei nur dann herunter geladen wird,
- #wenn Sie neuer ist als die existierende (bzw. wenn sie noch nicht existiert)
- with open(dateiname, 'wb') as f:
- for chunk in r.iter_content():
- f.write(chunk)
- #Jetzt noch das Datei-Datum korrekt setzen
- access_time = datetime.datetime.now()
- access_time_int = time.mktime(access_time.timetuple())
- last_modification_time = self.datetime_from_last_modified(r.headers['last-modified'])
- last_modification_time_int = time.mktime(last_modification_time.timetuple())
- times = (access_time_int,last_modification_time_int)
- os.utime(dateiname, times)
- print("\t*ok*")
- def suchelinks(self,r, s):
- #if (filename in liste):
- kurse = "https://relax.reutlingen-university.de/my/"
- r = s.get(kurse)
- quelle = BeautifulSoup(r.text, "html.parser")
- liste = []
- for kurse in quelle.find_all('h2'): #überschrift Format html der links
- for kurs in kurse.find_all('a'): # hyperlink in html a href..
- #print(kurs)
- liste.append(kurs.get('href'))
- #print(liste)
- return(liste)
- def login(self):
- url_login = "https://relax.reutlingen-university.de/login/index.php"
- '''url_info2 = "https://relax.reutlingen-university.de/course/view.php?id=9851"
- url_SuP = "https://relax.reutlingen-university.de/course/view.php?id=9853"
- url_fm = "https://relax.reutlingen-university.de/course/view.php?id=9849"
- url_fmprak = "https://relax.reutlingen-university.de/course/view.php?id=9850"
- url_klb = "https://relax.reutlingen-university.de/course/view.php?id=7871"
- url_elek = "https://relax.reutlingen-university.de/course/view.php?id=9238"'''
- #liste = (url_info2, url_SuP, url_fm, url_fmprak, url_klb, url_elek)
- pdf_icon_filename = "pdf-24" #dieser String wird genutzt, um einen URL der auf ein pdf weist zu erkennen.
- username = "" # Hier Ihren Usernamen eingeben
- if username == "":
- username = QInputDialog.getText(self,'Text ','username')
- #ACHTUNG: GEBEN SIE NIEMANDEM EINE PROGRAMMVERSION IN DER HIER IHR PASSWORT STEHT!
- #DIESE FUNKTION IST NUR FUER TESTS GEDACHT!
- passwort = "" # Wenn hier ein leerer String steht muss das Passwort eingegeben werden
- if passwort == "":
- passwort = QInputDialog.getText(self,'Text ',' Passwort')
- logindata={'username': username[0], 'password': passwort[0]}
- s = requests.Session()
- r = s.post(url_login, logindata)
- print(r.status_code)
- #print(r.text)
- liste = self.suchelinks(r, s)
- count = -1
- #Beginne an Index 0 anstatt auf 1 (in schleife count = count +1)
- for element in liste:
- count = count + 1
- r = s.get(element)
- print(r.status_code)
- webseite = BeautifulSoup(r.text, "html.parser")
- #print(webseite.prettify())
- pdf_links = []
- datei_links = []
- for link in webseite.find_all('a'):
- #Die Links, die auf pdf-Dateien verweisen, sehen beispielsweise so aus:
- # <a class=""
- # href="https://relax.reutlingen-university.de/mod/resource/view.php?id=68654"
- # onclick="" >
- # <img alt=" "
- # class="iconlarge activityicon"
- # role="presentation"
- # src="https://relax.reutlingen-university.de/theme/image.php/leatherbound_hsrt/core/1398850778/f/pdf-24"/>
- # <span class="instancename">
- # Info II Prakt 03 04 OOP Einfuehrung Konstruktoren, Attribute
- # <span class="accesshide ">
- # Datei
- # </span>
- # </span>
- # </a>
- #(Zeilenumbrueche manuell eingefuegt um Struktur deutlicher zu machen)
- #
- #Wenn wir also eine pdf-Datei erkennen wollen, sehen wir das nicht am Dateinamen da RELAX nur
- #den Link mit "id=68654" anbietet. Wir muessen uns also an etwas anderem orientieren.
- #Ideen: Entweder am Dateinamen des Icons (<img>-tag) oder am Wort "Datei" in <span class="accesshide ">
- # Allerdings koennte "Datei" ja auch etwas anderes sein als eine pdf-Datei... (was ev. ja auch gewuenscht ist)
- #Variante 1: Dateinamen des Icons
- if link.img: #Nicht jeder Link hat ein <img>-Tag. Das wuerden Sie spaeter eleganter mit try/except loesen
- #print(link.img)
- if pdf_icon_filename in str(link.img):
- #print("pdf found in:", link.get('href'))
- pdf_links.append(link)
- #Variante 2: "Datei" in <span class="accesshide ">
- test_auf_datei = link.find(class_="accesshide")
- if test_auf_datei:
- #print(test_auf_datei.text)
- if "Datei" in test_auf_datei.text:
- datei_links.append(link)
- #jetzt haben wir zwei Listen:
- #* pdf_links
- #* datei_links
- #Wir koennen ja mal testen, in wie weit die ueberein stimmen...
- ## print("Links, die in pdf_links sind aber nicht in datei_links:")
- ## for l in pdf_links:
- ## if l not in datei_links:
- ## print(l)
- ## print("\nLinks, die in datei_links sind aber nicht in pdf_links:")
- ## for l in datei_links:
- ## if l not in pdf_links:
- ## print(l)
- #jetzt koennen wir also entscheiden, ob wir nur pdfs oder ob wir alle Dateien runter laden wollen...
- self.download_and_save_links(datei_links, s, count)
- def close(self):
- msgBox = QMessageBox(QMessageBox.Question, "-", "Close Window")
- msgBox.exec_()
- self.destroy()
- def run(self):
- self.show()
- qt_app.exec_()
- def main():
- # Create an instance of the application window and run it
- app = Mainwindow()
- app.run()
- if __name__ == '__main__':
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement