Advertisement
Guest User

Untitled

a guest
May 9th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.34 KB | None | 0 0
  1. Created on 03.05.2017
  2.  
  3. @author: Tolga
  4.  
  5. '''
  6. import os #um Ordner zu erstellen
  7. import re
  8. import datetime
  9. import time
  10. import requests
  11. from bs4 import BeautifulSoup
  12.  
  13. # Allow access to command-line arguments
  14. import sys
  15. # Import the core and GUI elements of Qt
  16. from PySide.QtCore import *
  17. from PySide.QtGui import *
  18.  
  19. # Create the QApplication object
  20. qt_app = QApplication(sys.argv)
  21.  
  22. #Hier wird das Hauptfenster erzeugt und alle Signal-/Slot Verbindungen werden aufgebaut.
  23. class Mainwindow(QWidget):
  24. def __init__(self):
  25.  
  26. self.liste = []
  27. self.username = None
  28. self.password = None
  29. self.erg = 0
  30. self.session = None
  31. self.liste = []
  32.  
  33. QWidget.__init__(self)
  34. self.setWindowTitle('Widget')
  35. #self.setMinimumWidth(800)
  36. self.setMinimumHeight(600)
  37.  
  38. self.mainLayout = QHBoxLayout()
  39.  
  40. self.rechtesLayout = QVBoxLayout()
  41. self.spacer1 = QSpacerItem(1,1 , QSizePolicy.Minimum, QSizePolicy.Expanding)
  42. self.rechtesLayout.addItem(self.spacer1)
  43. self.usernameline = QLineEdit("Username")
  44. #self.usernameline.inputContext(self.login)
  45. self.pwline = QLineEdit("Keyword")
  46. #self.pwline.getText(self.pw)
  47. self.rechtesLayout.addWidget(self.usernameline)
  48. self.rechtesLayout.addWidget(self.pwline)
  49. self.buttondownload = QPushButton("Download")
  50. self.buttondownload.clicked.connect(self.login)
  51. self.rechtesLayout.addWidget(self.buttondownload)
  52.  
  53. self.buttonCancel = QPushButton("Close")
  54. self.rechtesLayout.addWidget(self.buttonCancel)
  55. self.buttonCancel.clicked.connect(self.close)
  56.  
  57. self.spacer = QSpacerItem(100, 500, QSizePolicy.Expanding)
  58. self.rechtesLayout.addItem(self.spacer)
  59.  
  60. self.linkesLayout = QVBoxLayout()
  61. self.check = QFileDialog()
  62. self.linkesLayout.addWidget(self.check)
  63. self.listwidget = QListWidget()
  64. self.linkesLayout.addWidget(self.listwidget)
  65.  
  66. self.mainLayout.addLayout(self.linkesLayout)
  67. self.mainLayout.addLayout(self.rechtesLayout)
  68.  
  69. self.setLayout(self.mainLayout)
  70.  
  71. def datetime_from_last_modified(self,lm_string):
  72. """erzeugt ein datetime-Objekt aus dem String "Sun, 23 Mar 2014 21:59:39 GMT" """
  73. #https://docs.python.org/3.5/library/datetime.html#strftime-strptime-behavior
  74. erg = datetime.datetime.strptime(lm_string, "%a, %d %b %Y %H:%M:%S %Z")
  75. #print(erg)
  76. return erg
  77.  
  78.  
  79. def download_and_save_links(self,linkliste, session, count):
  80. """Bekommt eine Liste von Links (<a>...</a>) uebergeben und speichert das Linkziel als Datei im Zielordner "ordner" """
  81. #Zuerst pruefen, ob Dateiordner existiert und falls nicht dann anlegen.
  82. directory =("INFO2", "SuP", "FM2", "FMPraktikum", "KlinischeSysteme", "Eelektrotechnik", "1", "2", "3", "4", "5", "6")
  83. ordner="gespidertes" + directory[count]
  84. if not os.path.exists(ordner):
  85. os.makedirs(ordner)
  86.  
  87.  
  88. #Hilfreich: http://stackoverflow.com/questions/13137817/how-to-download-image-using-requests
  89. for link in linkliste:
  90. datei_url = link.get('href')
  91. print("\nspeichere", datei_url)
  92. r = session.get(datei_url, stream=True)
  93. if r.status_code == 200:
  94. #print(r.headers)
  95.  
  96. #Falls keine Zwischenseite kommt, wird der try-Block komplett durchlaufen
  97. #andernfalls wird in den except-Block gesprungen
  98. try:
  99. cd = r.headers["content-disposition"]
  100. #Beispiel: 'content-disposition': 'inline; filename="Praktikumsregeln und Abgaberegeln \xc3\x9cbungsaufgaben Informatik II 2014-03-11.pdf"'
  101. filename = cd[cd.find('="')+2: -1]#.decode('utf-8')
  102.  
  103. #kompletten Dateinamen incl. Pfad erzeugen. Das koennte man zwar auch mit Stringoperationen machen, aber so ist es Betriebssystemunabhaengig.
  104. dateiname = os.path.join(ordner, filename)
  105.  
  106. #TODO:
  107. #Hier koennte man noch eine Optimierung einbauen dass eine Datei nur dann herunter geladen wird,
  108. #wenn Sie neuer ist als die existierende (bzw. wenn sie noch nicht existiert)
  109.  
  110. with open(dateiname, 'wb') as f:
  111. for chunk in r.iter_content():
  112. f.write(chunk)
  113.  
  114. #Jetzt noch das Datei-Datum korrekt setzen
  115. access_time = datetime.datetime.now()
  116. access_time_int = time.mktime(access_time.timetuple())
  117. last_modification_time = self.datetime_from_last_modified(r.headers['last-modified'])
  118. last_modification_time_int = time.mktime(last_modification_time.timetuple())
  119. times = (access_time_int, last_modification_time_int)
  120. os.utime(dateiname, times)
  121. print("\t*ok*")
  122.  
  123. except:
  124. downloadLink=""
  125.  
  126. #Hier jetzt die Seite neu crawlen
  127.  
  128. courseSeite = session.get(datei_url)
  129. print("Zwischenseite gefunden:", datei_url)
  130. print(courseSeite.status_code)
  131. ganzeZwischenGanz = BeautifulSoup(courseSeite.text, "html.parser")
  132.  
  133. for link in ganzeZwischenGanz.find_all('a'):
  134. if "pluginfile.php" in str(link):
  135. downloadLink=link.get('href')
  136. print("Link in Zwischenseite gefunden", downloadLink)
  137.  
  138. r = session.get(downloadLink, stream=True)
  139. if r.status_code == 200:
  140. cd = r.headers["content-disposition"]
  141. #Beispiel: 'content-disposition': 'inline; filename="Praktikumsregeln und Abgaberegeln \xc3\x9cbungsaufgaben Informatik II 2014-03-11.pdf"'
  142. filename = cd[cd.find('="')+2: -1]#.decode('utf-8')
  143.  
  144. #kompletten Dateinamen incl. Pfad erzeugen. Das koennte man zwar auch mit Stringoperationen machen, aber so ist es Betriebssystemunabhaengig.
  145. dateiname = os.path.join(ordner, filename)
  146.  
  147. #TODO:
  148. #Hier koennte man noch eine Optimierung einbauen dass eine Datei nur dann herunter geladen wird,
  149. #wenn Sie neuer ist als die existierende (bzw. wenn sie noch nicht existiert)
  150.  
  151.  
  152. with open(dateiname, 'wb') as f:
  153. for chunk in r.iter_content():
  154. f.write(chunk)
  155.  
  156. #Jetzt noch das Datei-Datum korrekt setzen
  157. access_time = datetime.datetime.now()
  158. access_time_int = time.mktime(access_time.timetuple())
  159. last_modification_time = self.datetime_from_last_modified(r.headers['last-modified'])
  160. last_modification_time_int = time.mktime(last_modification_time.timetuple())
  161. times = (access_time_int,last_modification_time_int)
  162. os.utime(dateiname, times)
  163. print("\t*ok*")
  164.  
  165.  
  166. def suchelinks(self,r, s):
  167. #if (filename in liste):
  168.  
  169. kurse = "https://relax.reutlingen-university.de/my/"
  170.  
  171. r = s.get(kurse)
  172. quelle = BeautifulSoup(r.text, "html.parser")
  173. liste = []
  174.  
  175. for kurse in quelle.find_all('h2'): #überschrift Format html der links
  176. for kurs in kurse.find_all('a'): # hyperlink in html a href..
  177. #print(kurs)
  178. liste.append(kurs.get('href'))
  179. #print(liste)
  180. return(liste)
  181.  
  182.  
  183. def login(self):
  184. url_login = "https://relax.reutlingen-university.de/login/index.php"
  185. '''url_info2 = "https://relax.reutlingen-university.de/course/view.php?id=9851"
  186. url_SuP = "https://relax.reutlingen-university.de/course/view.php?id=9853"
  187. url_fm = "https://relax.reutlingen-university.de/course/view.php?id=9849"
  188. url_fmprak = "https://relax.reutlingen-university.de/course/view.php?id=9850"
  189. url_klb = "https://relax.reutlingen-university.de/course/view.php?id=7871"
  190. url_elek = "https://relax.reutlingen-university.de/course/view.php?id=9238"'''
  191.  
  192. #liste = (url_info2, url_SuP, url_fm, url_fmprak, url_klb, url_elek)
  193.  
  194. pdf_icon_filename = "pdf-24" #dieser String wird genutzt, um einen URL der auf ein pdf weist zu erkennen.
  195.  
  196. username = "" # Hier Ihren Usernamen eingeben
  197. if username == "":
  198. username = QInputDialog.getText(self,'Text ','username')
  199.  
  200. #ACHTUNG: GEBEN SIE NIEMANDEM EINE PROGRAMMVERSION IN DER HIER IHR PASSWORT STEHT!
  201. #DIESE FUNKTION IST NUR FUER TESTS GEDACHT!
  202. passwort = "" # Wenn hier ein leerer String steht muss das Passwort eingegeben werden
  203. if passwort == "":
  204. passwort = QInputDialog.getText(self,'Text ',' Passwort')
  205.  
  206. logindata={'username': username[0], 'password': passwort[0]}
  207.  
  208. s = requests.Session()
  209.  
  210. r = s.post(url_login, logindata)
  211. print(r.status_code)
  212. #print(r.text)
  213.  
  214. liste = self.suchelinks(r, s)
  215. count = -1
  216. #Beginne an Index 0 anstatt auf 1 (in schleife count = count +1)
  217.  
  218. for element in liste:
  219. count = count + 1
  220. r = s.get(element)
  221. print(r.status_code)
  222.  
  223. webseite = BeautifulSoup(r.text, "html.parser")
  224. #print(webseite.prettify())
  225.  
  226. pdf_links = []
  227. datei_links = []
  228.  
  229. for link in webseite.find_all('a'):
  230. #Die Links, die auf pdf-Dateien verweisen, sehen beispielsweise so aus:
  231. # <a class=""
  232. # href="https://relax.reutlingen-university.de/mod/resource/view.php?id=68654"
  233. # onclick="" >
  234. # <img alt=" "
  235. # class="iconlarge activityicon"
  236. # role="presentation"
  237. # src="https://relax.reutlingen-university.de/theme/image.php/leatherbound_hsrt/core/1398850778/f/pdf-24"/>
  238. # <span class="instancename">
  239. # Info II Prakt 03 04 OOP Einfuehrung Konstruktoren, Attribute
  240. # <span class="accesshide ">
  241. # Datei
  242. # </span>
  243. # </span>
  244. # </a>
  245. #(Zeilenumbrueche manuell eingefuegt um Struktur deutlicher zu machen)
  246. #
  247. #Wenn wir also eine pdf-Datei erkennen wollen, sehen wir das nicht am Dateinamen da RELAX nur
  248. #den Link mit "id=68654" anbietet. Wir muessen uns also an etwas anderem orientieren.
  249. #Ideen: Entweder am Dateinamen des Icons (<img>-tag) oder am Wort "Datei" in <span class="accesshide ">
  250. # Allerdings koennte "Datei" ja auch etwas anderes sein als eine pdf-Datei... (was ev. ja auch gewuenscht ist)
  251.  
  252. #Variante 1: Dateinamen des Icons
  253. if link.img: #Nicht jeder Link hat ein <img>-Tag. Das wuerden Sie spaeter eleganter mit try/except loesen
  254. #print(link.img)
  255. if pdf_icon_filename in str(link.img):
  256. #print("pdf found in:", link.get('href'))
  257. pdf_links.append(link)
  258.  
  259. #Variante 2: "Datei" in <span class="accesshide ">
  260. test_auf_datei = link.find(class_="accesshide")
  261. if test_auf_datei:
  262. #print(test_auf_datei.text)
  263. if "Datei" in test_auf_datei.text:
  264. datei_links.append(link)
  265.  
  266. #jetzt haben wir zwei Listen:
  267. #* pdf_links
  268. #* datei_links
  269. #Wir koennen ja mal testen, in wie weit die ueberein stimmen...
  270. ## print("Links, die in pdf_links sind aber nicht in datei_links:")
  271. ## for l in pdf_links:
  272. ## if l not in datei_links:
  273. ## print(l)
  274. ## print("\nLinks, die in datei_links sind aber nicht in pdf_links:")
  275. ## for l in datei_links:
  276. ## if l not in pdf_links:
  277. ## print(l)
  278.  
  279. #jetzt koennen wir also entscheiden, ob wir nur pdfs oder ob wir alle Dateien runter laden wollen...
  280. self.download_and_save_links(datei_links, s, count)
  281.  
  282. def close(self):
  283. msgBox = QMessageBox(QMessageBox.Question, "-", "Close Window")
  284. msgBox.exec_()
  285. self.destroy()
  286. def run(self):
  287. self.show()
  288. qt_app.exec_()
  289.  
  290. def main():
  291. # Create an instance of the application window and run it
  292. app = Mainwindow()
  293. app.run()
  294.  
  295. if __name__ == '__main__':
  296. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement