{"id":3656095,"date":"2023-07-21T08:00:25","date_gmt":"2023-07-21T12:00:25","guid":{"rendered":"https:\/\/spin.atomicobject.com\/?p=3656095"},"modified":"2023-07-20T13:56:42","modified_gmt":"2023-07-20T17:56:42","slug":"selenium-python-chrome-headless","status":"publish","type":"post","link":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/","title":{"rendered":"Use Selenium and Python with the New Chrome Headless Mode"},"content":{"rendered":"<p>Selenium and Python are great for automated testing or web scraping.<\/p>\n<p>The tutorial below shows how to:<\/p>\n<ul>\n<li>Install and use Selenium and Python<\/li>\n<li>Use the new version of headless Chrome<\/li>\n<li>Find elements on a webpage that appear after invoking JavaScript by clicking on an element<\/li>\n<\/ul>\n<p>I gathered all of this info while setting up a new project after not using Selenium in years. I hope it helps you get started.<\/p>\n<p>I\u2019m using Python 3.11.4 on macOS for this examples.<\/p>\n<h2>Installing Python, Selenium, and Chrome Dependencies<\/h2>\n<p>First, install Python using <a href=\"https:\/\/docs.brew.sh\/Installation\">Homebrew<\/a>. You\u2019ll have to install Homebrew and then use Homebrew to install Python.<\/p>\n<p>Use the command line to install Python after you have installed Homebrew.<\/p>\n<p>Run <code>brew install python<\/code><\/p>\n<p>This should install Python and Python\u2019s package manager pip. Homebrew will create symlinks for <code>python3<\/code> and <code>pip3<\/code> in <code>\/user\/local\/bin<\/code> that point to the Python 3.11.4 Homebrew Cellar.<\/p>\n<p>Second, we need to install the following dependencies:<\/p>\n<ul>\n<li>Chrome &#8211; The browser<\/li>\n<li>Selenium WebDriver &#8211; Language specific binding to control the browser<\/li>\n<li>ChromeDriver &#8211; The Chrome specific driver to be used by Selenium WebDriver<\/li>\n<\/ul>\n<p>Download and install the <a href=\"https:\/\/www.google.com\/chrome\/dr\/download\/\">Chrome browser<\/a> or check the version of your installed browser by launching Chrome, clicking \u201cChrome\u201d in the menu bar and then clicking \u201cAbout Google Chrome.\u201d<\/p>\n<p>Update your Chrome browser if it\u2019s already installed.<\/p>\n<p>I\u2019m using Chrome Version: 114.0.5735.198 (Official Build) (x86_64).<\/p>\n<p>Next, install <a href=\"https:\/\/www.selenium.dev\/documentation\/webdriver\/\">Selenium WebDriver<\/a> using the command line.<\/p>\n<p>Run <code>pip3 install -U selenium<\/code><\/p>\n<p>This should install Selenium WebDriver and related dependencies.<\/p>\n<p>Finally, install the ChromeDriver executable by downloading it from <a href=\"https:\/\/chromedriver.chromium.org\/downloads\">here<\/a>. I downloaded version <a href=\"https:\/\/chromedriver.storage.googleapis.com\/index.html?path=114.0.5735.90\/\">114.0.5735.90<\/a> as that version most closely matched my browser version. And, because I\u2019m still using an older Intel-based Mac, I downloaded the mac64 version. Be sure to download the version of ChromeDriver that best matches your browser and is for your operating system and architecture.<\/p>\n<p>After you download the ChromeDriver executable, you need to move the executable file to a place in your <code>PATH<\/code> so it can be found when using the WebDriver in your Python script.<\/p>\n<p>Using the command line, you can check your <code>PATH<\/code>.<\/p>\n<p>Run <code>echo $PATH<\/code><\/p>\n<p>I moved the chromedriver executable to <code>\/usr\/local\/bin\/<\/code><\/p>\n<h2>Using WebDriver with Python in Headless Mode<\/h2>\n<p>Now let\u2019s use Selenium and Python in a sample script that uses headless mode and JavaScript to list film titles at <a href=\"https:\/\/www.scrapethissite.com\/pages\/ajax-javascript\/\">https:\/\/www.scrapethissite.com\/pages\/ajax-javascript\/<\/a>.<\/p>\n<p>To understand what the script below is doing, you can manually browse to the link above, click on the year 2015, and see a list of films appear.<\/p>\n<p>To script this in Python, open an editor and paste in the following code:<\/p>\n<pre><code class=\"language-[python]\">\nfrom selenium import webdriver\nfrom selenium.webdriver.chrome.options import Options\nfrom selenium.webdriver.common.by import By\nfrom selenium.webdriver.support.wait import WebDriverWait\nfrom selenium.webdriver.support import expected_conditions as EC\n\n# instance of Options class allows\n# us to configure Headless Chrome\noptions = Options()\n\n# this parameter tells Chrome that\n# it should be run without UI (Headless)\noptions.add_argument('--headless=new')\n\n# initializing webdriver for Chrome with our options\ndriver = webdriver.Chrome(options=options)\n\n\ntry:\n    driver.get('https:\/\/www.scrapethissite.com\/pages\/ajax-javascript\/')\n\n    print(\"Page URL:\", driver.current_url)\n    print(\"Page Title:\", driver.title)\n\n    # click on 2015 for movie list of films\n    driver.find_element(By.ID, '2015').click()\n    film_titles = WebDriverWait(driver, 5).until(\n        EC.presence_of_all_elements_located((By.CLASS_NAME, 'film-title')))\n   \n    for film_title in film_titles:\n        print(film_title.text)\n\nexcept Exception as e:\n    print(\"Exception occurred \" + repr(e))\n\nfinally:\n    driver.close()\n<\/code><\/pre>\n<p>Running this Python script from the command line should print the page URL, page title, and the list of films that you saw when manually browsing the site.<\/p>\n<p>The script uses the Selenium <code>WebDriverWait<\/code> method to poll for the existence of the film list with a five-second maximum timeout. This is more efficient than hardcoded sleep calls that take the full amount of sleep time.<\/p>\n<p>In the code above, you\u2019ll notice the headless argument given to the ChomeOptions is <code>'--headless=new\u2019<\/code>.<\/p>\n<h2>Headless and Headful Codebases Unified<\/h2>\n<p>This invokes the <a href=\"https:\/\/developer.chrome.com\/articles\/new-headless\/\">new version of headless Chrome<\/a> that was announced earlier this year. Headless Chrome used to be a separate implementation from the headful implementation. This sometimes led to inconsistencies in test results when using Selenium for application testing. Now the headless and headful codebases are unified. Currently, if you only use the <code>'--headless'<\/code> argument, you\u2019ll be using the old headless implementation.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Selenium and Python are great for automated testing or web scraping. The tutorial below shows how to: Install and use Selenium and Python Use the new version of headless Chrome Find elements on a webpage that appear after invoking JavaScript by clicking on an element I gathered all of this info while setting up a [&hellip;]<\/p>\n","protected":false},"author":412,"featured_media":3656205,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1858],"tags":[590,827,1332],"series":[],"class_list":["post-3656095","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-python-platforms-languages","tag-selenium","tag-testing-2","tag-python"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Selenium and Python Testing with the New Headless Chrome<\/title>\n<meta name=\"description\" content=\"This tutorial shows how use the new headless version of Chrome with Selenium and Python. A simple Python script is included.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Selenium and Python Testing with the New Headless Chrome\" \/>\n<meta property=\"og:description\" content=\"This tutorial shows how use the new headless version of Chrome with Selenium and Python. A simple Python script is included.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/\" \/>\n<meta property=\"og:site_name\" content=\"Atomic Spin\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/atomicobject\" \/>\n<meta property=\"article:published_time\" content=\"2023-07-21T12:00:25+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/spin.atomicobject.com\/wp-content\/uploads\/headless-chrome.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"627\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Shawn Crowley\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@atomicobject\" \/>\n<meta name=\"twitter:site\" content=\"@atomicobject\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Shawn Crowley\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/\"},\"author\":{\"name\":\"Shawn Crowley\",\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/#\\\/schema\\\/person\\\/46d547db22b66aec8e8b9f52c9deab3a\"},\"headline\":\"Use Selenium and Python with the New Chrome Headless Mode\",\"datePublished\":\"2023-07-21T12:00:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/\"},\"wordCount\":574,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/atomicobject.com\\\/\"},\"image\":{\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/spin.atomicobject.com\\\/wp-content\\\/uploads\\\/headless-chrome.jpg\",\"keywords\":[\"selenium\",\"testing\",\"python\"],\"articleSection\":[\"Python\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/\",\"url\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/\",\"name\":\"Selenium and Python Testing with the New Headless Chrome\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/spin.atomicobject.com\\\/wp-content\\\/uploads\\\/headless-chrome.jpg\",\"datePublished\":\"2023-07-21T12:00:25+00:00\",\"description\":\"This tutorial shows how use the new headless version of Chrome with Selenium and Python. A simple Python script is included.\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/selenium-python-chrome-headless\\\/#primaryimage\",\"url\":\"https:\\\/\\\/spin.atomicobject.com\\\/wp-content\\\/uploads\\\/headless-chrome.jpg\",\"contentUrl\":\"https:\\\/\\\/spin.atomicobject.com\\\/wp-content\\\/uploads\\\/headless-chrome.jpg\",\"width\":1200,\"height\":627,\"caption\":\"Using Python and Selenium in the new headless Chrome\"},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/#website\",\"url\":\"https:\\\/\\\/spin.atomicobject.com\\\/\",\"name\":\"Atomic Spin\",\"description\":\"Atomic Object\u2019s blog on everything we find fascinating.\",\"publisher\":{\"@id\":\"https:\\\/\\\/atomicobject.com\\\/\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/spin.atomicobject.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/#organization\",\"name\":\"Atomic Object\",\"url\":\"https:\\\/\\\/spin.atomicobject.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/spin.atomicobject.com\\\/wp-content\\\/uploads\\\/AO-Logo-Emblem-Color.png\",\"contentUrl\":\"https:\\\/\\\/spin.atomicobject.com\\\/wp-content\\\/uploads\\\/AO-Logo-Emblem-Color.png\",\"width\":258,\"height\":244,\"caption\":\"Atomic Object\"},\"image\":{\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/atomicobject\",\"https:\\\/\\\/x.com\\\/atomicobject\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/spin.atomicobject.com\\\/#\\\/schema\\\/person\\\/46d547db22b66aec8e8b9f52c9deab3a\",\"name\":\"Shawn Crowley\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/54f76d9b0eeef79fcf99d6dd479e22efc0ffa979cbc946969945e0ac59d869e5?s=96&d=blank&r=pg\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/54f76d9b0eeef79fcf99d6dd479e22efc0ffa979cbc946969945e0ac59d869e5?s=96&d=blank&r=pg\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/54f76d9b0eeef79fcf99d6dd479e22efc0ffa979cbc946969945e0ac59d869e5?s=96&d=blank&r=pg\",\"caption\":\"Shawn Crowley\"},\"description\":\"Atomic Object Co-CEO. Focused on Atomic\u2019s continuous learning and growth. Connects clients with Atomic\u2019s teams to create delightful and valuable products.\",\"sameAs\":[\"http:\\\/\\\/www.linkedin.com\\\/pub\\\/shawn-crowley\\\/b\\\/53\\\/150\\\/en\"],\"url\":\"https:\\\/\\\/spin.atomicobject.com\\\/author\\\/crowley\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Selenium and Python Testing with the New Headless Chrome","description":"This tutorial shows how use the new headless version of Chrome with Selenium and Python. A simple Python script is included.","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:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/","og_locale":"en_US","og_type":"article","og_title":"Selenium and Python Testing with the New Headless Chrome","og_description":"This tutorial shows how use the new headless version of Chrome with Selenium and Python. A simple Python script is included.","og_url":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/","og_site_name":"Atomic Spin","article_publisher":"https:\/\/www.facebook.com\/atomicobject","article_published_time":"2023-07-21T12:00:25+00:00","og_image":[{"width":1200,"height":627,"url":"https:\/\/spin.atomicobject.com\/wp-content\/uploads\/headless-chrome.jpg","type":"image\/jpeg"}],"author":"Shawn Crowley","twitter_card":"summary_large_image","twitter_creator":"@atomicobject","twitter_site":"@atomicobject","twitter_misc":{"Written by":"Shawn Crowley","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/#article","isPartOf":{"@id":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/"},"author":{"name":"Shawn Crowley","@id":"https:\/\/spin.atomicobject.com\/#\/schema\/person\/46d547db22b66aec8e8b9f52c9deab3a"},"headline":"Use Selenium and Python with the New Chrome Headless Mode","datePublished":"2023-07-21T12:00:25+00:00","mainEntityOfPage":{"@id":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/"},"wordCount":574,"commentCount":0,"publisher":{"@id":"https:\/\/atomicobject.com\/"},"image":{"@id":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/#primaryimage"},"thumbnailUrl":"https:\/\/spin.atomicobject.com\/wp-content\/uploads\/headless-chrome.jpg","keywords":["selenium","testing","python"],"articleSection":["Python"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/","url":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/","name":"Selenium and Python Testing with the New Headless Chrome","isPartOf":{"@id":"https:\/\/spin.atomicobject.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/#primaryimage"},"image":{"@id":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/#primaryimage"},"thumbnailUrl":"https:\/\/spin.atomicobject.com\/wp-content\/uploads\/headless-chrome.jpg","datePublished":"2023-07-21T12:00:25+00:00","description":"This tutorial shows how use the new headless version of Chrome with Selenium and Python. A simple Python script is included.","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/spin.atomicobject.com\/selenium-python-chrome-headless\/#primaryimage","url":"https:\/\/spin.atomicobject.com\/wp-content\/uploads\/headless-chrome.jpg","contentUrl":"https:\/\/spin.atomicobject.com\/wp-content\/uploads\/headless-chrome.jpg","width":1200,"height":627,"caption":"Using Python and Selenium in the new headless Chrome"},{"@type":"WebSite","@id":"https:\/\/spin.atomicobject.com\/#website","url":"https:\/\/spin.atomicobject.com\/","name":"Atomic Spin","description":"Atomic Object\u2019s blog on everything we find fascinating.","publisher":{"@id":"https:\/\/atomicobject.com\/"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/spin.atomicobject.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/spin.atomicobject.com\/#organization","name":"Atomic Object","url":"https:\/\/spin.atomicobject.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/spin.atomicobject.com\/#\/schema\/logo\/image\/","url":"https:\/\/spin.atomicobject.com\/wp-content\/uploads\/AO-Logo-Emblem-Color.png","contentUrl":"https:\/\/spin.atomicobject.com\/wp-content\/uploads\/AO-Logo-Emblem-Color.png","width":258,"height":244,"caption":"Atomic Object"},"image":{"@id":"https:\/\/spin.atomicobject.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/atomicobject","https:\/\/x.com\/atomicobject"]},{"@type":"Person","@id":"https:\/\/spin.atomicobject.com\/#\/schema\/person\/46d547db22b66aec8e8b9f52c9deab3a","name":"Shawn Crowley","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/54f76d9b0eeef79fcf99d6dd479e22efc0ffa979cbc946969945e0ac59d869e5?s=96&d=blank&r=pg","url":"https:\/\/secure.gravatar.com\/avatar\/54f76d9b0eeef79fcf99d6dd479e22efc0ffa979cbc946969945e0ac59d869e5?s=96&d=blank&r=pg","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/54f76d9b0eeef79fcf99d6dd479e22efc0ffa979cbc946969945e0ac59d869e5?s=96&d=blank&r=pg","caption":"Shawn Crowley"},"description":"Atomic Object Co-CEO. Focused on Atomic\u2019s continuous learning and growth. Connects clients with Atomic\u2019s teams to create delightful and valuable products.","sameAs":["http:\/\/www.linkedin.com\/pub\/shawn-crowley\/b\/53\/150\/en"],"url":"https:\/\/spin.atomicobject.com\/author\/crowley\/"}]}},"_links":{"self":[{"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/posts\/3656095","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/users\/412"}],"replies":[{"embeddable":true,"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/comments?post=3656095"}],"version-history":[{"count":0,"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/posts\/3656095\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/media\/3656205"}],"wp:attachment":[{"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/media?parent=3656095"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/categories?post=3656095"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/tags?post=3656095"},{"taxonomy":"series","embeddable":true,"href":"https:\/\/spin.atomicobject.com\/wp-json\/wp\/v2\/series?post=3656095"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}