<?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>Forem: Florian</title>
    <description>The latest articles on Forem by Florian (@florian_chen).</description>
    <link>https://forem.com/florian_chen</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%2F3891864%2F7eae2e7a-2229-4627-9918-b7301558906e.png</url>
      <title>Forem: Florian</title>
      <link>https://forem.com/florian_chen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/florian_chen"/>
    <language>en</language>
    <item>
      <title>What Data Should You Store When Tracking Keyword Rankings?</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Wed, 06 May 2026 09:09:06 +0000</pubDate>
      <link>https://forem.com/florian_chen/what-data-should-you-store-when-tracking-keyword-rankings-fjp</link>
      <guid>https://forem.com/florian_chen/what-data-should-you-store-when-tracking-keyword-rankings-fjp</guid>
      <description>&lt;p&gt;Keyword rank tracking sounds simple &lt;strong&gt;at first&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You search a keyword, check where your website appears, and record the position.&lt;/p&gt;

&lt;p&gt;But once you start tracking rankings over time, the problem becomes more complicated. A single position number is often not enough to explain what actually changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why position alone is not enough?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If a keyword drops from position 3 to position 8, it is tempting to assume that the page became weaker.&lt;/p&gt;

&lt;p&gt;But the SERP itself may have changed.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Google may show more ads&lt;/li&gt;
&lt;li&gt;local results may appear&lt;/li&gt;
&lt;li&gt;a featured snippet may take more space&lt;/li&gt;
&lt;li&gt;the query intent may shift&lt;/li&gt;
&lt;li&gt;competitors may rank with a different type of page&lt;/li&gt;
&lt;li&gt;results may vary by country, city, language, or device&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why storing only the ranking position can be misleading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Basic data to store&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For each keyword check, I would usually store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keyword&lt;/li&gt;
&lt;li&gt;target domain&lt;/li&gt;
&lt;li&gt;ranking position&lt;/li&gt;
&lt;li&gt;ranking URL&lt;/li&gt;
&lt;li&gt;title&lt;/li&gt;
&lt;li&gt;snippet&lt;/li&gt;
&lt;li&gt;country&lt;/li&gt;
&lt;li&gt;language&lt;/li&gt;
&lt;li&gt;device&lt;/li&gt;
&lt;li&gt;timestamp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives you enough context to compare changes over time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why location matters?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Search results can look very different depending on location.&lt;/p&gt;

&lt;p&gt;For local SEO, this is especially important. A business may rank well in one city but not in another. Even for non-local keywords, Google may still adjust results based on regional intent.&lt;/p&gt;

&lt;p&gt;If your project involves international SEO, local services, or market research, location should not be treated as an optional field.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why device matters?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Desktop and mobile SERPs are not always the same.&lt;/p&gt;

&lt;p&gt;Mobile results may show different layouts, different local packs, and different visible elements. If most of your traffic comes from mobile, tracking desktop rankings only may give you an incomplete picture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why SERP features matter?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sometimes your ranking position stays the same, but your visibility changes.&lt;/p&gt;

&lt;p&gt;This can happen when the SERP includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ads&lt;/li&gt;
&lt;li&gt;featured snippets&lt;/li&gt;
&lt;li&gt;People Also Ask&lt;/li&gt;
&lt;li&gt;local packs&lt;/li&gt;
&lt;li&gt;image results&lt;/li&gt;
&lt;li&gt;video results&lt;/li&gt;
&lt;li&gt;shopping results&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A page ranking in position 3 may receive less traffic if several SERP features appear above it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Also track competitors&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rank tracking is not only about your own domain.&lt;/p&gt;

&lt;p&gt;It is also useful to record which competitors appear above and below you. This helps answer questions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did we lose position to the same competitor repeatedly?&lt;/li&gt;
&lt;li&gt;Did a new site enter the SERP?&lt;/li&gt;
&lt;li&gt;Are review sites, marketplaces, or forums taking over the results?&lt;/li&gt;
&lt;li&gt;Did Google start favoring a different content format?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These details are often more useful than the position number alone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A simple rank tracking checklist&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before building or choosing a rank tracking system, I would check whether it can store:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keyword&lt;/li&gt;
&lt;li&gt;location&lt;/li&gt;
&lt;li&gt;language&lt;/li&gt;
&lt;li&gt;device&lt;/li&gt;
&lt;li&gt;ranking URL&lt;/li&gt;
&lt;li&gt;title and snippet&lt;/li&gt;
&lt;li&gt;SERP features&lt;/li&gt;
&lt;li&gt;competitor URLs&lt;/li&gt;
&lt;li&gt;timestamp&lt;/li&gt;
&lt;li&gt;historical snapshots&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without this context, it becomes difficult to understand why rankings move.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Keyword rank tracking is not just about knowing whether a page is number 1, 3, or 10.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The more important question is: what changed in the search results?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you store only position, you may miss the real reason behind traffic changes.&lt;/p&gt;

&lt;p&gt;If you store structured SERP context, ranking data becomes much more useful for SEO monitoring, competitor research, and long-term decision making.&lt;/p&gt;

</description>
      <category>seo</category>
      <category>api</category>
      <category>webscraping</category>
      <category>data</category>
    </item>
    <item>
      <title>When Should Developers Use a SERP API Instead of Scraping Google Directly?</title>
      <dc:creator>Florian</dc:creator>
      <pubDate>Thu, 30 Apr 2026 08:42:40 +0000</pubDate>
      <link>https://forem.com/florian_chen/when-should-developers-use-a-serp-api-instead-of-scraping-google-directly-52ff</link>
      <guid>https://forem.com/florian_chen/when-should-developers-use-a-serp-api-instead-of-scraping-google-directly-52ff</guid>
      <description>&lt;p&gt;Collecting Google search results sounds simple at first.&lt;/p&gt;

&lt;p&gt;But once you scale it, you usually run into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP blocks&lt;/li&gt;
&lt;li&gt;CAPTCHA&lt;/li&gt;
&lt;li&gt;inconsistent localized results&lt;/li&gt;
&lt;li&gt;changing HTML structure&lt;/li&gt;
&lt;li&gt;high maintenance cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why direct scraping becomes hard?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you are only testing a few keywords, a basic scraper may work.&lt;/p&gt;

&lt;p&gt;But for SEO monitoring, rank tracking, AI search grounding, or competitor research, you usually need structured and repeatable SERP data.&lt;/p&gt;

&lt;p&gt;Direct scraping often becomes harder when you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistent results across countries or languages&lt;/li&gt;
&lt;li&gt;daily tracking for hundreds or thousands of keywords&lt;/li&gt;
&lt;li&gt;structured output instead of raw HTML&lt;/li&gt;
&lt;li&gt;lower maintenance when page layouts change&lt;/li&gt;
&lt;li&gt;fewer failures caused by blocks or verification pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;A practical approach: SERP API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A SERP API lets you send a query and receive structured search result data, instead of maintaining scraping logic yourself.&lt;/p&gt;

&lt;p&gt;Typical use cases include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;keyword rank tracking&lt;/li&gt;
&lt;li&gt;localized search result monitoring&lt;/li&gt;
&lt;li&gt;competitor research&lt;/li&gt;
&lt;li&gt;AI search grounding&lt;/li&gt;
&lt;li&gt;e-commerce search intelligence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;When a simple scraper is still enough?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You may not need a SERP API if:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you only check a few keywords manually&lt;/li&gt;
&lt;li&gt;the project is a one-time experiment&lt;/li&gt;
&lt;li&gt;localized accuracy is not important&lt;/li&gt;
&lt;li&gt;failures and retries do not affect your workflow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these cases, a lightweight scraper may be good enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to evaluate before choosing a SERP API?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before using any SERP API, I would usually check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;supported search engines&lt;/li&gt;
&lt;li&gt;country, language, and device parameters&lt;/li&gt;
&lt;li&gt;response format&lt;/li&gt;
&lt;li&gt;success rate and retry behavior&lt;/li&gt;
&lt;li&gt;pricing model&lt;/li&gt;
&lt;li&gt;speed and rate limits&lt;/li&gt;
&lt;li&gt;documentation quality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example workflow&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the keyword&lt;/li&gt;
&lt;li&gt;Choose country / language / device&lt;/li&gt;
&lt;li&gt;Send the request to a SERP API&lt;/li&gt;
&lt;li&gt;Parse structured results&lt;/li&gt;
&lt;li&gt;Store rankings or search result snippets&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Final thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your project only needs a few manual checks, a simple scraper may be enough.&lt;/p&gt;

&lt;p&gt;If you need stable, repeatable, localized SERP data, using a SERP API is usually easier to maintain.&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>api</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
