How to Use Python to Automate SEO Backlink Analysis

Automating SEO Backlink Analysis with Python: A Step-by-Step Guide

As an SEO enthusiast, you’re probably no stranger to the importance of backlinks in search engine rankings. But manually analyzing and tracking backlinks can be a tedious and time-consuming task. That’s where Python comes in – a powerful programming language that can help automate your SEO backlink analysis.

In this article, we’ll explore how to use Python to scrape, analyze, and track backlinks for your website or client’s website. By the end of this guide, you’ll be equipped with the skills to build your own SEO backlink analysis tool using Python.

Prerequisites

Before we dive into the coding part, make sure you have:

  1. Python installed: You can download and install the latest version of Python from the official website.
  2. Basic understanding of HTML and CSS: Familiarity with HTML and CSS will help you understand how web pages are structured and what parts to target for scraping backlinks.
  3. A programming mindset: Don’t worry if you’re new to programming; we’ll take it one step at a time.

Step 1: Choose Your Backlink Analysis Tool

There are many tools available online that can help you analyze backlinks, such as Ahrefs, Moz, and SEMrush. However, for the purpose of this tutorial, we’ll use the Scrapy framework, which is an excellent tool for web scraping.

Step 2: Set Up Your Scrapy Project

  1. Open your terminal or command prompt and create a new directory for your project.
  2. Navigate to that directory using cd.
  3. Run the following command to initialize a new Scrapy project:
    scrapy startproject backlink_analyzer
    This will create a basic structure for your project, including folders for models, pipelines, and spiders.

Step 3: Create Your Spider

In Scrapy, a spider is a Python class that extracts data from web pages. We’ll create a spider to extract backlinks from a given website.
“`python

backlink_analyzer/backlink_spider.py

import scrapy

class BacklinkSpider(scrapy.Spider):
name = “backlink_spider”
start_urls = [“https://example.com”] # Replace with the target website

def parse(self, response):
    # Extract links from the page
    for link in response.css("a::attr(href)"):
        yield {
            'url': link.get(),
            'title': response.css("title::text").get()
        }

``
In this example, our spider starts at
https://example.comand extracts all links (tags with anhrefattribute) from the page. We're also extracting the title of the page using the` tag.</p> <h2><strong>Step 4: Configure Your Spider</strong></h2> <p>Open your project’s <code>settings.py</code> file (created by Scrapy during initialization) and add the following configuration:<br /> “`python</p> <h1>backlink_analyzer/settings.py</h1> <p>ITEM_PIPE_MODULE = ‘backlink_pipelines.BacklinkPipeline’<br /> “`<br /> This tells Scrapy to use our custom pipeline, which we’ll create next.</p> <h2><strong>Step 5: Create Your Pipeline</strong></h2> <p>Create a new file called <code>backlink_pipelines.py</code> in your project directory:<br /> “`python</p> <h1>backlink_analyzer/backlink_pipelines.py</h1> <p>import scrapy</p> <p>class BacklinkPipeline(object):<br /> def process_item(self, item, spider):<br /> # Do something with the extracted data (e.g., store it to a database)<br /> return item<br /> “`<br /> In this example, our pipeline simply passes the extracted items through without modification. You can customize this pipeline to perform tasks like storing data in a database or sending notifications.</p> <h2><strong>Step 6: Run Your Spider</strong></h2> <p>Navigate back to your project directory and run the following command:<br /> <code>scrapy crawl backlink_spider</code><br /> This will start your spider, which will extract backlinks from the target website. You can specify multiple start URLs by comma-separating them:<br /> <code>shell<br /> scrapy crawl backlink_spider -s START_URLS="https://example.com, https://another-example.com"</code><br /> <strong>Step 7: Analyze and Visualize Your Data</strong></p> <hr /> <p>Now that you have extracted your backlinks, it’s time to analyze and visualize the data. You can use Python libraries like <strong>Pandas</strong>, <strong>Matplotlib</strong>, or <strong>Seaborn</strong> to manipulate and plot your data.</p> <p>For example, you could create a bar chart showing the top domains linking to your website:<br /> “`python<br /> import pandas as pd<br /> import matplotlib.pyplot as plt</p> <h1>Load your extracted data into a Pandas DataFrame</h1> <p>df = pd.read_csv(“backlinks.csv”)</p> <h1>Group by domain and count the number of links</h1> <p>domain_counts = df.groupby(‘domain’)[‘url’].count()</p> <h1>Create a bar chart</h1> <p>plt.bar(domain_counts.index, domain_counts.values)<br /> plt.xlabel(‘Domain’)<br /> plt.ylabel(‘Number of Links’)<br /> plt.title(‘Top Domains Linking to Your Website’)<br /> plt.show()<br /> “`<br /> <strong>Conclusion</strong></p> <hr /> <p>In this article, we’ve covered the basics of using Python and Scrapy to automate SEO backlink analysis. You now have a solid foundation for building your own backlink analysis tool.</p> <p>Remember to always follow web scraping best practices, respect website terms of service, and comply with robots.txt files. Happy coding!</p> <div class="post-views content-post post-522 entry-meta load-static"> <span class="post-views-icon dashicons dashicons-chart-bar"></span> <span class="post-views-label">Post Views:</span> <span class="post-views-count">550</span> </div> </div> <nav class="post-navigation"> <nav class="navigation post-navigation" aria-label="Posts"> <h2 class="screen-reader-text">Post navigation</h2> <div class="nav-links"><div class="nav-previous"><a href="https://artofseo.ca/how-to-perform-a-crawl-depth-analysis-for-seo/" rel="prev"><span class="nav-label">← Previous</span><span class="nav-title">How to Perform a Crawl Depth Analysis for SEO</span></a></div><div class="nav-next"><a href="https://artofseo.ca/how-to-optimize-your-websites-ssl-configuration-for-seo/" rel="next"><span class="nav-label">Next →</span><span class="nav-title">How to Optimize Your Website’s SSL Configuration for SEO</span></a></div></div> </nav> </nav> </article> <aside class="sidebar" role="complementary"> <div class="sidebar-widget"> <h3 class="widget-title">Search</h3> <div class="widget-body"> <form class="sidebar-search-form" method="get" action="https://artofseo.ca/"> <input type="search" name="s" placeholder="Search articles..." value=""> <button type="submit">🔍</button> </form> </div> </div> <div class="sidebar-widget"> <h3 class="widget-title">Trending</h3> <div class="widget-body"> <ol class="trending-list"> <li> <div> <div class="trending-title"><a href="https://artofseo.ca/how-to-audit-your-site-for-rendering-issues-across-browsers/">How to Audit Your Site for Rendering Issues Across Browsers</a></div> <div class="trending-meta">May 21, 2026</div> </div> </li> <li> <div> <div class="trending-title"><a href="https://artofseo.ca/implementing-lazy-loading-for-faster-image-performance-in-2026/">Implementing Lazy Loading for Faster Image Performance in 2026</a></div> <div class="trending-meta">May 20, 2026</div> </div> </li> <li> <div> <div class="trending-title"><a href="https://artofseo.ca/how-to-prevent-content-duplication-with-proper-url-parameters-2/">How to Prevent Content Duplication with Proper URL Parameters</a></div> <div class="trending-meta">May 19, 2026</div> </div> </li> <li> <div> <div class="trending-title"><a href="https://artofseo.ca/best-practices-for-multi-language-sitemaps-and-seo-in-2026/">Best Practices for Multi-Language Sitemaps and SEO in 2026</a></div> <div class="trending-meta">May 18, 2026</div> </div> </li> <li> <div> <div class="trending-title"><a href="https://artofseo.ca/a-comprehensive-guide-to-using-sitebulb-for-technical-seo-audits-in-2026/">A Comprehensive Guide to Using Sitebulb for Technical SEO Audits in 2026</a></div> <div class="trending-meta">May 17, 2026</div> </div> </li> </ol> </div> </div> <div class="sidebar-widget" style="border: none;"> <div class="ad-widget"> <div class="ad-logo">Search <span>Gurus</span></div> <div class="ad-tagline">Canada's Premier SEO & Digital Marketing Agency</div> <a href="https://www.searchgurus.ca" target="_blank" rel="noopener noreferrer" class="ad-cta">Get a Free Audit</a> <a href="https://www.searchgurus.ca" target="_blank" rel="noopener noreferrer" class="ad-url">www.searchgurus.ca</a> </div> </div> <div class="sidebar-widget"> <h3 class="widget-title">Categories</h3> <div class="widget-body"> <ul class="category-list"> <li> <a href="https://artofseo.ca/category/seo-news/"> SEO News <span class="count">499</span> </a> </li> </ul> </div> </div> <div class="newsletter-widget"> <div class="newsletter-icon">✉</div> <div class="newsletter-title">Daily SEO Insights</div> <div class="newsletter-desc">Get the latest SEO tips and strategies delivered to your inbox every morning.</div> <form> <input type="email" placeholder="Your email address"> <button type="submit">Subscribe</button> </form> </div> <div id="block-2" class="sidebar-widget widget_block widget_search"><form role="search" method="get" action="https://artofseo.ca/" class="wp-block-search__button-outside wp-block-search__text-button wp-block-search" ><label class="wp-block-search__label" for="wp-block-search__input-1" >Search</label><div class="wp-block-search__inside-wrapper" ><input class="wp-block-search__input" id="wp-block-search__input-1" placeholder="" value="" type="search" name="s" required /><button aria-label="Search" class="wp-block-search__button wp-element-button" type="submit" >Search</button></div></form></div><div id="block-11" class="sidebar-widget widget_block widget_media_image"> <figure class="wp-block-image size-full"><a href="https://www.searchgurus.ca"><img loading="lazy" decoding="async" width="474" height="337" src="https://artofseo.ca/wp-content/uploads/2024/10/Screenshot-from-2024-10-09-01-01-29.png" alt="" class="wp-image-647" srcset="https://artofseo.ca/wp-content/uploads/2024/10/Screenshot-from-2024-10-09-01-01-29.png 474w, https://artofseo.ca/wp-content/uploads/2024/10/Screenshot-from-2024-10-09-01-01-29-300x213.png 300w" sizes="auto, (max-width: 474px) 100vw, 474px" /></a></figure> </div><div id="block-3" class="sidebar-widget widget_block"> <div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"> <h2 class="wp-block-heading">Recent Posts</h2> <ul class="wp-block-latest-posts__list wp-block-latest-posts"><li><a class="wp-block-latest-posts__post-title" href="https://artofseo.ca/how-to-audit-your-site-for-rendering-issues-across-browsers/">How to Audit Your Site for Rendering Issues Across Browsers</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://artofseo.ca/implementing-lazy-loading-for-faster-image-performance-in-2026/">Implementing Lazy Loading for Faster Image Performance in 2026</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://artofseo.ca/how-to-prevent-content-duplication-with-proper-url-parameters-2/">How to Prevent Content Duplication with Proper URL Parameters</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://artofseo.ca/best-practices-for-multi-language-sitemaps-and-seo-in-2026/">Best Practices for Multi-Language Sitemaps and SEO in 2026</a></li> <li><a class="wp-block-latest-posts__post-title" href="https://artofseo.ca/a-comprehensive-guide-to-using-sitebulb-for-technical-seo-audits-in-2026/">A Comprehensive Guide to Using Sitebulb for Technical SEO Audits in 2026</a></li> </ul></div></div> </div><div id="block-4" class="sidebar-widget widget_block"> <div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"> <h2 class="wp-block-heading"></h2> </div></div> </div><div id="block-5" class="sidebar-widget widget_block"> <div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"> <h2 class="wp-block-heading">Archives</h2> <ul class="wp-block-archives-list wp-block-archives"> <li><a href='https://artofseo.ca/2026/05/'>May 2026</a></li> <li><a href='https://artofseo.ca/2026/04/'>April 2026</a></li> <li><a href='https://artofseo.ca/2025/04/'>April 2025</a></li> <li><a href='https://artofseo.ca/2025/03/'>March 2025</a></li> <li><a href='https://artofseo.ca/2025/02/'>February 2025</a></li> <li><a href='https://artofseo.ca/2025/01/'>January 2025</a></li> <li><a href='https://artofseo.ca/2024/10/'>October 2024</a></li> <li><a href='https://artofseo.ca/2024/09/'>September 2024</a></li> <li><a href='https://artofseo.ca/2024/08/'>August 2024</a></li> <li><a href='https://artofseo.ca/2024/07/'>July 2024</a></li> <li><a href='https://artofseo.ca/2024/06/'>June 2024</a></li> </ul></div></div> </div><div id="block-6" class="sidebar-widget widget_block"> <div class="wp-block-group"><div class="wp-block-group__inner-container is-layout-flow wp-block-group-is-layout-flow"> <h2 class="wp-block-heading">Categories</h2> <ul class="wp-block-categories-list wp-block-categories-taxonomy-category wp-block-categories"> <li class="cat-item cat-item-2"><a href="https://artofseo.ca/category/seo-news/">SEO News</a> </li> </ul></div></div> </div><div id="block-9" class="sidebar-widget widget_block widget_media_image"><div class="wp-block-image"> <figure class="aligncenter size-full"><img loading="lazy" decoding="async" width="474" height="337" src="https://artofseo.ca/wp-content/uploads/2024/10/Screenshot-from-2024-10-09-01-01-29.png" alt="" class="wp-image-647" srcset="https://artofseo.ca/wp-content/uploads/2024/10/Screenshot-from-2024-10-09-01-01-29.png 474w, https://artofseo.ca/wp-content/uploads/2024/10/Screenshot-from-2024-10-09-01-01-29-300x213.png 300w" sizes="auto, (max-width: 474px) 100vw, 474px" /></figure> </div></div> </aside> </div> </div> </main> <footer class="site-footer" role="contentinfo"> <div class="container"> <div class="footer-widgets"> <div class="footer-widget-col"> <h3>About</h3> <div class="about-text"> <p><strong>Art of SEO</strong> is your daily source for mastering the search engine landscape. We cover the latest in SEO strategies, algorithm updates, and digital marketing insights to help you stay ahead.</p> </div> </div> <div class="footer-widget-col"> <h3>Quick Links</h3> <ul class="footer-menu"><li><a href="https://artofseo.ca/">Home</a></li><li><a href="https://artofseo.ca/about">About</a></li><li><a href="https://artofseo.ca/contact">Contact</a></li></ul> </div> <div class="footer-widget-col"> <h3>Search Gurus Inc.</h3> <div class="about-text"> <p>Need expert SEO services? <a href="https://www.searchgurus.ca" target="_blank" rel="noopener noreferrer" style="color: #d4a843;">Search Gurus Inc.</a> is a Canadian digital marketing agency specializing in search engine optimization, PPC, and web design.</p> <p style="margin-top: 0.75rem;"><a href="https://www.searchgurus.ca" target="_blank" rel="noopener noreferrer" style="color: #d4a843; font-weight: 600;">www.searchgurus.ca →</a></p> </div> </div> </div> <div class="footer-bottom"> <div class="container"> <p>© 2026 <a href="https://artofseo.ca/">Art of SEO</a>. All rights reserved.</p> <p>Proudly powered by <a href="https://www.searchgurus.ca" target="_blank" rel="noopener noreferrer">Search Gurus Inc.</a></p> </div> </div> </div> </footer> <script type="speculationrules"> {"prefetch":[{"source":"document","where":{"and":[{"href_matches":"/*"},{"not":{"href_matches":["/wp-*.php","/wp-admin/*","/wp-content/uploads/*","/wp-content/*","/wp-content/plugins/*","/wp-content/themes/artofseo-theme/*","/*\\?(.+)"]}},{"not":{"selector_matches":"a[rel~=\"nofollow\"]"}},{"not":{"selector_matches":".no-prefetch, .no-prefetch a"}}]},"eagerness":"conservative"}]} </script> <!-- AI Chat Widget --> <section class="acw-chat-button" data-position="right" role="complementary" aria-label="AI Chat Widget"> <button class="acw-chat-button-inner" aria-label="Ask AI" aria-expanded="false"> <div class="acw-button-fill" style=""> <svg class="acw-ai-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z"/> <path d="M19 10v2a7 7 0 0 1-14 0v-2"/> <line x1="12" x2="12" y1="19" y2="22"/> </svg> <span>Ask AI</span> </div> </button> </section> <div class="acw-chat-popup" data-position="right" role="dialog" aria-modal="true" aria-label="Ask AI about Art of SEO" style="display: none;"> <div class="acw-popup-header"> <h3 class="acw-chat-heading">Ask AI about Art of SEO</h3> <button class="acw-close-button" aria-label="Close"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"> <line x1="18" y1="6" x2="6" y2="18"></line> <line x1="6" y1="6" x2="18" y2="18"></line> </svg> </button> </div> <div class="acw-ai-platforms"> <a href="https://chat.openai.com/?q=As+a+customer%2C+I+want+to+know+what+makes+Art+of+SEO+the+best+other+to+handle+my+products+or+services.+What+are+their+biggest+strengths+and+wins%3F+%28https%3A%2F%2Fartofseo.ca%29" target="_blank" rel="noopener noreferrer" class="acw-ai-model" data-platform="chatgpt" title="Ask ChatGPT about Art of SEO"> <div class="acw-ai-row"> <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptLTEgMTcuOTNjLTMuOTUtLjQ5LTctMy44NS03LTcuOTMgMC0uNjIuMDgtMS4yMS4yMS0xLjc5TDkgMTV2MWMwIDEuMS45IDIgMiAydjEuOTN6bTYuOS0yLjU0Yy0uMjYtLjgxLTEtMS4zOS0xLjktMS4zOWgtMXYtM2MwLS41NS0uNDUtMS0xLTFIOHYtMmgyYy41NSAwIDEtLjQ1IDEtMVY3aDJjMS4xIDAgMi0uOSAyLTJ2LS40MWMyLjkzIDEuMTkgNSA0LjA2IDUgNy40MSAwIDIuMDgtLjggMy45Ny0yLjEgNS4zOXoiLz48L3N2Zz4=" alt="" class="acw-ai-logo" width="24" height="24"> <span class="acw-ai-title">ChatGPT</span> <svg class="acw-external-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/> <polyline points="15 3 21 3 21 9"/> <line x1="10" y1="14" x2="21" y2="3"/> </svg> </div> </a> <a href="https://www.google.com/search?udm=50&q=As+a+customer%2C+I+want+to+know+what+makes+Art+of+SEO+the+best+other+to+handle+my+products+or+services.+What+are+their+biggest+strengths+and+wins%3F+%28https%3A%2F%2Fartofseo.ca%29" target="_blank" rel="noopener noreferrer" class="acw-ai-model" data-platform="gemini" title="Ask Gemini about Art of SEO"> <div class="acw-ai-row"> <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptLTIgMTVsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXoiLz48L3N2Zz4=" alt="" class="acw-ai-logo" width="24" height="24"> <span class="acw-ai-title">Gemini</span> <svg class="acw-external-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/> <polyline points="15 3 21 3 21 9"/> <line x1="10" y1="14" x2="21" y2="3"/> </svg> </div> </a> <a href="https://www.perplexity.ai/search/new?q=As+a+customer%2C+I+want+to+know+what+makes+Art+of+SEO+the+best+other+to+handle+my+products+or+services.+What+are+their+biggest+strengths+and+wins%3F+%28https%3A%2F%2Fartofseo.ca%29" target="_blank" rel="noopener noreferrer" class="acw-ai-model" data-platform="perplexity" title="Ask Perplexity about Art of SEO"> <div class="acw-ai-row"> <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtNmgydjZ6bTAtOGgtMlY3aDJ2MnoiLz48L3N2Zz4=" alt="" class="acw-ai-logo" width="24" height="24"> <span class="acw-ai-title">Perplexity</span> <svg class="acw-external-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/> <polyline points="15 3 21 3 21 9"/> <line x1="10" y1="14" x2="21" y2="3"/> </svg> </div> </a> <a href="https://claude.ai/new?q=As+a+customer%2C+I+want+to+know+what+makes+Art+of+SEO+the+best+other+to+handle+my+products+or+services.+What+are+their+biggest+strengths+and+wins%3F+%28https%3A%2F%2Fartofseo.ca%29" target="_blank" rel="noopener noreferrer" class="acw-ai-model" data-platform="claude" title="Ask Claude about Art of SEO"> <div class="acw-ai-row"> <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptMCAxNC4yYy0yLjUgMC00LjcxLTEuMjgtNi0zLjIyLjAzLTEuOTkgNC0zLjA4IDYtMy4wOCAxLjk5IDAgNS45NyAxLjA5IDYgMy4wOC0xLjI5IDEuOTQtMy41IDMuMjItNiAzLjIyeiIvPjwvc3ZnPg==" alt="" class="acw-ai-logo" width="24" height="24"> <span class="acw-ai-title">Claude</span> <svg class="acw-external-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/> <polyline points="15 3 21 3 21 9"/> <line x1="10" y1="14" x2="21" y2="3"/> </svg> </div> </a> <a href="https://x.com/i/grok?text=As+a+customer%2C+I+want+to+know+what+makes+Art+of+SEO+the+best+other+to+handle+my+products+or+services.+What+are+their+biggest+strengths+and+wins%3F+%28https%3A%2F%2Fartofseo.ca%29" target="_blank" rel="noopener noreferrer" class="acw-ai-model" data-platform="grok" title="Ask Grok about Art of SEO"> <div class="acw-ai-row"> <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCIgZmlsbD0iY3VycmVudENvbG9yIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ii8+PC9zdmc+" alt="" class="acw-ai-logo" width="24" height="24"> <span class="acw-ai-title">Grok</span> <svg class="acw-external-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"> <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/> <polyline points="15 3 21 3 21 9"/> <line x1="10" y1="14" x2="21" y2="3"/> </svg> </div> </a> </div> <div class="acw-watermark"> <a href="https://searchgurus.ca/?ref=free" target="_blank" rel="noopener noreferrer"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" width="12" height="12"> <path d="M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z"/> <path d="M19 10v2a7 7 0 0 1-14 0v-2"/> </svg> Powered by AI Chat Widget </a> </div> </div> <script id="acw-public-js-extra"> var acwSettings = {"ajaxUrl":"https://artofseo.ca/wp-admin/admin-ajax.php","nonce":"9b32acd3f6","trackClicks":""}; //# sourceURL=acw-public-js-extra </script> <script id="acw-public-js" src="https://artofseo.ca/wp-content/plugins/ai-chat-widget/public/js/widget.js?ver=1.1.0"></script> <script id="wp-emoji-settings" type="application/json"> {"baseUrl":"https://s.w.org/images/core/emoji/17.0.2/72x72/","ext":".png","svgUrl":"https://s.w.org/images/core/emoji/17.0.2/svg/","svgExt":".svg","source":{"concatemoji":"https://artofseo.ca/wp-includes/js/wp-emoji-release.min.js?ver=7.0"}} </script> <script type="module"> /*! This file is auto-generated */ const a=JSON.parse(document.getElementById("wp-emoji-settings").textContent),o=(window._wpemojiSettings=a,"wpEmojiSettingsSupports"),s=["flag","emoji"];function i(e){try{var t={supportTests:e,timestamp:(new Date).valueOf()};sessionStorage.setItem(o,JSON.stringify(t))}catch(e){}}function c(e,t,n){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);t=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(n,0,0);const a=new Uint32Array(e.getImageData(0,0,e.canvas.width,e.canvas.height).data);return t.every((e,t)=>e===a[t])}function p(e,t){e.clearRect(0,0,e.canvas.width,e.canvas.height),e.fillText(t,0,0);var n=e.getImageData(16,16,1,1);for(let e=0;e<n.data.length;e++)if(0!==n.data[e])return!1;return!0}function u(e,t,n,a){switch(t){case"flag":return n(e,"\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f","\ud83c\udff3\ufe0f\u200b\u26a7\ufe0f")?!1:!n(e,"\ud83c\udde8\ud83c\uddf6","\ud83c\udde8\u200b\ud83c\uddf6")&&!n(e,"\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f","\ud83c\udff4\u200b\udb40\udc67\u200b\udb40\udc62\u200b\udb40\udc65\u200b\udb40\udc6e\u200b\udb40\udc67\u200b\udb40\udc7f");case"emoji":return!a(e,"\ud83e\u1fac8")}return!1}function f(e,t,n,a){let r;const o=(r="undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?new OffscreenCanvas(300,150):document.createElement("canvas")).getContext("2d",{willReadFrequently:!0}),s=(o.textBaseline="top",o.font="600 32px Arial",{});return e.forEach(e=>{s[e]=t(o,e,n,a)}),s}function r(e){var t=document.createElement("script");t.src=e,t.defer=!0,document.head.appendChild(t)}a.supports={everything:!0,everythingExceptFlag:!0},new Promise(t=>{let n=function(){try{var e=JSON.parse(sessionStorage.getItem(o));if("object"==typeof e&&"number"==typeof e.timestamp&&(new Date).valueOf()<e.timestamp+604800&&"object"==typeof e.supportTests)return e.supportTests}catch(e){}return null}();if(!n){if("undefined"!=typeof Worker&&"undefined"!=typeof OffscreenCanvas&&"undefined"!=typeof URL&&URL.createObjectURL&&"undefined"!=typeof Blob)try{var e="postMessage("+f.toString()+"("+[JSON.stringify(s),u.toString(),c.toString(),p.toString()].join(",")+"));",a=new Blob([e],{type:"text/javascript"});const r=new Worker(URL.createObjectURL(a),{name:"wpTestEmojiSupports"});return void(r.onmessage=e=>{i(n=e.data),r.terminate(),t(n)})}catch(e){}i(n=f(s,u,c,p))}t(n)}).then(e=>{for(const n in e)a.supports[n]=e[n],a.supports.everything=a.supports.everything&&a.supports[n],"flag"!==n&&(a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&a.supports[n]);var t;a.supports.everythingExceptFlag=a.supports.everythingExceptFlag&&!a.supports.flag,a.supports.everything||((t=a.source||{}).concatemoji?r(t.concatemoji):t.wpemoji&&t.twemoji&&(r(t.twemoji),r(t.wpemoji)))}); //# sourceURL=https://artofseo.ca/wp-includes/js/wp-emoji-loader.min.js </script> </body> </html>