{"id":403,"date":"2019-05-03T14:45:26","date_gmt":"2019-05-03T12:45:26","guid":{"rendered":"https:\/\/benedict-witzenberger.de\/wordpress\/?p=403"},"modified":"2019-05-03T14:45:28","modified_gmt":"2019-05-03T12:45:28","slug":"durchs-internet-surfen-mit-einem-skript-in-r","status":"publish","type":"post","link":"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/","title":{"rendered":"Durchs Internet surfen &#8211; mit einem Skript in R"},"content":{"rendered":"<p>Im Internet stehen so viele Informationen. Ein Paradies f\u00fcr Datenjournalisten, die gro\u00dfe Mengen an Informationen automatisiert abfragen wollen. Manchmal ist es einfach, an sie heranzukommen, manchmal etwas schwieriger. Denn manche Webseiten laden ihre Daten nicht in den Quellcode &#8211; dort, wo die einfachen L\u00f6sungen zum sogenannten Webscraping (\u00fcber <a href=\"https:\/\/benedict-witzenberger.de\/wordpress\/2018\/04\/17\/webscraping-in-python-3-wie-ich-es-mache\/\" target=\"_blank\" rel=\"noopener noreferrer\">Scraping mit Python habe ich schon mal gebloggt<\/a>) ansetzen. Doch mit ein bisschen Aufwand, k\u00f6nnen Datenjournalisten auch Seiten abfragen, die ihre Inhalte nachladen oder \u00fcber Skripte generieren. Der einfachste Anwendungsfall ist aber: Der Weiter-Button.<\/p>\n<p>Neulich hatte ich einen Fall, in dem ich knapp 1500 Daten von Abgeordneten abrufen wollte. Sie waren \u00fcber eine Suche zug\u00e4nglich, wurden allerdings nur in Hunderterschritten angezeigt. Ich habe ein Skript geschrieben, dass die Suche startet, jede Seite aufruft, die Informationen speichert und nach allen Abgeordneten auf einer Seite den Weiter-Button dr\u00fcckt. Sp\u00e4ter kann ich dann jede einzelne Abgeordnetenseite herunterladen.<\/p>\n<p>Zum Gl\u00fcck gibt es &#8222;Selenium&#8220;. Das ist ein Framework, das urspr\u00fcnglich daf\u00fcr entwickelte wurde, um Tests in Browsern zu automatisieren. Um also schnell testen zu k\u00f6nnen, ob Softwareupdates irgendein Problem f\u00fcr die Nutzer erzeugen. Selenium ahmt daf\u00fcr das Verhalten eines Nutzers im Webbrowser nach. Es kann Felder ausf\u00fcllen, Buttons anw\u00e4hlen oder einen Mausklick simulieren.<\/p>\n<p>Eigentlich basiert Selenium auf HTML und Javascript, f\u00fcr R gibt es aber (wie so oft, zum Gl\u00fcck) ein Package, das die Funktionen anbietet: <a href=\"https:\/\/github.com\/ropensci\/RSelenium\" target=\"_blank\" rel=\"noopener noreferrer\">RSelenium<\/a>. F\u00fcr die Extraktion der Informationen benutze ich <a href=\"https:\/\/github.com\/hadley\/rvest\" target=\"_blank\" rel=\"noopener noreferrer\">rvest<\/a>, eine weitere R-Bibliothek, die HTML-Code in R durchsuchbar macht.<\/p>\n<h2>RSelenium im Einsatz<\/h2>\n<p>RSelenium hat zwar <a href=\"http:\/\/ropensci.github.io\/RSelenium\/articles\/basics.html\" target=\"_blank\" rel=\"noopener noreferrer\">eine gute Dokumentation<\/a>, ich musste trotzdem viel rumprobieren, weswegen ich hier mal meine Vorgehensweise dokumentiere. Um rechtlich nicht angreifbar zu sein, habe ich den Namen der URL gel\u00f6scht.<\/p>\n<p>Zun\u00e4chst laden wir die beteiligten Bibliotheken. <em>rvest<\/em> und <em>RSelenium<\/em> erw\u00e4hnte ich bereits, <em>tidyverse<\/em> ist eine Sammlung von mehreren R-Packages, die f\u00fcr die Arbeit mit Dataframes (also einer Tabelle) in R benutzt werden.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:r decode:true\">library(rvest)\nlibrary(tidyverse)\nlibrary(RSelenium)\n<\/pre>\n<pre class=\"top-set:false bottom-set:false lang:r decode:true\"># Start RSelenium\nlink &lt;- \"\" # hier steht der Link, den ich gel\u00f6scht habe - dort startet RSelenium\nrD &lt;- rsDriver()\nremDr &lt;- rD[[\"client\"]]\n<\/pre>\n<p>RSelenium startet auf einem lokalen Server und l\u00e4dt dann ein neues Fenster in R. Darin wird ein Browser ge\u00f6ffnet, \u00fcber den ich nachvollziehen kann was meine Befehle in R bewirken. remDr ist quasi der Browser, den ich steuere. Zum Beispiel lasse ich ihn einen Link \u00f6ffnen &#8211; auf die erste Seite mit den Ergebnissen:<\/p>\n<pre class=\"top-set:false bottom-set:false lang:r decode:true\">remDr$navigate(link)\n<\/pre>\n<p>Insgesamt habe ich 14 Ergebnisseiten. Die habe ich h\u00e4ndisch abgez\u00e4hlt f\u00fcr den Loop. Alternativ h\u00e4tte ich auch eine Funktion schreiben k\u00f6nnen, die erkennt, wenn es keinen Weiter-Button mehr gibt.<\/p>\n<p>14 Mal wiederholt R also den folgenden Vorgang: Es ruft eine Ergebnisseite auf, speichert dann den Link zur Detailseite jedes Abgeordneten, und klickt am Ende der Seite auf den Weiter-Button, den ich hier \u00fcber seinen sogenannten X-Path finde. Daf\u00fcr suche ich das Element auf der Seite, das den Text &#8222;n\u00e4chste Treffer&#8220; enth\u00e4lt. Und das ist nur der Weiter-Button.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:r decode:true\">for (i in seq_along(1:14)) {\n  print(i)\n  try(next_button &lt;- remDr$findElement(using = 'xpath', \"\/\/*[contains(text(), 'n\u00e4chste Treffer')]\"))\n  try(next_button$clickElement())\n  Sys.sleep(5)\n  remDr$setImplicitWaitTimeout(5000)\n  html_current &lt;- read_html(remDr$getPageSource()[[1]])\n<\/pre>\n<p>Wir sind immer noch im Loop. Ich schreibe auf jeder Seite die Datenin Vektoren. Die Standardherangehensweise beim Webscraping ist allerdings: Detailseite \u00f6ffnen und dann downloaden. Die Details kann ich dann auf meinem lokalen Rechner extrahieren, ohne unn\u00f6tigen zus\u00e4tzlichen Webtraffic bei der Seite zu erzeugen. Das werde ich auch hier tun. Ich sammle ja gerade die Links zu jeder Detailseite. Allerdings auch Namen und eine Information zu den Legislaturperioden der einzelnen Abgeordneten.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:r decode:true\">  html_current %&gt;% \n    html_nodes(\".t_text:nth-child(1) a\") %&gt;% \n    html_attr(\"href\") -&gt; urls_current\n  urls &lt;- c(urls, urls_current)\n  \n  html_current %&gt;% \n    html_nodes(\".t_text:nth-child(1)\") %&gt;% \n    html_text() %&gt;% \n    trimws() -&gt; last_name_curr\n  last_name &lt;- c(last_name, last_name_curr)\n  \n  html_current %&gt;% \n    html_nodes(\".t_text:nth-child(2)\") %&gt;% \n    html_text() %&gt;% \n    trimws() -&gt; first_name_curr\n  first_name &lt;- c(first_name, first_name_curr)\n  \n  html_current %&gt;% \n    html_nodes(\".t_text:nth-child(4)\") %&gt;% \n    html_text() %&gt;% \n    trimws() -&gt; length_lt_curr\n  length_lt &lt;- c(length_lt, length_lt_curr)\n  \n  Sys.sleep(5)\n}\n<\/pre>\n<p>5 Sekunden lasse ich das Skript hier am Ende ruhen, damit ich nicht zu viel Last auf dem Server erzeuge. Das ist allerdings schon eine sehr lange Zeitspanne.<\/p>\n<p>W\u00e4hrend das Skript l\u00e4uft, kann ich weiterarbeiten. Die R-Bibliothek <a href=\"https:\/\/www.r-project.org\/nosvn\/pandoc\/beepr.html\" target=\"_blank\" rel=\"noopener noreferrer\">BeepR<\/a> spielt einen Sound ab, wenn alle Dateien heruntergeladen wurden. Dann verbinde ich die einzelnen Vektoren zu einem Dataframe in R, mit dem ich dann fortfahren kann. In meinem Fall loope ich jetzt \u00fcber die einzelnen Links und lade die Dateien herunter. Das h\u00e4tte ich aber nat\u00fcrlich auch schon im Schritt oben machen k\u00f6nnen. Ich habe mich aber dagegen entschieden, weil ich erstmal alle Links bekommen wollte, und mit denen dann weiterarbeiten kann.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:r decode:true\">beepr::beep()\n\ndf_abgeordnete &lt;- cbind(first_name,last_name,urls,length_lt)\n<\/pre>\n<p>Am Ende stoppe ich den Seleniumbrowser, der lokal auf meinem Rechner lief.<\/p>\n<pre class=\"top-set:false bottom-set:false lang:r decode:true\">remDr$close()\n# stop the selenium server\nrD[[\"server\"]]$stop() \n<\/pre>\n<p>Fertig.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im Internet stehen so viele Informationen. Ein Paradies f\u00fcr Datenjournalisten, die gro\u00dfe Mengen an Informationen automatisiert abfragen wollen. Manchmal ist es einfach, an sie heranzukommen, manchmal etwas schwieriger. Denn manche Webseiten laden ihre Daten nicht in den Quellcode &#8211; dort, <a href=\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/\"><\/p>\n<div class=\"read-more\">\n<p>Read more &#8250;<\/p>\n<\/div>\n<p><!-- end of .read-more --><\/a><\/p>\n","protected":false},"author":1,"featured_media":437,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[8],"tags":[15,38,26],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Durchs Internet surfen - mit einem Skript in R &bull; Benedict Witzenberger<\/title>\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\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Durchs Internet surfen - mit einem Skript in R &bull; Benedict Witzenberger\" \/>\n<meta property=\"og:description\" content=\"Im Internet stehen so viele Informationen. Ein Paradies f\u00fcr Datenjournalisten, die gro\u00dfe Mengen an Informationen automatisiert abfragen wollen. Manchmal ist es einfach, an sie heranzukommen, manchmal etwas schwieriger. Denn manche Webseiten laden ihre Daten nicht in den Quellcode &#8211; dort, Read more &#8250;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/\" \/>\n<meta property=\"og:site_name\" content=\"Benedict Witzenberger\" \/>\n<meta property=\"article:published_time\" content=\"2019-05-03T12:45:26+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-05-03T12:45:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/benedict-witzenberger.de\/wordpress\/wp-content\/uploads\/2018\/10\/rselenium-screenshot.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1424\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\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=\"4\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\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/\",\"url\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/\",\"name\":\"Durchs Internet surfen - mit einem Skript in R &bull; Benedict Witzenberger\",\"isPartOf\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#website\"},\"datePublished\":\"2019-05-03T12:45:26+00:00\",\"dateModified\":\"2019-05-03T12:45:28+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\/\/benedict-witzenberger.de\/wordpress\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Durchs Internet surfen &#8211; mit einem Skript in R\"}]},{\"@type\":\"Article\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/\"},\"author\":{\"name\":\"Benedict Witzenberger\",\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae\"},\"headline\":\"Durchs Internet surfen &#8211; mit einem Skript in R\",\"datePublished\":\"2019-05-03T12:45:26+00:00\",\"dateModified\":\"2019-05-03T12:45:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/\"},\"wordCount\":682,\"publisher\":{\"@id\":\"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae\"},\"keywords\":[\"R\",\"Selenium\",\"Webscraping\"],\"articleSection\":[\"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":"Durchs Internet surfen - mit einem Skript in R &bull; Benedict Witzenberger","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\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/","og_locale":"de_DE","og_type":"article","og_title":"Durchs Internet surfen - mit einem Skript in R &bull; Benedict Witzenberger","og_description":"Im Internet stehen so viele Informationen. Ein Paradies f\u00fcr Datenjournalisten, die gro\u00dfe Mengen an Informationen automatisiert abfragen wollen. Manchmal ist es einfach, an sie heranzukommen, manchmal etwas schwieriger. Denn manche Webseiten laden ihre Daten nicht in den Quellcode &#8211; dort, Read more &#8250;","og_url":"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/","og_site_name":"Benedict Witzenberger","article_published_time":"2019-05-03T12:45:26+00:00","article_modified_time":"2019-05-03T12:45:28+00:00","og_image":[{"width":1424,"height":630,"url":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-content\/uploads\/2018\/10\/rselenium-screenshot.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":"4\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\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/","url":"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/","name":"Durchs Internet surfen - mit einem Skript in R &bull; Benedict Witzenberger","isPartOf":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#website"},"datePublished":"2019-05-03T12:45:26+00:00","dateModified":"2019-05-03T12:45:28+00:00","breadcrumb":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/benedict-witzenberger.de\/wordpress\/"},{"@type":"ListItem","position":2,"name":"Durchs Internet surfen &#8211; mit einem Skript in R"}]},{"@type":"Article","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/#article","isPartOf":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/"},"author":{"name":"Benedict Witzenberger","@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae"},"headline":"Durchs Internet surfen &#8211; mit einem Skript in R","datePublished":"2019-05-03T12:45:26+00:00","dateModified":"2019-05-03T12:45:28+00:00","mainEntityOfPage":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/2019\/05\/03\/durchs-internet-surfen-mit-einem-skript-in-r\/"},"wordCount":682,"publisher":{"@id":"https:\/\/benedict-witzenberger.de\/wordpress\/#\/schema\/person\/ec6b0c6e16ce10af4a73b4dafefeceae"},"keywords":["R","Selenium","Webscraping"],"articleSection":["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\/403"}],"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=403"}],"version-history":[{"count":10,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/posts\/403\/revisions"}],"predecessor-version":[{"id":441,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/posts\/403\/revisions\/441"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/media\/437"}],"wp:attachment":[{"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/media?parent=403"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/categories?post=403"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/benedict-witzenberger.de\/wordpress\/wp-json\/wp\/v2\/tags?post=403"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}