{"id":297,"date":"2018-04-17T20:37:51","date_gmt":"2018-04-17T18:37:51","guid":{"rendered":"http:\/\/benedict-witzenberger.de\/wordpress\/?p=297"},"modified":"2018-04-23T11:53:41","modified_gmt":"2018-04-23T09:53:41","slug":"webscraping-in-python-3-wie-ich-es-mache","status":"publish","type":"post","link":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/","title":{"rendered":"Webscraping in Python 3: Wie ich es mache"},"content":{"rendered":"<p>Eine alte Datenjournalistenregel besagt: Wenn Du es einem Praktikanten geben willst, schreib einen Scraper. Stimmt nicht immer, aber oft. Denn grunds\u00e4tzlich geht das sehr einfach. Ein Tutorial.<\/p>\n<p><!--more--><\/p>\n<p>Dieser Blogpost hat zwei Gr\u00fcnde: Zum einen ist es nat\u00fcrlich super, mal zu zeigen, wie Scraping mit Python funktioniert. Ich nutze das gerne, weil ich a) die Sprache super intuitiv und schnell finde und sie b) super simpel zu benutzen ist \u2013 auch von einem Webserver aus. Und zum Zweiten habe ich dann einen Anlaufpunkt, um nachzuschauen, wie ich das immer angehe. Wenn ich es doch mal wieder ein paar Wochen nicht gemacht habe und meine Skripte mal wieder suche.<\/p>\n<p>Ich werde in diesem Scraper keine echten Links angeben, nur eine Dummywebseite. Webscraping ist n\u00e4mlich so eine Sache. Rechtlich gesehen: Eine Webseite kann in ihren Nutzungsbedingungen Scraping verbieten. Nur: Wenn ich mich nicht anmelden muss, akzeptiere ich in der Regel diese Nutzungsbedingungen nicht. Weil ich dazu gar keine Chance habe.<\/p>\n<p>Dann sollte man trotzdem wissen was man tut. Und zwar aus Fairness: Im bl\u00f6desten Fall kann ich mit einem Scraper n\u00e4mlich einen Webserver in die Knie zwingen, \u00e4hnlich wie bei einer DOS-Attacke (Denial of Service). Indem ich einen Server n\u00e4mlich mit vielen Anfragen bombardiere. Umgehen kann ich das zum Beispiel dadurch, dass ich die Anfragen zeitlich dosiert rausschicke. Manche Seiten bauen auch explizit Ma\u00dfnahmen gegen Scraper ein (zum Beispiel Facebook). Auch dann sollte ich (oder gegebenenfalls ein Jurist) abw\u00e4gen, ob mein Scraping noch legal ist. Aus journalistischer Sicht kann da viel im Namen des Allgemeininteresses machbar sein.<\/p>\n<p>Die Daten, die ich bekomme, kann ich dann in jedem beliebigen Format speichern. Will ich sie hinterher auswerten, dann beispielsweise als CSV (also Semikolon- oder Komma-separiert) oder etwas fancier als JSON- oder XML-Dateien, die bei Enticklern beliebter sind, weil sie komplexere Unterteilungen zulassen, als so eine flache Exceltabelle (oder CSV).<\/p>\n<h2>Wie sieht der Scraper also nun aus?<\/h2>\n<p class=\"\">In Python nutze ich daf\u00fcr zwei Bibliotheken: <em>Requests<\/em>, um eine Anfrage an einen Server\/eine Webseite zu stellen. Und <a href=\"https:\/\/www.crummy.com\/software\/BeautifulSoup\/bs4\/doc\/\" target=\"_blank\" rel=\"noopener\"><em>Beautiful Soup<\/em><\/a>, um diese Webseite in ihre Einzelteile (bzw. HTML-Knoten) zu zerlegen und auszulesen. (Es g\u00e4be auch noch die Bibliothek Scrapy, die so \u00e4hnlich funktioniert. Und f\u00fcr ganz verr\u00fcckte Webseiten auch noch Geschichten wie Selenium, die einen ganzen Webbrowser (inklusive Nutzer) vort\u00e4uschen k\u00f6nnen.) Dieses Bibliotheken m\u00fcssen wir vorher installieren. Zum Beispiel mit <em>pip install<\/em>.<\/p>\n<p>Dann starten wir in Python, und schrieben unser Skript mit einem einfachen Verbindungsversuch.<\/p>\n<pre class=\"lang:python decode:true \" title=\"Einfache Request mit requests\">import requests # Bibliothek wird importiert...\r\n\r\nr = requests.get('http:\/\/www.benedict-witzenberger.de') # ... und k\u00fcmmert sich von selbst um die Verbidung, auch https geht.<\/pre>\n<p>Wir k\u00f6nnen dann das das Objekt r abfragen.<\/p>\n<pre class=\"lang:python mark:1,4 decode:true\" title=\"Ergebnisse Request\">print(r.status_code)\r\n#200 - l\u00e4uft also alles gut. es gibt eine positive Antwort.\r\n\r\nprint(r.text)\r\n# Zeigt mir die Antwort der Request an, in diesem Fall das HTML meines Blogs\r\n# &lt;!doctype html&gt;\r\n# &lt;!--[if lt IE 7 ]&gt; &lt;html class=\"no-js ie6\" lang=\"de-DE\" prefix=\"og: http:\/\/ogp.me\/ns#\"&gt; &lt;![endif]--&gt;\r\n# &lt;!--[if IE 7 ]&gt;    &lt;html class=\"no-js ie7\" lang=\"de-DE\" prefix=\"og: http:\/\/ogp.me\/ns#\"&gt; &lt;![endif]--&gt;\r\n# &lt;!--[if IE 8 ]&gt;    &lt;html class=\"no-js ie8\" lang=\"de-DE\" prefix=\"og: http:\/\/ogp.me\/ns#\"&gt; &lt;![endif]--&gt;\r\n# &lt;!--[if (gte IE 9)|!(IE)]&gt;&lt;!--&gt; &lt;html class=\"no-js\" lang=\"de-DE\" prefix=\"og: http:\/\/ogp.me\/ns#\"&gt; &lt;!--&lt;![endif]--&gt;\r\n# &lt;head&gt;\r\n# \r\n# &lt;meta charset=\"UTF-8\" \/&gt;\r\n# &lt;meta name=\"viewport\" content=\"width=device-width, user-scalable=no, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0\"&gt;\r\n# &lt;meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\" \/&gt;\r\n# usw....<\/pre>\n<p>Und genau an dieses HTML wollen wir ran. Je nachdem, welchen Teil der Webseite wir abgreifen wollen, m\u00fcssen wir einen Weg finden, diesen Teil zu identifizieren. Dass kann \u00fcber HTML-Tags passieren (alle Links zum Beispiel mit dem a-Tag), oder \u00fcber CSS-Selektoren (zum Beispiel den Autorennamen eines der letzten Posts \u00fcber diesen hier: <em>#post-231 &gt; div:nth-child(1) &gt; div:nth-child(1) &gt; div:nth-child(1) &gt; div:nth-child(1) &gt; section:nth-child(1) &gt; p:nth-child(1) &gt; ba:nth-child(2)<\/em>). Daf\u00fcr k\u00f6nnen wir die Entwicklertools unseres Browsers benutzen, und die entsprechende Stelle ausw\u00e4hlen \u2013 ich nutze aber auch ganz gerne das <a href=\"http:\/\/selectorgadget.com\/\" target=\"_blank\" rel=\"noopener\">Selector Gadget<\/a>. Ein kleines Addon. Das ist sehr benutzerfreundlich, finde ich. (Wirkt nicht so, wenn man die altbackene Webseite anschaut)<\/p>\n<h2>Inhalte auslesen mit Beautiful Soup<\/h2>\n<p>Mit der Bibliothek Beautiful Soup kann ich dann mein HTML in ein Soup-Objekt umwandeln. Damit kann ich dann auf die Inhalte meiner einzelnen HTML-Knoten zugreifen. Inhalte k\u00f6nnen Text sein, aber auch Attribute, wie Link-Ziele.<\/p>\n<pre class=\"lang:python decode:true \" title=\"Beautiful Soup Start\">from bs4 import BeautifulSoup # Die Bibliothek wird geladen, und zwar nur BeautifulSoup aus dem Paket bs4\r\nsoup = BeautifulSoup(r.text, 'html.parser') # aus meinem r.text wird ein navigierbares Objekt\r\n\r\nprint(soup.prettify()) # sch\u00f6nere Ausgabe des Soup-Objekts mit Einr\u00fcckungen, nicht n\u00f6tig, aber gut f\u00fcr den Test<\/pre>\n<p>Und dann gehts weiter. BeautifulSoup hat ein paar Funktionen, die mir wichtige Elemente sehr leicht ausgeben. Zum Beispiel:<\/p>\n<pre class=\"lang:python decode:true\" title=\"Beautiful Soup Einsteig\">soup.title # gibt mir das erste Objekt zur\u00fcck, das in Title-Tags steht. Gibt vermutlich nur eins auf der Seite\r\n\r\nsoup.title.name # gibt mir den Namen des tags zur\u00fcck. Der ist title. Danach haben wir ja gesucht.\r\n\r\nsoup.a # gibt mir den ersten Link komplett zur\u00fcck, also mit allem HTML drumherum. Ginge auch mit p oder b, etc.\r\n\r\nsoup.a.attrs['href'] # gibt mir nur das Link-Ziel zur\u00fcck. 'class' w\u00fcrde mir die Klassen zur\u00fcckgeben.\r\n\r\nsoup.a.text # gibt mir nur den Text zur\u00fcck, auf dem der Link liegt\r\n\r\nsoup.find_all('a') # findet alle Links und speichert sie als Liste. \u00dcber die kann ich dr\u00fcber iterieren.\r\n\r\nsoup.find_all(\"div\", class_=\"Klasse1 Klasse2gehtauch\") # Sucht DIVs mit den angegebenen Klassennamen<\/pre>\n<p>Zur Suche hat BeautifulSoup zwei Funktionen: find gibt das erste Ergebnis zur\u00fcck, find_all alle als Liste.<\/p>\n<h2>Ein Beispiel: Example.com<\/h2>\n<p>Ein netter Mensch hat die Seite <a href=\"http:\/\/www.example.com\/\" target=\"_blank\" rel=\"noopener\">Example.com<\/a> ins Internet gestellt. Die k\u00f6nnen wir zu Testzwecken scrapen. Ein Blick in die Entwicklertools zeigt: Die Seite hat eine h1-\u00dcberschrift, zwei p-Abs\u00e4tze, wobei der zweite einen Link enth\u00e4lt.<\/p>\n<p>Und genau das wollen wir alles haben. Wir rufen also die Seite auf, wandeln sie in ein BS4-Objekt um, und suchen dann nach h1, p, und dem Linkziel f\u00fcr a.<\/p>\n<pre class=\"lang:python decode:true\" title=\"Scraper example.com\">from bs4 import BeautifulSoup\r\nimport requests\r\n\r\nr = requests.get('http:\/\/www.example.com\/')\r\nsoup = BeautifulSoup(r.text, 'html.parser')\r\n\r\nprint(soup.h1.string) \r\n# Example Domain\r\n\r\nprint(soup.a['href']) \r\n# http:\/\/www.iana.org\/domains\/example\r\n\r\nabsaetze = soup.find_all('p') # Speichert alle Abs\u00e4tze als Liste\r\n\r\nfor absatz in absaetze: # Loopt \u00fcber die Liste\r\n    print(absatz.text) # Gibt jeden Absatz in der Konsole aus\r\n#     This domain is established to be used for illustrative examples in documents. You may use this\r\n#     domain in examples without prior coordination or asking for permission.\r\n#     More information...<\/pre>\n<p>Damit ich mich noch ein bisschen an Standards halte, f\u00fcge ich vor mein Skript noch zwei Zeilen ein. Die erste gibt an, wo mein Python3 gespeichert ist (ich k\u00f6nnte ja auch Python2 benutzen, dann w\u00fcrden Teile der Syntax nicht stimmen und ich bek\u00e4me einen Fehler). Die zweite Zeile gibt an, in welcher Kodierung ich arbeite. UTF-8 ist am einfachsten, bevor ich Probleme bekomme, wenn das Skript auf Windows- und Mac-Rechnern bearbeitet wurde.<\/p>\n<pre class=\"lang:python decode:true \" title=\"Encoding\">#!\/usr\/bin\/python3.6\r\n# -*- coding: utf-8 -*-<\/pre>\n<p>Zack, feddich. So geht ein einfacher Scraper.<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Eine alte Datenjournalistenregel besagt: Wenn Du es einem Praktikanten geben willst, schreib einen Scraper. Stimmt nicht immer, aber oft. Denn grunds\u00e4tzlich geht das sehr einfach. Ein Tutorial.<\/p>\n","protected":false},"author":1,"featured_media":306,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[7,8],"tags":[27,25,26],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Webscraping in Python 3: Wie ich es mache &bull; Benedict Witzenberger<\/title>\n<meta name=\"description\" content=\"Eine alte Datenjournalistenregel besagt: Wenn Du es einem Praktikanten geben willst, schreib einen Scraper. Stimmt nicht immer, aber oft. Denn grunds\u00e4tzlich geht das sehr einfach. Ein Tutorial.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Webscraping in Python 3: Wie ich es mache &bull; Benedict Witzenberger\" \/>\n<meta property=\"og:description\" content=\"Eine alte Datenjournalistenregel besagt: Wenn Du es einem Praktikanten geben willst, schreib einen Scraper. Stimmt nicht immer, aber oft. Denn grunds\u00e4tzlich geht das sehr einfach. Ein Tutorial.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/\" \/>\n<meta property=\"og:site_name\" content=\"Benedict Witzenberger\" \/>\n<meta property=\"article:published_time\" content=\"2018-04-17T18:37:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2018-04-23T09:53:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/benedict-witzenberger.de\/wordpress\/wp-content\/uploads\/2018\/04\/carbon1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1902\" \/>\n\t<meta property=\"og:image:height\" content=\"1276\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Benedict Witzenberger\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@munichrocker\" \/>\n<meta name=\"twitter:site\" content=\"@munichrocker\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Benedict Witzenberger\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"6\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebSite\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#website\",\"url\":\"https:\/\/benedict-witzenberger.de\/wordpress\/\",\"name\":\"Benedict Witzenberger\",\"description\":\"#ddj-Blog and personal portfolio page\",\"publisher\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/benedict-witzenberger.de\/wordpress\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/\",\"url\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/\",\"name\":\"Webscraping in Python 3: Wie ich es mache &bull; Benedict Witzenberger\",\"isPartOf\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#website\"},\"datePublished\":\"2018-04-17T18:37:51+00:00\",\"dateModified\":\"2018-04-23T09:53:41+00:00\",\"description\":\"Eine alte Datenjournalistenregel besagt: Wenn Du es einem Praktikanten geben willst, schreib einen Scraper. Stimmt nicht immer, aber oft. Denn grunds\u00e4tzlich geht das sehr einfach. Ein Tutorial.\",\"breadcrumb\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/benedict-witzenberger.de\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Webscraping in Python 3: Wie ich es mache\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/\"},\"author\":{\"name\":\"Benedict Witzenberger\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae\"},\"headline\":\"Webscraping in Python 3: Wie ich es mache\",\"datePublished\":\"2018-04-17T18:37:51+00:00\",\"dateModified\":\"2018-04-23T09:53:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/\"},\"wordCount\":784,\"publisher\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae\"},\"keywords\":[\"Python3\",\"Scraper\",\"Webscraping\"],\"articleSection\":[\"Tools\",\"Werkstatt\"],\"inLanguage\":\"de\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae\",\"name\":\"Benedict Witzenberger\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a0a634cefbade1a34310db77ccc3fe5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a0a634cefbade1a34310db77ccc3fe5d?s=96&d=mm&r=g\",\"caption\":\"Benedict Witzenberger\"},\"logo\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/image\/\"},\"url\":\"https:\/\/benedict-witzenberger.de\/wordpress\/author\/benedict\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Webscraping in Python 3: Wie ich es mache &bull; Benedict Witzenberger","description":"Eine alte Datenjournalistenregel besagt: Wenn Du es einem Praktikanten geben willst, schreib einen Scraper. Stimmt nicht immer, aber oft. Denn grunds\u00e4tzlich geht das sehr einfach. Ein Tutorial.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/","og_locale":"de_DE","og_type":"article","og_title":"Webscraping in Python 3: Wie ich es mache &bull; Benedict Witzenberger","og_description":"Eine alte Datenjournalistenregel besagt: Wenn Du es einem Praktikanten geben willst, schreib einen Scraper. Stimmt nicht immer, aber oft. Denn grunds\u00e4tzlich geht das sehr einfach. Ein Tutorial.","og_url":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/","og_site_name":"Benedict Witzenberger","article_published_time":"2018-04-17T18:37:51+00:00","article_modified_time":"2018-04-23T09:53:41+00:00","og_image":[{"width":1902,"height":1276,"url":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-content\/uploads\/2018\/04\/carbon1.png","type":"image\/png"}],"author":"Benedict Witzenberger","twitter_card":"summary","twitter_creator":"@munichrocker","twitter_site":"@munichrocker","twitter_misc":{"Verfasst von":"Benedict Witzenberger","Gesch\u00e4tzte Lesezeit":"6\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebSite","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#website","url":"https:\/\/benedict-witzenberger.de\/wordpress\/","name":"Benedict Witzenberger","description":"#ddj-Blog and personal portfolio page","publisher":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/benedict-witzenberger.de\/wordpress\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/","url":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/","name":"Webscraping in Python 3: Wie ich es mache &bull; Benedict Witzenberger","isPartOf":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#website"},"datePublished":"2018-04-17T18:37:51+00:00","dateModified":"2018-04-23T09:53:41+00:00","description":"Eine alte Datenjournalistenregel besagt: Wenn Du es einem Praktikanten geben willst, schreib einen Scraper. Stimmt nicht immer, aber oft. Denn grunds\u00e4tzlich geht das sehr einfach. Ein Tutorial.","breadcrumb":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/benedict-witzenberger.de\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Webscraping in Python 3: Wie ich es mache"}]},{"@type":"Article","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/#article","isPartOf":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/"},"author":{"name":"Benedict Witzenberger","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae"},"headline":"Webscraping in Python 3: Wie ich es mache","datePublished":"2018-04-17T18:37:51+00:00","dateModified":"2018-04-23T09:53:41+00:00","mainEntityOfPage":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/"},"wordCount":784,"publisher":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae"},"keywords":["Python3","Scraper","Webscraping"],"articleSection":["Tools","Werkstatt"],"inLanguage":"de"},{"@type":["Person","Organization"],"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae","name":"Benedict Witzenberger","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/a0a634cefbade1a34310db77ccc3fe5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a0a634cefbade1a34310db77ccc3fe5d?s=96&d=mm&r=g","caption":"Benedict Witzenberger"},"logo":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/image\/"},"url":"https:\/\/benedict-witzenberger.de\/wordpress\/author\/benedict\/"}]}},"_links":{"self":[{"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/posts\/297"}],"collection":[{"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/comments?post=297"}],"version-history":[{"count":10,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/posts\/297\/revisions"}],"predecessor-version":[{"id":311,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/posts\/297\/revisions\/311"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/media\/306"}],"wp:attachment":[{"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/media?parent=297"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/categories?post=297"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/tags?post=297"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}