{"id":979,"date":"2010-11-24T15:59:04","date_gmt":"2010-11-24T10:14:04","guid":{"rendered":"https:\/\/www.sparksupport.com\/blog\/?p=979"},"modified":"2024-06-25T06:40:15","modified_gmt":"2024-06-25T06:40:15","slug":"dynamic-web-scraping-using-selenium","status":"publish","type":"post","link":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/","title":{"rendered":"Dynamic Web Scraping Using Selenium"},"content":{"rendered":"<p><!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } A:link { so-language: zxx } -->This article is a part of the on-going Web Scraping Series. If you are not familiar with Web Scraping please check with the <a title=\"first part\" href=\"https:\/\/www.sparksupport.com\/blog\/tag\/tor\">first article <\/a>. This session mainly deals with Dynamic Content Scraping. Nowadays most of the web portals are dynamic by making Ajax calls instead of old static web pages. Scraping on dynamic environment is both interesting and challenging one.<\/p>\n<p>The first part of the discussion concentrated mainly on static page scraping with Perl mechanize module. Even though mechanize provides extension for dynamic scraping, it is not very good.<\/p>\n<p>So this session deals with making use of\u00a0selenium testing tool for Web Scraping.<\/p>\n<p><span style=\"text-decoration: underline;\"><span style=\"color: #003366;\"><strong>Prerequsites<\/strong><\/span><\/span><\/p>\n<p>Selenium IDE is a Firefox add-on that records clicks, typing, and other actions to make a test, which you can play back in the browser.<\/p>\n<ul>\n<li><span style=\"color: #808080;\"><a href=\"http:\/\/seleniumhq.org\/download\"><span style=\"text-decoration: underline;\">Download Selenium IDE<\/span><\/a><\/span><\/li>\n<\/ul>\n<p>Selenium Remote Control (RC)\u00a0 is a Java based Command line server for handling request from client.<\/p>\n<ul>\n<li><span style=\"text-decoration: underline;\"><a title=\"Download Selenium Remote Control\" href=\"https:\/\/www.selenium.dev\/documentation\/legacy\/selenium_1\/\">Download Selenium Remote Control (RC)<br \/>\n<\/a><\/span><\/li>\n<\/ul>\n<p><span style=\"color: #003366;\"><span style=\"text-decoration: underline;\"><strong>Pros and Cons<\/strong><\/span><\/span><\/p>\n<p>It supports all Dynamic Content like Ajax, JavaScript, is easy to implement and it is possible to write selenium clients in any language we prefer, for example, here I have used Perl. You can also use Python, Java, etc.<\/p>\n<p>Selenium based Web Scraping on small throughout is easy task.<\/p>\n<p>It consumes lots of memory resource, for each request it will launch a new browser instance.<\/p>\n<p><span style=\"color: #003366;\"><strong><span style=\"text-decoration: underline;\">Working of selenium<\/span><\/strong><\/span><\/p>\n<p><strong>Selenium Remote Control<\/strong> (RC) is a test tool that allows you to write automated web application UI tests in any programming language against any HTTP website using any mainstream JavaScript-enabled browser.<\/p>\n<p><span style=\"color: #003366;\"><em>Selenium RC comes in two parts.<\/em><\/span><\/p>\n<ol>\n<li>A server which automatically launches and kills browsers, and acts as a HTTP proxy for web requests from them.<\/li>\n<li>Client libraries for your favourite computer language.<\/li>\n<\/ol>\n<p>The RC server also bundles <a href=\"http:\/\/seleniumhq.org\/projects\/core\/\"><span style=\"color: #0057ae;\"><span style=\"text-decoration: underline;\">Selenium Core<\/span><\/span><\/a>, and automatically loads it into the browser.<\/p>\n<p>Here is a simplified architectural representation:<\/p>\n<p><a href=\"https:\/\/www.sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/selenium-rc.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-981 size-medium\" src=\"https:\/\/www.sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/selenium-rc-300x292.png\" alt=\"Web Scraping Using Selenium fig 1\" width=\"300\" height=\"292\" \/><\/a><\/p>\n<p>For Detailed diagram <a title=\"http:\/\/seleniumhq.org\/about\/how.html\" href=\"http:\/\/seleniumhq.org\/about\/how.html\">http:\/\/seleniumhq.org\/about\/how.html<\/a><\/p>\n<p><span style=\"color: #003366;\"><em>How to Setup a Selenium Server<\/em><\/span><\/p>\n<blockquote><p>Download Selenium RC server to directory to \/usr\/local\/selenium<\/p>\n<p>#cd \/usr\/local\/selenium<\/p>\n<p>#unzip selenium-remote-control-1.0-beta-2-dist.zip<\/p>\n<p>#cd selenium-remote-control-1.0-beta-2<\/p>\n<p>#cd selenium-server-1.0-beta-2<\/p>\n<p>#java -jar selenium-server.jar #starting selenium server .By default it is listen to 4444<\/p><\/blockquote>\n<p><span style=\"color: #003366;\"><em>An example Client Program<\/em><\/span><\/p>\n<p>As said in the above section, it is possible to create selenium client by recording user activities or else the programmers can create it using their own language. Python, Perl and Ruby, Java has supporting modules for it.<\/p>\n<p>[code]<br \/>\n#Sample Perl Code<br \/>\n#!\/usr\/bin\/perl<br \/>\nuse strict;<br \/>\nuse warnings;<br \/>\nuse Time::HiRes qw(sleep);<br \/>\nuse Test::WWW::Selenium;<br \/>\nuse Test::More &#8220;no_plan&#8221;;<br \/>\nuse Test::Exception;<\/p>\n<p>my $sel = Test::WWW::Selenium-&gt;new( host =&gt; &#8220;192.168.1.20&#8221;,<br \/>\nport =&gt; 4444,<br \/>\nbrowser =&gt; &#8220;*firefox&#8221;,<br \/>\nbrowser_url =&gt; &#8220;http:\/\/www.godaddy.com\/&#8221; );<br \/>\n$sel-&gt;open_ok(&#8220;\/domains\/search.aspx?ci=8969&#8221;);<br \/>\n$sel-&gt;click_ok(&#8220;domain_search_button&#8221;);<br \/>\n$sel-&gt;wait_for_page_to_load_ok(&#8220;30000&#8221;);<br \/>\nmy $data=$sel-&gt;get_html_source(); # here you get source of the current page<br \/>\n[\/code]<\/p>\n<p>For more info please have a look at cpan <a title=\"http:\/\/search.cpan.org\/search?query=selenium&amp;mode=all\" href=\"http:\/\/search.cpan.org\/search?query=selenium&amp;mode=all\">http:\/\/search.cpan.org\/search?query=selenium&amp;mode=all<\/a><\/p>\n<p>As scraper you can extract required data from this source:<\/p>\n<p><!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } --><span style=\"color: #003366;\"><strong>For scraping data from multiple pages<\/strong><\/span><\/p>\n<p>Open selenium IDE and record the events that you are interested and analyse the code generated and try to implement your own way,<\/p>\n<p>As a last word, let me add that selenium is not\u00a0completely a scraping tool, it is instead, a testing tool.<\/p>\n<p>For more about selenium have look at <a title=\"http:\/\/seleniumhq.org\/\" href=\"http:\/\/seleniumhq.org\/\">http:\/\/seleniumhq.org\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This article is a part of the on-going Web Scraping Series. If you are not familiar with Web Scraping please check with the first article<\/p>\n","protected":false},"author":9,"featured_media":5082,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[6,87],"tags":[165,166,144,167,146],"class_list":["post-979","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-linux","category-perl","tag-ajax-scraping-using-selenium","tag-crawling-ajax","tag-scraping","tag-scraping-selenium","tag-web-crawling"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Dynamic Web Scraping Using Selenium - Complete Guide<\/title>\n<meta name=\"description\" content=\"Introduction to Web Scraping for Selenium. This guide gives you the opportunity to learn full details on the various topics related to it.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Dynamic Web Scraping Using Selenium - Complete Guide\" \/>\n<meta property=\"og:description\" content=\"Introduction to Web Scraping for Selenium. This guide gives you the opportunity to learn full details on the various topics related to it.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/\" \/>\n<meta property=\"article:published_time\" content=\"2010-11-24T10:14:04+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-06-25T06:40:15+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"686\" \/>\n\t<meta property=\"og:image:height\" content=\"386\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Shameem Khalid\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Shameem Khalid\" \/>\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:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/\"},\"author\":{\"name\":\"Shameem Khalid\",\"@id\":\"https:\/\/sparksupport.com\/blog\/#\/schema\/person\/7e7199cb9f41aaf67868b7d4d4a4cf39\"},\"headline\":\"Dynamic Web Scraping Using Selenium\",\"datePublished\":\"2010-11-24T10:14:04+00:00\",\"dateModified\":\"2024-06-25T06:40:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/\"},\"wordCount\":585,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg\",\"keywords\":[\"Ajax Scraping using selenium\",\"Crawling Ajax\",\"scraping\",\"scraping + selenium\",\"web crawling\"],\"articleSection\":[\"linux\",\"perl\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/\",\"url\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/\",\"name\":\"Dynamic Web Scraping Using Selenium - Complete Guide\",\"isPartOf\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg\",\"datePublished\":\"2010-11-24T10:14:04+00:00\",\"dateModified\":\"2024-06-25T06:40:15+00:00\",\"description\":\"Introduction to Web Scraping for Selenium. This guide gives you the opportunity to learn full details on the various topics related to it.\",\"breadcrumb\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#primaryimage\",\"url\":\"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg\",\"contentUrl\":\"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg\",\"width\":686,\"height\":386},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/sparksupport.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Dynamic Web Scraping Using Selenium\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/sparksupport.com\/blog\/#website\",\"url\":\"https:\/\/sparksupport.com\/blog\/\",\"name\":\"SparkSupport Blog\",\"description\":\"SparkSupport Blogs\",\"publisher\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/sparksupport.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/sparksupport.com\/blog\/#organization\",\"name\":\"SparkSupport\",\"url\":\"https:\/\/sparksupport.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/sparksupport.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2019\/08\/cropped-logo-1.jpg\",\"contentUrl\":\"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2019\/08\/cropped-logo-1.jpg\",\"width\":216,\"height\":44,\"caption\":\"SparkSupport\"},\"image\":{\"@id\":\"https:\/\/sparksupport.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/sparksupport.com\/blog\/#\/schema\/person\/7e7199cb9f41aaf67868b7d4d4a4cf39\",\"name\":\"Shameem Khalid\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/secure.gravatar.com\/avatar\/11295ac6c7aadbe227c1b4ddff880dd32e1ca53f15d50d3f5f724ceda03929a0?s=96&d=mm&r=g\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/11295ac6c7aadbe227c1b4ddff880dd32e1ca53f15d50d3f5f724ceda03929a0?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/11295ac6c7aadbe227c1b4ddff880dd32e1ca53f15d50d3f5f724ceda03929a0?s=96&d=mm&r=g\",\"caption\":\"Shameem Khalid\"},\"url\":\"https:\/\/sparksupport.com\/blog\/author\/shameem\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Dynamic Web Scraping Using Selenium - Complete Guide","description":"Introduction to Web Scraping for Selenium. This guide gives you the opportunity to learn full details on the various topics related to it.","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:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/","og_locale":"en_US","og_type":"article","og_title":"Dynamic Web Scraping Using Selenium - Complete Guide","og_description":"Introduction to Web Scraping for Selenium. This guide gives you the opportunity to learn full details on the various topics related to it.","og_url":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/","article_published_time":"2010-11-24T10:14:04+00:00","article_modified_time":"2024-06-25T06:40:15+00:00","og_image":[{"width":686,"height":386,"url":"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg","type":"image\/jpeg"}],"author":"Shameem Khalid","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Shameem Khalid","Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#article","isPartOf":{"@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/"},"author":{"name":"Shameem Khalid","@id":"https:\/\/sparksupport.com\/blog\/#\/schema\/person\/7e7199cb9f41aaf67868b7d4d4a4cf39"},"headline":"Dynamic Web Scraping Using Selenium","datePublished":"2010-11-24T10:14:04+00:00","dateModified":"2024-06-25T06:40:15+00:00","mainEntityOfPage":{"@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/"},"wordCount":585,"commentCount":0,"publisher":{"@id":"https:\/\/sparksupport.com\/blog\/#organization"},"image":{"@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#primaryimage"},"thumbnailUrl":"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg","keywords":["Ajax Scraping using selenium","Crawling Ajax","scraping","scraping + selenium","web crawling"],"articleSection":["linux","perl"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/","url":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/","name":"Dynamic Web Scraping Using Selenium - Complete Guide","isPartOf":{"@id":"https:\/\/sparksupport.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#primaryimage"},"image":{"@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#primaryimage"},"thumbnailUrl":"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg","datePublished":"2010-11-24T10:14:04+00:00","dateModified":"2024-06-25T06:40:15+00:00","description":"Introduction to Web Scraping for Selenium. This guide gives you the opportunity to learn full details on the various topics related to it.","breadcrumb":{"@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#primaryimage","url":"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg","contentUrl":"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2010\/11\/scrap.jpg","width":686,"height":386},{"@type":"BreadcrumbList","@id":"https:\/\/sparksupport.com\/blog\/dynamic-web-scraping-using-selenium\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sparksupport.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Dynamic Web Scraping Using Selenium"}]},{"@type":"WebSite","@id":"https:\/\/sparksupport.com\/blog\/#website","url":"https:\/\/sparksupport.com\/blog\/","name":"SparkSupport Blog","description":"SparkSupport Blogs","publisher":{"@id":"https:\/\/sparksupport.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sparksupport.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/sparksupport.com\/blog\/#organization","name":"SparkSupport","url":"https:\/\/sparksupport.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sparksupport.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2019\/08\/cropped-logo-1.jpg","contentUrl":"https:\/\/sparksupport.com\/blog\/wp-content\/uploads\/2019\/08\/cropped-logo-1.jpg","width":216,"height":44,"caption":"SparkSupport"},"image":{"@id":"https:\/\/sparksupport.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/sparksupport.com\/blog\/#\/schema\/person\/7e7199cb9f41aaf67868b7d4d4a4cf39","name":"Shameem Khalid","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/11295ac6c7aadbe227c1b4ddff880dd32e1ca53f15d50d3f5f724ceda03929a0?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/11295ac6c7aadbe227c1b4ddff880dd32e1ca53f15d50d3f5f724ceda03929a0?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/11295ac6c7aadbe227c1b4ddff880dd32e1ca53f15d50d3f5f724ceda03929a0?s=96&d=mm&r=g","caption":"Shameem Khalid"},"url":"https:\/\/sparksupport.com\/blog\/author\/shameem\/"}]}},"_links":{"self":[{"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/posts\/979","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/comments?post=979"}],"version-history":[{"count":0,"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/posts\/979\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/media\/5082"}],"wp:attachment":[{"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/media?parent=979"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/categories?post=979"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sparksupport.com\/blog\/wp-json\/wp\/v2\/tags?post=979"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}