<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Julia Theron</title>
    <description>The latest articles on DEV Community by Julia Theron (@juliatheron).</description>
    <link>https://dev.to/juliatheron</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3943589%2F911adcce-ab7a-4e04-931f-112cf3339943.png</url>
      <title>DEV Community: Julia Theron</title>
      <link>https://dev.to/juliatheron</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/juliatheron"/>
    <language>en</language>
    <item>
      <title>How I Generate Schema Markup for Any Page in Seconds</title>
      <dc:creator>Julia Theron</dc:creator>
      <pubDate>Fri, 05 Jun 2026 06:58:30 +0000</pubDate>
      <link>https://dev.to/juliatheron/how-i-generate-schema-markup-for-any-page-in-seconds-hgo</link>
      <guid>https://dev.to/juliatheron/how-i-generate-schema-markup-for-any-page-in-seconds-hgo</guid>
      <description>&lt;p&gt;Ever notice how some websites get rich snippets in Google search results? It's all about schema markup. I've been experimenting with an AI Schema Architect that generates structured data for any page type. For a FAQ page, it creates:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "&lt;a class="mentioned-user" href="https://dev.to/context"&gt;@context&lt;/a&gt;": "&lt;a href="https://schema.org" rel="noopener noreferrer"&gt;https://schema.org&lt;/a&gt;",&lt;br&gt;
  "@type": "FAQPage",&lt;br&gt;
  "mainEntity": [{&lt;br&gt;
    "@type": "Question",&lt;br&gt;
    "name": "What is schema markup?",&lt;br&gt;
    "acceptedAnswer": {&lt;br&gt;
      "@type": "Answer",&lt;br&gt;
      "text": "It's structured data that helps search engines understand your content."&lt;br&gt;
    }&lt;br&gt;
  }]&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;This boosted my click-through rates significantly. If you want to try it, check out &lt;a href="https://serpspur.com" rel="noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu0rh1us5o2vd8b9l23ru.png" alt=" " width="800" height="533"&gt;&lt;/a&gt; – it's free and super easy to use.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A Free SEO Tool I Recently Tested for Backlink Gap Analysis</title>
      <dc:creator>Julia Theron</dc:creator>
      <pubDate>Wed, 03 Jun 2026 05:58:33 +0000</pubDate>
      <link>https://dev.to/juliatheron/a-free-seo-tool-i-recently-tested-for-backlink-gap-analysis-441a</link>
      <guid>https://dev.to/juliatheron/a-free-seo-tool-i-recently-tested-for-backlink-gap-analysis-441a</guid>
      <description>&lt;p&gt;While researching alternatives to Ahrefs and Majestic, I came across SERPSpur and decided to test it on a few small projects.&lt;/p&gt;

&lt;p&gt;What caught my attention was the backlink gap analysis feature. It surfaced a handful of link opportunities that I hadn't noticed during my usual workflow. I also found the interface straightforward compared to some of the larger SEO platforms.&lt;/p&gt;

&lt;p&gt;For anyone working with small websites or limited budgets, the free tier is worth exploring before committing to expensive subscriptions.&lt;/p&gt;

&lt;p&gt;I'm curious if anyone else here has tested &lt;a href="https://serpspur.com" rel="noopener noreferrer"&gt;SERPSpur&lt;/a&gt; or similar SEO tools recently. How did the results compare with Ahrefs, Semrush, or Majestic?&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Testing Search Results from Different Locations Without a VPN</title>
      <dc:creator>Julia Theron</dc:creator>
      <pubDate>Tue, 02 Jun 2026 05:17:50 +0000</pubDate>
      <link>https://dev.to/juliatheron/testing-search-results-from-different-locations-without-a-vpn-4n7d</link>
      <guid>https://dev.to/juliatheron/testing-search-results-from-different-locations-without-a-vpn-4n7d</guid>
      <description>&lt;p&gt;I recently had to audit a client\'s SEO performance across 15 different cities in 5 countries. Manually changing VPN locations was driving me insane.&lt;/p&gt;

&lt;p&gt;So I wrote a Node.js script that uses headless Chrome to simulate searches from specific locations. The trick is overriding the &lt;code&gt;navigator.geolocation&lt;/code&gt; API before the page loads:&lt;/p&gt;

&lt;p&gt;javascript&lt;br&gt;
const puppeteer = require(\'puppeteer\');&lt;/p&gt;

&lt;p&gt;async function getLocalResults(query, lat, lng) {&lt;br&gt;
  const browser = await puppeteer.launch();&lt;br&gt;
  const page = await browser.newPage();&lt;/p&gt;

&lt;p&gt;// Override geolocation&lt;br&gt;
  await page.setGeolocation({ latitude: lat, longitude: lng });&lt;/p&gt;

&lt;p&gt;await page.goto(&lt;code&gt;https://www.google.com/search?q=${encodeURIComponent(query)}&lt;/code&gt;);&lt;/p&gt;

&lt;p&gt;// Extract local pack results&lt;br&gt;
  const localResults = await page.evaluate(() =&amp;gt; {&lt;br&gt;
    const items = document.querySelectorAll(\'.local-pack-item\');&lt;br&gt;
    return Array.from(items).map(item =&amp;gt; item.innerText);&lt;br&gt;
  });&lt;/p&gt;

&lt;p&gt;console.log(localResults);&lt;br&gt;
  await browser.close();&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;getLocalResults(\'pizza delivery\', 40.7128, -74.0060); // NYC&lt;/p&gt;

&lt;p&gt;This worked, but maintaining it for multiple cities was a pain. I ended up switching to a service that does all this natively. Now I just pass a location and get clean, consistent results every time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://serpspur.com" rel="noopener noreferrer"&gt;https://serpspur.com&lt;/a&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubxw2e48kdctn5ng3x6b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fubxw2e48kdctn5ng3x6b.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Resilient Python Web Scraper: Handling Rate Limits and Request Failures</title>
      <dc:creator>Julia Theron</dc:creator>
      <pubDate>Mon, 01 Jun 2026 16:08:18 +0000</pubDate>
      <link>https://dev.to/juliatheron/building-a-resilient-python-web-scraper-handling-rate-limits-and-request-failures-578a</link>
      <guid>https://dev.to/juliatheron/building-a-resilient-python-web-scraper-handling-rate-limits-and-request-failures-578a</guid>
      <description>&lt;p&gt;Ever had to scrape a website that blocks requests after a few tries? I built a simple Python script that rotates user agents and proxies to avoid getting banned. It uses a list of fake user agents and proxies from a free API. Here's the core loop:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
import requests&lt;br&gt;
from itertools import cycle&lt;/p&gt;

&lt;p&gt;user_agents = ['Mozilla/5.0 (Windows NT 10.0; Win64; x64)...', 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7)...']&lt;br&gt;
proxies = ['&lt;a href="http://proxy1:8080" rel="noopener noreferrer"&gt;http://proxy1:8080&lt;/a&gt;', '&lt;a href="http://proxy2:8080'" rel="noopener noreferrer"&gt;http://proxy2:8080'&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;ua_cycle = cycle(user_agents)&lt;br&gt;
proxy_cycle = cycle(proxies)&lt;/p&gt;

&lt;p&gt;for url in urls:&lt;br&gt;
    headers = {'User-Agent': next(ua_cycle)}&lt;br&gt;
    proxy = {'http': next(proxy_cycle), 'https': next(proxy_cycle)}&lt;br&gt;
    response = requests.get(url, headers=headers, proxies=proxy)&lt;br&gt;
    # process response&lt;/p&gt;

&lt;p&gt;This works for small projects, but for heavy scraping I've been using a dedicated proxy service. What's your go-to method for avoiding IP bans?&lt;/p&gt;

</description>
      <category>automation</category>
      <category>python</category>
      <category>tutorial</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>How to Test Local SEO Rankings with Python and SERP API</title>
      <dc:creator>Julia Theron</dc:creator>
      <pubDate>Sat, 30 May 2026 08:13:24 +0000</pubDate>
      <link>https://dev.to/juliatheron/how-to-test-local-seo-rankings-with-python-and-serp-api-lm8</link>
      <guid>https://dev.to/juliatheron/how-to-test-local-seo-rankings-with-python-and-serp-api-lm8</guid>
      <description>&lt;p&gt;Ever struggled with testing local SEO changes without physically being in a different location? I found a neat trick using Python to simulate location for search result testing. Here's a simple script that uses the SERPSpur API to fetch localized SERPs:&lt;/p&gt;

&lt;p&gt;python&lt;br&gt;
import requests&lt;/p&gt;

&lt;p&gt;API_ENDPOINT = "&lt;a href="https://api.serspur.com/v1/search" rel="noopener noreferrer"&gt;https://api.serspur.com/v1/search&lt;/a&gt;"&lt;br&gt;
API_KEY = "your_api_key_here"&lt;/p&gt;

&lt;p&gt;def get_local_results(query, location):&lt;br&gt;
    headers = {"Authorization": f"Bearer {API_KEY}"}&lt;br&gt;
    params = {"q": query, "location": location, "num": 10}&lt;br&gt;
    response = requests.get(API_ENDPOINT, headers=headers, params=params)&lt;br&gt;
    return response.json()&lt;/p&gt;

&lt;h1&gt;
  
  
  Example usage
&lt;/h1&gt;

&lt;p&gt;results = get_local_results("best coffee shop", "New York, NY")&lt;br&gt;
for result in results['organic_results']:&lt;br&gt;
    print(f"Title: {result['title']}")&lt;br&gt;
    print(f"URL: {result['link']}")&lt;br&gt;
    print("---")&lt;/p&gt;

&lt;p&gt;This approach saves me from constantly switching VPNs or using browser extensions. What's your go-to method for local SEO testing? Let's share tips! 🧠&lt;/p&gt;

</description>
      <category>api</category>
      <category>marketing</category>
      <category>python</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Build a Quick SEO Dashboard with SerpSpur API</title>
      <dc:creator>Julia Theron</dc:creator>
      <pubDate>Sat, 23 May 2026 06:43:54 +0000</pubDate>
      <link>https://dev.to/juliatheron/build-a-quick-seo-dashboard-with-serpspur-api-57g1</link>
      <guid>https://dev.to/juliatheron/build-a-quick-seo-dashboard-with-serpspur-api-57g1</guid>
      <description>&lt;p&gt;Built a quick SEO dashboard using &lt;a href="https://serpspur.com" rel="noopener noreferrer"&gt;SerpSpur's&lt;/a&gt; data. The API returns clean JSON for keyword rankings, backlink profiles, and site health metrics. Nice for custom reporting.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
