#!/usr/bin/env python # coding: utf-8 # # Netzwerk und Internet # Miteinander kommunizierende Computer sind eine sehr Erfindung. # Prominente Beispiele sind lokale Netzwerke, das Internet, das hier vorliegende IPython Notebook, Smartphones und Raumsonden. # # Im folgenden wird umrissen, wie man mittels Python mit einem Server kommunizeren kann, # wie Daten übertragen werden, und wie ein Server prinzipiell gestartet werden kann. # Python selbst liefert die Bibliotheken [urllib](https://docs.python.org/2/library/urllib.html) ([Py3 urllib](https://docs.python.org/3/library/urllib.html)) # und [urllib2](https://docs.python.org/2/library/urllib2.html) aus. # Sie liefern eine rudimentäre Schnittstelle um mit der Außenwelt kommunizieren zu können. # # Besser ist eine Bibliothek wie [requests](http://docs.python-requests.org/en/latest/), # welche einfacher zu bedienen ist und auf diesen Bibliotheken aufbaut. # Wir importieren sie mit dem Namen `req`: # In[1]: import requests as req # ## WWW: HTTP GET requests # # Kommunikation im [WWW](http://info.cern.ch/hypertext/WWW/TheProject.html) läuft über das [HTTP Protokol](http://en.wikipedia.org/wiki/HTTP) ab. # Die Sprache besteht aus Verben und Objekten. # Das Verb "GET" teilt einem anderen Computer ("Server") mit, # dass der anfragende Computer ("Client") etwas haben möchte. # Die dieser Kommunikation [zugrunde liegenden Systeme](http://en.wikipedia.org/wiki/OSI_model) stellen sicher, # dass beide miteinander auch über große Distanzen sprechen können. # # Der Inhalt solch eines "Request"s kann entweder mit `.text` direkt ausgelesen werden, # oder z.B. mittels `.json()` in eine JSON Datenstruktur geparst werden. # Im folgenden Beispiel holen wir uns die Zellen des dieses hier vorliegenden Notebooks direkt vom # [Git Repository](https://github.com/haraldschilly/python-fuer-mathematiker/). # Das Dateiformat basiert auf [JSON](http://json.org) und es werden genau die hier sichtbaren Zellen geladen. # # Die `requests` Bibliothek verbindet sich dabei zu GitHub über das Internet, teilt dem Server mit, dass es genau diese Datei haben möchte, und dann verarbeitet es die Rohdaten zu einer JSON Datenstruktur mittels `.json()`. # Anschließend eine kurze Suche nach dem Inhalt "vorliegenden Notebook" um genau diese Zelle zu finden und auszugeben. # In[2]: import requests as req netzwerk = req.get("http://github.com/haraldschilly/python-fuer-mathematiker/raw/master/doc/4-6-netzwerk.ipynb") notebook = netzwerk.json() # In[3]: import json for cell in notebook["cells"]: if cell["cell_type"] == "markdown": lines = cell["source"] if any("vorliegenden Notebook" in line for line in lines): print("".join(lines)) break # Hier ein anderes Beispiel. # Wir lesen die [XML Daten aus dem Vorlesungsverzeichnis](http://online.univie.ac.at/vlvz?lvnr=250129&semester=S2015&format=xml) # ein und listen aller Termine der Lehrveranstaltung "Programmierpraktikum" auf: # In[4]: pp = req.get("http://online.univie.ac.at/vlvz?lvnr=250129&semester=S2015&format=xml").text print(pp[:500] + "...") # In[5]: import xml.etree.ElementTree as ET from dateutil.parser import parse as dateparser pp_xml = ET.fromstring(pp.encode("utf8")) for i, gruppe in enumerate(pp_xml.findall("vlvz/gruppen")): termine = set() for termin in gruppe.findall("von_bis"): termine.add(str(dateparser(termin.get("datum")))[:10]) print("Gruppe %d: %s" % (i, sorted(termine))) # ## HTML # # Webseiten sind in [HTML](http://en.wikipedia.org/wiki/HTML) formatiert. # Die Rohdaten sind ähnlich wie XML in Tags eingeschlossene Textbausteine. # Eine Bibliothek wie [Beautiful Soup](http://www.crummy.com/software/BeautifulSoup/) hilft, # diese Tags einzulesen und als Datenstruktur zu bearbeiten. # Holen wir zum Beispiel die aktuellen Nachrichten, extrahieren ausschließlich die Überschriften des Hauptbereichs, und modifizieren die Links so, dass sie auf die Originalseite verweisen und ein neues Tab öffnen: # In[6]: from bs4 import BeautifulSoup derstandard = BeautifulSoup(req.get("http://derstandard.at").text, "lxml") # In[7]: from IPython.display import HTML headlines = derstandard.select("div#documentCanvas h2 a") + derstandard.select("div#documentCanvas h3 a") hl_list = BeautifulSoup("