<?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: SerpApi.Org</title>
    <description>The latest articles on DEV Community by SerpApi.Org (@serpapiorg).</description>
    <link>https://dev.to/serpapiorg</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2109705%2F47d319df-6491-498e-b9b7-b6072856803e.png</url>
      <title>DEV Community: SerpApi.Org</title>
      <link>https://dev.to/serpapiorg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/serpapiorg"/>
    <language>en</language>
    <item>
      <title>How to scrape google local pack results without getting blocked</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Wed, 02 Sep 2026 02:31:31 +0000</pubDate>
      <link>https://dev.to/serpapiorg/how-to-scrape-google-local-pack-results-without-getting-blocked-3me7</link>
      <guid>https://dev.to/serpapiorg/how-to-scrape-google-local-pack-results-without-getting-blocked-3me7</guid>
      <description>&lt;p&gt;Building a robust pipeline to extract business listings from search results requires more than just a basic script. While a simple Python request might work for a few dozen queries, scaling to thousands of requests without hitting CAPTCHAs or 429 status codes requires mastering three core technical pillars: geo-localization, anti-bot mitigation, and resilient parsing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mastering Geo-Localization with UULE
&lt;/h3&gt;

&lt;p&gt;To get accurate results for specific regions, you need to master the UULE parameter. This base64-encoded string instructs the search engine to return results for a specific location, overriding your proxy's actual IP location. &lt;/p&gt;

&lt;p&gt;The format is &lt;code&gt;w+CAIQICI[Length][Canonical-Name]&lt;/code&gt;. The &lt;code&gt;Length&lt;/code&gt; character is calculated based on your canonical location string length using a custom ASCII-based index. By constructing these parameters, you can simulate search intent from virtually any neighborhood, which is significantly more efficient than attempting to spoof GPS coordinates via browser-based tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Avoiding Automated Traffic Detection
&lt;/h3&gt;

&lt;p&gt;High-frequency scraping will trigger security filters if your fingerprints don't match standard human behavior. Simple user-agent rotation is no longer enough. You must focus on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;JA3 Fingerprinting:&lt;/strong&gt; Your HTTP/2 TLS handshake must match the specific cipher suites and extensions of a real browser. If your request structure doesn't align with a standard Chrome desktop signature, the server will flag the connection immediately.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Residential Proxy Rotation:&lt;/strong&gt; Datacenter IPs are easily identified and blocked. Using a pool of residential proxies allows you to rotate your outgoing traffic, mimicking domestic web usage.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Headless Browser Hardening:&lt;/strong&gt; If you use Puppeteer or Playwright, you must disable the &lt;code&gt;navigator.webdriver&lt;/code&gt; flag and hide variables like &lt;code&gt;window.cdc_adoQyv8763_Array&lt;/code&gt; to prevent detection. Always use stealth plugins to normalize your environment’s hardware concurrency and canvas rendering.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Resilient Data Extraction
&lt;/h3&gt;

&lt;p&gt;Google frequently updates its front-end code, often using randomized alphanumeric class names (e.g., &lt;code&gt;u4698b&lt;/code&gt;). If your scraper relies on these classes, your parser will inevitably break. Instead, build your selectors using:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;JSON-LD Payloads:&lt;/strong&gt; Check for &lt;code&gt;application/ld+json&lt;/code&gt; script blocks in the HTML. These contain structured business data (name, ratings, address) in a machine-readable format that rarely changes, even when the UI layout is updated.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Structural XPath:&lt;/strong&gt; Target semantic HTML paths or immutable attributes like &lt;code&gt;data-cid&lt;/code&gt; instead of CSS classes. This creates a "structural anchor" that remains stable even when the page design is modified.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Scalability and Maintenance
&lt;/h3&gt;

&lt;p&gt;When scaling to a high volume of requests, you must shift toward a distributed architecture. Implement a task queue using tools like Redis or RabbitMQ to manage concurrency, and always enforce a 5–15 second buffer per residential IP to avoid rate limits.&lt;/p&gt;

&lt;p&gt;While maintaining an in-house infrastructure offers full control, the engineering overhead is significant. You must weigh the "build vs. buy" cost; for many teams, integrating a dedicated SERP API is far more cost-effective than dedicating weeks of developer time to fixing broken selectors, rotating proxies, and debugging TLS fingerprinting logic. Whether you choose to build a custom engine or outsource the parsing, focus on building a system that treats the DOM as a dynamic, volatile structure rather than a static document.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/how-to-scrape-google-local-pack-results-without-getting-blocked" rel="noopener noreferrer"&gt;How to scrape google local pack results without getting blocked&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Free web scraping api options for developers in 2026</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Tue, 01 Sep 2026 04:41:16 +0000</pubDate>
      <link>https://dev.to/serpapiorg/free-web-scraping-api-options-for-developers-in-2026-ogb</link>
      <guid>https://dev.to/serpapiorg/free-web-scraping-api-options-for-developers-in-2026-ogb</guid>
      <description>&lt;p&gt;Managing scrapers with Puppeteer or Playwright often turns into a nightmare of proxy maintenance and IP rotation, costing you more in engineering hours than a managed service ever would. Over the last decade of building data pipelines, I’ve found that the real "cost" of scraping isn’t the subscription fee—it’s the time spent debugging 403 errors and rotating blacklisted IPs.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hidden Costs of Managed Services
&lt;/h3&gt;

&lt;p&gt;When you opt for a service tier, you need to understand the difference between a raw HTTP request and a headless browser render. A standard GET request is cheap, but triggering a Chromium instance to execute JavaScript is essentially renting cloud compute. &lt;/p&gt;

&lt;p&gt;Most providers use a credit multiplier for these renders. One page load might consume 20 times the credits of a standard request. If your site relies on SPAs (Single Page Applications), your monthly quota will vanish in minutes if you aren't careful.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why "No-Card" Tiers Are Essential
&lt;/h3&gt;

&lt;p&gt;I always advise startups to stick to providers that don't require credit card details during signup. This acts as a natural "hard stop." When you hit your 1,000 or 5,000 request limit, the service simply returns an error instead of charging your company card for overages. It keeps your development sandbox risk-free.&lt;/p&gt;

&lt;p&gt;Here is how the current landscape looks for developers who want to test without financial commitment:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Monthly Free Requests&lt;/th&gt;
&lt;th&gt;Card Required&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ScraperAPI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;General Proxy Rotation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ZenRows&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Anti-bot Bypassing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Crawlbase&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1,000&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Static HTML Parsing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SerpApi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Structured Search Data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Optimizing Your Implementation
&lt;/h3&gt;

&lt;p&gt;The biggest mistake I see junior engineers make is keeping JavaScript rendering enabled by default. Always check the source code (&lt;code&gt;view-source&lt;/code&gt;) of your target. If the data you need is present in the raw HTML, turn off the rendering parameter immediately. This simple change can preserve 90% of your monthly credits.&lt;/p&gt;

&lt;p&gt;Furthermore, don't ignore the SDK. A service is only as good as its documentation and native support for your stack (Python, Node, Go). If you spend more time writing custom regex to clean messy HTML than you do writing business logic, your scraping tool is failing you.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Go Custom vs. Managed
&lt;/h3&gt;

&lt;p&gt;If you have zero budget but unlimited time for maintenance, open-source libraries like Scrapy or Playwright are the way to go. However, for a professional pipeline, the "engineering cycle" cost of building your own proxy rotation suite will quickly dwarf the cost of a mid-tier subscription.&lt;/p&gt;

&lt;p&gt;Ultimately, your strategy should be:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Validate:&lt;/strong&gt; Use a no-card free tier to confirm your logic works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Optimize:&lt;/strong&gt; Disable JS rendering wherever possible to stretch your credits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale:&lt;/strong&gt; Once you hit the limit, evaluate whether the time saved by the API justifies the cost of a professional plan.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Remember, ethical extraction—respecting &lt;code&gt;robots.txt&lt;/code&gt; and maintaining reasonable request delays—isn't just about compliance. It’s about being a good internet citizen and keeping your source platforms healthy so we can all continue building data-driven tools.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/free-web-scraping-api-options-for-developers-in-2026" rel="noopener noreferrer"&gt;Free web scraping api options for developers in 2026&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to scrape websites without getting blocked in 2026</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Mon, 31 Aug 2026 12:29:15 +0000</pubDate>
      <link>https://dev.to/serpapiorg/how-to-scrape-websites-without-getting-blocked-in-2026-3bk5</link>
      <guid>https://dev.to/serpapiorg/how-to-scrape-websites-without-getting-blocked-in-2026-3bk5</guid>
      <description>&lt;p&gt;Dealing with anti-bot defenses has moved far beyond rotating &lt;code&gt;User-Agent&lt;/code&gt; strings. If you are still relying on standard datacenter proxies and basic automation scripts, your requests are likely being dropped at the TCP handshake level. Modern security suites like Cloudflare or DataDome don't just check your IP; they profile your entire connection stack.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem: IP Reputation and TLS Fingerprinting
&lt;/h3&gt;

&lt;p&gt;Most datacenter IP ranges are blacklisted by default because they are easily identified as commercial cloud providers (AWS, Google Cloud). When a firewall sees an incoming connection from these ranges, it triggers an immediate reputation penalty.&lt;/p&gt;

&lt;p&gt;However, the real "gotcha" is &lt;strong&gt;TLS fingerprinting&lt;/strong&gt;. When your script initializes an HTTPS connection, it sends a &lt;code&gt;Client Hello&lt;/code&gt; packet. Security systems generate a &lt;strong&gt;JA3 or JA4 hash&lt;/strong&gt; from your TLS handshake parameters (cipher suites, extensions, etc.). If this hash doesn't match a standard desktop browser (like Chrome or Firefox), the server terminates the connection instantly. You could have the cleanest residential IP in the world, but if your Python script's SSL library is shouting "I am an automated bot," you will get blocked.&lt;/p&gt;

&lt;h3&gt;
  
  
  Modern Architecture Choices
&lt;/h3&gt;

&lt;p&gt;To build resilient pipelines, you must choose the right tool for your specific volume and target complexity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;For Lightweight Tasks:&lt;/strong&gt; Ditch traditional Selenium or standard &lt;code&gt;requests&lt;/code&gt;. Use libraries like &lt;code&gt;curl_cffi&lt;/code&gt; or &lt;code&gt;nodriver&lt;/code&gt;. These tools allow you to perform TLS impersonation and communicate via the Chrome DevTools Protocol (CDP) without leaving the obvious traces of legacy headless browsers.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;For High-Volume/Protected Sites:&lt;/strong&gt; Don't reinvent the wheel. Managed scraping APIs act as an abstraction layer, handling proxy rotation, CAPTCHA solving, and TLS spoofing for you. When evaluating these, &lt;strong&gt;always calculate the cost per 1,000 successful pages&lt;/strong&gt; rather than the base credit price. Many providers hide 10x-25x credit multipliers for features like residential proxies or JS rendering, which can bankrupt a project if not calculated upfront.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;For AI-Ready Data:&lt;/strong&gt; Use specialized tools like Firecrawl if you need to convert raw HTML into clean Markdown for RAG (Retrieval-Augmented Generation). These AI-native parsers excel at structuring data but are not replacements for the network-level unblocking needed to reach the page in the first place.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The "Don't Build" Philosophy
&lt;/h3&gt;

&lt;p&gt;My rule of thumb for engineering teams: &lt;strong&gt;never build a custom parser for a platform if a specialized API exists.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;For example, if you need to extract search engine results, using a dedicated service like SerpApi is almost always cheaper than the "hidden cost" of maintaining your own proxy pool, rotating IPs, and fixing your parser every time Google shifts their DOM structure. &lt;/p&gt;

&lt;h3&gt;
  
  
  Key Takeaways for 2026 Pipelines
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Stop using Datacenter IPs:&lt;/strong&gt; They are effectively obsolete for protected targets. Shift to residential proxy pools to mimic human ISP connections.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Impersonate, Don't Modify:&lt;/strong&gt; Focus on protocol-level TLS impersonation. If your tool doesn't support JA4 fingerprint spoofing, it’s a liability.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Audit Credit Multipliers:&lt;/strong&gt; Before choosing an API, simulate your actual production usage (JS rendering + Residential Proxy) to see the true cost per request.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Adopt Protocol-Level Drivers:&lt;/strong&gt; Move away from &lt;code&gt;chromedriver&lt;/code&gt; and Selenium. Use &lt;code&gt;nodriver&lt;/code&gt; or &lt;code&gt;Camoufox&lt;/code&gt; to avoid the detectable footprints left by legacy automation.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By offloading the "cat-and-mouse" game of firewall evasion to specialized providers, your team can focus on what actually drives value: the data itself, not the infrastructure used to fetch it.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/how-to-scrape-websites-without-getting-blocked-in-2026" rel="noopener noreferrer"&gt;How to scrape websites without getting blocked in 2026&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cheap residential proxy api for scraping: 2026 guide</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Sun, 30 Aug 2026 01:28:15 +0000</pubDate>
      <link>https://dev.to/serpapiorg/cheap-residential-proxy-api-for-scraping-2026-guide-2563</link>
      <guid>https://dev.to/serpapiorg/cheap-residential-proxy-api-for-scraping-2026-guide-2563</guid>
      <description>&lt;p&gt;Dealing with anti-bot systems is the most frustrating part of web scraping. Once a target server flags your datacenter IP ranges, your scripts become useless. While premium enterprise providers are tempting, they often lock developers into expensive long-term contracts. In my experience building scrapers, you don’t need a massive budget to bypass these blocks; you need to understand how to leverage residential IP pools efficiently without overpaying.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Residential IPs are Non-Negotiable
&lt;/h3&gt;

&lt;p&gt;Datacenter IPs are cheap, but they are easy to spot. Modern firewalls check the Autonomous System Number (ASN) of your traffic. If your requests originate from an Amazon or DigitalOcean block, you’re instantly flagged as non-human. &lt;/p&gt;

&lt;p&gt;Residential proxies, however, route traffic through real household ISPs. Because these IPs represent actual users, anti-bot systems can't block them without causing collateral damage to legitimate visitors. For a successful scrape, your pipeline must mimic human fingerprints, which starts with an IP that has a high reputation score and a legitimate ISP ASN match.&lt;/p&gt;

&lt;h3&gt;
  
  
  What to Look for in Budget-Friendly Providers
&lt;/h3&gt;

&lt;p&gt;When scouting for an affordable proxy API in 2026, don’t just look at the price per gigabyte. Consider these three metrics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;True Pay-As-You-Go:&lt;/strong&gt; Avoid providers that require high upfront commitments. You want the flexibility to scale your usage based on your actual extraction volume.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Pool Health:&lt;/strong&gt; A "100 million IP" network is useless if the IPs are sluggish or frequently drop. Look for services that provide low latency and clear health status codes.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Sticky vs. Rotating Sessions:&lt;/strong&gt; If you are scraping a simple catalog, per-request rotation is fine. But for flows requiring login or multi-step navigation, you need "sticky" sessions that hold an IP for 10–30 minutes to maintain your session state.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Quick Comparison Table (2026 Estimates)
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Cost/GB (PAYG)&lt;/th&gt;
&lt;th&gt;Min. Commitment&lt;/th&gt;
&lt;th&gt;Key Strength&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Webshare&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1.00 – $1.50&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Best for ultra-low costs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Smartproxy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$2.20 – $3.00&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Highly stable, massive pool&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Asiaproxy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$1.50 – $2.00&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;Great for regional targeting&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Technical Integration Strategy
&lt;/h3&gt;

&lt;p&gt;When using these APIs in Python, you must account for the reality that residential nodes are less stable than commercial servers. Your code should never assume a request will succeed on the first try. Always implement a retry logic with a timeout.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;

&lt;span class="c1"&gt;# Gateway config
&lt;/span&gt;&lt;span class="n"&gt;PROXY_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://username:password@gateway.provider.com:port&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;proxies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PROXY_URL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;PROXY_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="c1"&gt;# Use a 10s timeout to avoid hanging on slow residential nodes
&lt;/span&gt;        &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;raise_for_status&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Request failed: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Avoiding "Hidden" Bandwidth Costs
&lt;/h3&gt;

&lt;p&gt;One rookie mistake is ignoring header overhead. Some providers bill you for every byte of data passing through the socket, including TLS handshakes and headers. If you are only grabbing small snippets of data, this overhead can inflate your bill by 15-20%. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro-tip:&lt;/strong&gt; Always check if your provider bills per &lt;em&gt;successful&lt;/em&gt; response only. If a proxy node drops midway or returns a 403, you shouldn't be charged for that wasted bandwidth. Finally, never touch "free" proxy lists. They are almost always honey pots designed to sniff your traffic and hijack your credentials. Stick to verified providers, monitor your usage, and keep your scraper logic simple.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/cheap-residential-proxy-api-for-scraping-2026-guide" rel="noopener noreferrer"&gt;Cheap residential proxy api for scraping: 2026 guide&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Best free serp scraper chrome extensions for 2026</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Sat, 29 Aug 2026 10:39:14 +0000</pubDate>
      <link>https://dev.to/serpapiorg/best-free-serp-scraper-chrome-extensions-for-2026-18cl</link>
      <guid>https://dev.to/serpapiorg/best-free-serp-scraper-chrome-extensions-for-2026-18cl</guid>
      <description>&lt;p&gt;After spending years refining my data collection workflows, I’ve learned that relying on browser-based tools for SEO is often a game of diminishing returns. While they seem convenient for one-off tasks, their architecture is fundamentally flawed for anything beyond a few manual queries. If you are looking to automate your workflow, here is how to navigate the landscape without burning your IP or wasting hours in Excel.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vetting Security and Transparency
&lt;/h3&gt;

&lt;p&gt;The biggest mistake I see developers make is installing extensions without auditing the &lt;code&gt;manifest.json&lt;/code&gt;. If a tool requests read access to your entire browsing history or sensitive account data, uninstall it immediately. My golden rule: if it isn’t open-source, treat it as a black box that might be harvesting your data. Always check the Chrome Web Store for recent updates; if an extension hasn’t been patched in six months, it’s likely to break the moment Google tweaks its DOM structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  The IP Reputation Trap
&lt;/h3&gt;

&lt;p&gt;Most free tools suffer from a fatal flaw: they perform requests from your local machine. Because you lack proxy rotation, Google flags your home or office IP address almost instantly. Once you hit the threshold of roughly 20–50 requests, expect a wall of CAPTCHAs. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local Execution:&lt;/strong&gt; Your IP is your identity. Once flagged, your productivity drops to zero.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tab Lifecycle:&lt;/strong&gt; Most of these tools require an active tab, killing any chance at background automation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DOM Instability:&lt;/strong&gt; Without active maintenance, these tools return null values as soon as the SERP layout shifts.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Export Quality and Data Hygiene
&lt;/h3&gt;

&lt;p&gt;A tool is only as good as the file it outputs. Top-tier extensions provide clean, CSV-ready exports with consistent columns. Lower-end tools often dump raw HTML or nested JSON, turning a 5-minute task into an hour of data cleansing. Before committing to a plugin, perform a test export. If you find yourself re-mapping columns manually, you are doing it wrong—at that point, it is more efficient to pull data directly via the Google Search Console API.&lt;/p&gt;

&lt;h3&gt;
  
  
  When to Pivot to APIs
&lt;/h3&gt;

&lt;p&gt;The "extension ceiling" is real. Once you need to track more than 50 keywords daily, manual extraction becomes a bottleneck. APIs, such as &lt;strong&gt;SerpApi&lt;/strong&gt;, abstract away the headaches of proxy management and CAPTCHA solving. You aren't just paying for the data; you are paying for the reliability of a managed infrastructure.&lt;/p&gt;

&lt;p&gt;If you have the dev bandwidth, self-hosted solutions like &lt;strong&gt;SerpBear&lt;/strong&gt; are an excellent middle ground. They give you total control over your own proxies and scraping logic without the recurring cost of an enterprise API. However, be prepared to maintain your own code; if Google updates its structure, your server-side script will stop working until you fix it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ethical Extraction
&lt;/h3&gt;

&lt;p&gt;Regardless of the method, stay within the lines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Public Data Only:&lt;/strong&gt; Focus on rank positions, meta descriptions, and snippets. Never target private profiles or behind-login content.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Rate Limiting:&lt;/strong&gt; Even if you use a script, be a good netizen. Excessive requests can be seen as a minor DDoS attempt, which is both unethical and a quick way to get your proxy pool burned.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your growth depends on consistent, high-quality data, save yourself the frustration of manual browser-based tools. Move to an API-first approach or a well-maintained, self-hosted instance to ensure your data pipeline stays stable as your SEO projects scale.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/best-free-serp-scraper-chrome-extensions-for-2026" rel="noopener noreferrer"&gt;Best free serp scraper chrome extensions for 2026&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to export Google Search Console API data to Google Sheets</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Fri, 28 Aug 2026 07:13:15 +0000</pubDate>
      <link>https://dev.to/serpapiorg/how-to-export-google-search-console-api-data-to-google-sheets-583j</link>
      <guid>https://dev.to/serpapiorg/how-to-export-google-search-console-api-data-to-google-sheets-583j</guid>
      <description>&lt;p&gt;There have been countless times I've found myself stuck on a Friday afternoon, painstakingly copying data from Google Search Console in 1,000-row increments. It was always frustrating to realize that crucial performance trends, especially for those long-tail keywords, were hidden in the data I couldn't access due to these limitations. The standard export is simply not built for comprehensive analysis.&lt;/p&gt;

&lt;p&gt;This is why I started looking for a way to get more data. By connecting directly to the Google Search Console API, we can overcome these restrictions and pull significantly larger data sets. This approach has been a game-changer for my workflow, allowing me to automate data collection and gain deeper insights without manual intervention.&lt;/p&gt;

&lt;h3&gt;
  
  
  Unlocking More Data
&lt;/h3&gt;

&lt;p&gt;The 1,000-row limit in the standard export interface is a major bottleneck. It forces teams to work with incomplete datasets, leading to potential blind spots in understanding site performance. The Search Console API, however, allows programmatic requests for up to 25,000 rows in a single call. This unlocks access to a much richer set of site performance metrics that are simply unavailable through the dashboard.&lt;/p&gt;

&lt;p&gt;For sites with thousands of landing pages, relying solely on UI exports creates significant gaps in tracking content performance. This often leads to inaccurate SEO audits because the long-tail data is missing. The API acts as a powerful, free alternative to paid rank tracking tools, providing actual click and impression data rather than relying on estimations.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Standard UI Export&lt;/th&gt;
&lt;th&gt;Search Console API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Row limit/request&lt;/td&gt;
&lt;td&gt;1,000 rows&lt;/td&gt;
&lt;td&gt;25,000 rows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Automation level&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Programmable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data access&lt;/td&gt;
&lt;td&gt;Sampled/Limited&lt;/td&gt;
&lt;td&gt;Raw/Comprehensive&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Initial Setup: Google Cloud Project
&lt;/h3&gt;

&lt;p&gt;To begin, you'll need a Google Cloud project. This is where you'll enable the Search Console API and set up the necessary credentials for your scripts.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Create a Project:&lt;/strong&gt; Go to the Google Cloud Console and select 'Create Project'.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Enable API:&lt;/strong&gt; Search for 'Google Search Console API' in the API Library and enable it.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;OAuth Consent Screen:&lt;/strong&gt; Configure the consent screen with your email and an application name.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Create Credentials:&lt;/strong&gt; Choose either 'OAuth client ID' or a 'Service Account' for authentication. For automated scripts, a service account is generally preferred.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A common stumbling block here is the complexity of OAuth flows. For this specific use case, you primarily need read-only access to the Search Console property you want to query. If the Cloud Console interface feels overwhelming initially, simply enabling the API is a good first step. You can refine scopes later as you become more familiar with Google's API ecosystem.&lt;/p&gt;

&lt;h3&gt;
  
  
  Scripting the Connection: Google Apps Script
&lt;/h3&gt;

&lt;p&gt;The core of this process involves using Google Apps Script to interact with the Search Console API. This script will query the &lt;code&gt;searchAnalytics.query&lt;/code&gt; method to pull data directly into your Google Sheet.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Open Apps Script:&lt;/strong&gt; In a new Google Sheet, go to 'Extensions' &amp;gt; 'Apps Script'.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Add API Service:&lt;/strong&gt; Paste the GSC API service library code into the editor.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Define Parameters:&lt;/strong&gt; Set your &lt;code&gt;startDate&lt;/code&gt; and &lt;code&gt;endDate&lt;/code&gt; within the main function.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Set Row Limit:&lt;/strong&gt; Crucially, set the &lt;code&gt;rowLimit&lt;/code&gt; parameter to 25,000.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Run and Authorize:&lt;/strong&gt; Execute the function and authorize the script to access your Search Console data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ensure your script has the correct authentication scopes enabled, specifically 'readonly' access for the Search Console API. Debugging often involves verifying that your JSON request structure aligns with the API's current requirements, as these can be updated by Google.&lt;/p&gt;

&lt;h3&gt;
  
  
  Handling Script Timeouts
&lt;/h3&gt;

&lt;p&gt;Google Apps Script has a six-minute execution limit per trigger. For large datasets, this can cause scripts to fail. The solution is to implement pagination.&lt;/p&gt;

&lt;p&gt;Instead of requesting all 25,000 rows at once, break the request into smaller chunks. The &lt;code&gt;startRow&lt;/code&gt; parameter is key here. By incrementing &lt;code&gt;startRow&lt;/code&gt; in a loop, you can fetch data in manageable segments (e.g., 5,000 rows per request) that complete within the time limit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Example of pagination logic&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;startRow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;rowLimit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Smaller chunks for pagination&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;totalRowsRequested&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;maxRows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;25000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Your desired total&lt;/span&gt;

&lt;span class="k"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;totalRowsRequested&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nx"&gt;maxRows&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;startDate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YYYY-MM-DD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;endDate&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YYYY-MM-DD&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dimensions&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;date,query&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;startRow&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;startRow&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;rowLimit&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;rowLimit&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="c1"&gt;// ... make API call with query ...&lt;/span&gt;
  &lt;span class="c1"&gt;// ... process results ...&lt;/span&gt;
  &lt;span class="nx"&gt;totalRowsRequested&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;startRow&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;rowLimit&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This modular approach ensures script stability, even with API latency. I usually add logging to track progress and identify which specific page might fail if a network issue occurs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Automating Data Refreshes
&lt;/h3&gt;

&lt;p&gt;To keep your reports up-to-date, set up time-driven triggers in Apps Script.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Open Triggers:&lt;/strong&gt; Navigate to the 'Triggers' tab in the Apps Script dashboard.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Add Trigger:&lt;/strong&gt; Click '+ Add Trigger', select your main function, and choose 'Time-driven' as the event source.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Set Schedule:&lt;/strong&gt; Select your preferred interval (e.g., 'Week timer' or 'Month timer').&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Automating this process removes the manual labor from reporting, ensuring your team always has current data for meetings and analysis.&lt;/p&gt;

&lt;h3&gt;
  
  
  When Sheets Isn't Enough
&lt;/h3&gt;

&lt;p&gt;While Google Sheets is excellent for many use cases, it can become slow with hundreds of thousands of rows. For very large historical datasets, consider migrating to BigQuery. It offers superior performance for querying massive amounts of data using SQL.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Google Sheets&lt;/th&gt;
&lt;th&gt;BigQuery&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Storage limit&lt;/td&gt;
&lt;td&gt;~10 million cells&lt;/td&gt;
&lt;td&gt;Petabytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Calculation speed&lt;/td&gt;
&lt;td&gt;Slow with large sets&lt;/td&gt;
&lt;td&gt;High-speed SQL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Low (Visual)&lt;/td&gt;
&lt;td&gt;High (SQL)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If your sheet starts lagging significantly (often around the 50,000-row mark), it's a signal that your data storage layer needs an upgrade. BigQuery enables much more sophisticated time-series analysis for sites generating millions of impressions.&lt;/p&gt;

&lt;p&gt;By leveraging the GSC API and Apps Script, you can bypass the export limitations, automate your data collection, and gain a comprehensive view of your search performance. This is essential for serious SEO work in today's landscape. If you're ready to move beyond manual exports, start by setting up your Google Cloud project and experimenting with these scripts.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/how-to-export-google-search-console-api-data-to-google-sheets" rel="noopener noreferrer"&gt;How to export Google Search Console API data to Google Sheets&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to scrape google maps reviews api without getting banned</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Thu, 27 Aug 2026 11:11:14 +0000</pubDate>
      <link>https://dev.to/serpapiorg/how-to-scrape-google-maps-reviews-api-without-getting-banned-54jp</link>
      <guid>https://dev.to/serpapiorg/how-to-scrape-google-maps-reviews-api-without-getting-banned-54jp</guid>
      <description>&lt;p&gt;Many developers eventually hit a wall when they realize the official Google Places API is designed for UI display, not data science. Limiting output to the five most relevant reviews makes it fundamentally useless for sentiment analysis or large-scale historical tracking. If you’ve spent hours writing scripts only to have them break after a minor UI update, you know exactly what I mean by the "maintenance tax."&lt;/p&gt;

&lt;h3&gt;
  
  
  Stop Parsing HTML
&lt;/h3&gt;

&lt;p&gt;If you are still using tools like Selenium or Playwright to target CSS classes, your project is a maintenance nightmare. Google’s front-end is constantly A/B tested, meaning your brittle selectors will fail sooner or later.&lt;/p&gt;

&lt;p&gt;Instead, shift your strategy to intercepting the internal API calls. By inspecting the Network tab in your browser and filtering by XHR requests, you can often find structured data being transmitted via Protobuf. This is essentially serialized JSON—it is significantly more stable, requires less CPU than a headless browser, and doesn’t break every time a pixel moves on the page.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Proxy and Fingerprint Reality
&lt;/h3&gt;

&lt;p&gt;Even with stable endpoints, you cannot ignore the infrastructure required to bypass anti-bot triggers. Google tracks request velocity and browser fingerprints with high precision. If you’re using datacenter proxies, you’ll be flagged almost instantly. &lt;/p&gt;

&lt;p&gt;To stay under the radar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Use Residential Proxies:&lt;/strong&gt; These route traffic through actual home connections, making your requests indistinguishable from a standard user.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Mimic Human Behavior:&lt;/strong&gt; Never hammer the server. Implement intelligent delays and ensure your request headers are randomized but consistent with a real device fingerprint.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Error Handling:&lt;/strong&gt; Expect to be challenged. Your pipeline must include robust retries and a back-off strategy that honors 429 status codes.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build vs. Buy: The Hidden Cost
&lt;/h3&gt;

&lt;p&gt;If your project requires collecting thousands of reviews regularly, the "DIY" route often becomes more expensive than a managed solution. Between maintaining proxy pools, handling CAPTCHA solvers, and fixing broken parsers, you are effectively paying your engineers a premium to do infrastructure work rather than product development.&lt;/p&gt;

&lt;p&gt;If you don't have a dedicated DevOps team, relying on specialized third-party scraping APIs is usually the most efficient path. They absorb the cost of maintenance, keeping your pipeline green while you focus on the actual business intelligence.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data Integrity at Scale
&lt;/h3&gt;

&lt;p&gt;When you start pulling large volumes of data, your database needs to be ready. I always recommend hashing the review ID or a combination of the author ID and timestamp before insertion. &lt;/p&gt;

&lt;p&gt;Use a NoSQL approach to store the entire JSON object from the Protobuf response. This keeps your data hierarchical and avoids the performance bottlenecks of complex joins in relational databases. Always perform an "upsert" based on the hash to keep your dataset clean and prevent duplicates as you scrape historical data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ethical Considerations
&lt;/h3&gt;

&lt;p&gt;Remember that while public data is technically accessible, scraping still often skirts the edge of terms of service. Always respect &lt;code&gt;robots.txt&lt;/code&gt; where possible, avoid high-frequency spikes that degrade user experience, and consult your legal team regarding your specific use case.&lt;/p&gt;

&lt;p&gt;Moving away from fragile headless browsers toward structured endpoint extraction is the only way to build a pipeline that survives long-term. Focus on the analysis, not the maintenance.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/how-to-scrape-google-maps-reviews-api-without-getting-banned" rel="noopener noreferrer"&gt;How to scrape google maps reviews api without getting banned&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to scrape google search results using python with stealth</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Wed, 26 Aug 2026 06:03:13 +0000</pubDate>
      <link>https://dev.to/serpapiorg/how-to-scrape-google-search-results-using-python-with-stealth-5cc9</link>
      <guid>https://dev.to/serpapiorg/how-to-scrape-google-search-results-using-python-with-stealth-5cc9</guid>
      <description>&lt;p&gt;Many developers rely on basic setups with &lt;code&gt;BeautifulSoup&lt;/code&gt; and random &lt;code&gt;User-Agents&lt;/code&gt;, assuming this is enough to navigate modern search engine protections. After a decade in the industry, I have learned that this approach is rarely sufficient. Between TLS fingerprinting and HTTP/2 handshakes, basic scripts are flagged almost instantly.&lt;/p&gt;

&lt;p&gt;Here is a breakdown of how to build a robust, production-grade search data pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Modern Tech Stack
&lt;/h3&gt;

&lt;p&gt;Stop using &lt;code&gt;requests&lt;/code&gt; and &lt;code&gt;BeautifulSoup&lt;/code&gt;. They are too slow and easily detected.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Use &lt;code&gt;httpx&lt;/code&gt; for HTTP/2:&lt;/strong&gt; Modern security engines analyze your TLS handshake. &lt;code&gt;httpx&lt;/code&gt; supports HTTP/2, which allows you to multiplex requests and match the connection signature of a legitimate browser, reducing the likelihood of being blocked.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Switch to XPath:&lt;/strong&gt; CSS selectors are fragile because Google frequently updates class names during A/B tests. &lt;code&gt;parsel&lt;/code&gt; with XPath targeting structural elements—like &lt;code&gt;//h3&lt;/code&gt; or specific semantic containers—is much more resilient than brittle CSS selectors.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Asynchronous Processing:&lt;/strong&gt; Use &lt;code&gt;asyncio&lt;/code&gt; to fetch results in parallel. This significantly increases throughput while keeping your footprint low.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Handling Detection and Evasion
&lt;/h3&gt;

&lt;p&gt;The most common reason for failure is a mismatch between your headers and your TLS signature.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;TLS Fingerprinting:&lt;/strong&gt; Security systems look for a "JA3 signature." If you declare a Chrome &lt;code&gt;User-Agent&lt;/code&gt; but the handshake indicates a Python &lt;code&gt;urllib&lt;/code&gt; client, you will get hit with a CAPTCHA. Ensure your client negotiates ciphers that align with the browser version you are spoofing.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Residential Proxies:&lt;/strong&gt; Datacenter IPs are often blacklisted entirely. Use a rotating pool of residential proxies. These IPs route your traffic through legitimate consumer ISP nodes, making your requests indistinguishable from real users.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Managing Scale
&lt;/h3&gt;

&lt;p&gt;If your project requires high-volume data (e.g., thousands of keywords per day), maintaining your own infrastructure becomes a burden. You will spend more time fixing broken parsers and managing proxy bans than actually analyzing data.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Self-Built Approach&lt;/th&gt;
&lt;th&gt;Managed Service (e.g., SerpApi)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Constant (fix broken XPaths)&lt;/td&gt;
&lt;td&gt;Zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CAPTHCAs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You must solve them&lt;/td&gt;
&lt;td&gt;Handled automatically&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Raw HTML (requires parsing)&lt;/td&gt;
&lt;td&gt;Clean, structured JSON&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Proxy fees + DevOps hours&lt;/td&gt;
&lt;td&gt;Predictable usage-based pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  When to Use Headless Browsers
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Playwright&lt;/code&gt; with the &lt;code&gt;stealth&lt;/code&gt; plugin is powerful, but use it sparingly. It is necessary for capturing dynamic content like Maps or "People Also Ask" sections that rely on JavaScript execution. However, it is resource-intensive, consuming roughly 150MB of RAM per instance. Use standard &lt;code&gt;httpx&lt;/code&gt; requests for static SERPs and save &lt;code&gt;Playwright&lt;/code&gt; for complex, interactive components.&lt;/p&gt;

&lt;h3&gt;
  
  
  Final Takeaway
&lt;/h3&gt;

&lt;p&gt;For small-scale experiments, a custom &lt;code&gt;httpx&lt;/code&gt; + &lt;code&gt;parsel&lt;/code&gt; setup is excellent. However, as your volume grows, the overhead of proxy rotation and infrastructure maintenance becomes a liability. If you find yourself spending more than a few hours a week patching your scraper, it is time to shift to a managed API. This lets you focus on building features rather than fighting search engine security.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/how-to-scrape-google-search-results-using-python-with-stealth" rel="noopener noreferrer"&gt;How to scrape google search results using python with stealth&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to get a google news api key free</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Tue, 25 Aug 2026 11:51:20 +0000</pubDate>
      <link>https://dev.to/serpapiorg/how-to-get-a-google-news-api-key-free-1am3</link>
      <guid>https://dev.to/serpapiorg/how-to-get-a-google-news-api-key-free-1am3</guid>
      <description>&lt;p&gt;If you've ever tried to integrate live news streams into your application, you've likely hit a wall: the official Google News API was deprecated back in 2011. During my early days building news aggregators, I wasted hours trying to authenticate against dead legacy endpoints. &lt;/p&gt;

&lt;p&gt;Fortunately, you don't need an official first-party key to fetch real-time search trends. Here are the three most reliable, free workarounds I use in production today.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Programmatic RSS Parsing (No Auth)
&lt;/h3&gt;

&lt;p&gt;The fastest way to get started without handling API keys is querying Google’s public RSS endpoints. By targeting &lt;code&gt;news.google.com/rss&lt;/code&gt; with specific URL-encoded parameters, you can stream real-time headlines directly.&lt;/p&gt;

&lt;p&gt;Here is a quick Python setup using &lt;code&gt;feedparser&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;feedparser&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.parse&lt;/span&gt;

&lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;quote_plus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;artificial intelligence&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# hl: language, gl: region, q: search query
&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://news.google.com/rss/search?q=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;&amp;amp;hl=en-US&amp;amp;gl=US&amp;amp;ceid=US:en&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="n"&gt;feed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;feedparser&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rss_url&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;feed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;entries&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Title: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Link: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Pros:&lt;/strong&gt; Unlimited queries, zero authentication.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cons:&lt;/strong&gt; No rich metadata (e.g., full-text body or lead images), and Google occasionally shifts XML schema structures, which can break manual parsers.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Google Custom Search Engine (CSE) with a Domain Filter
&lt;/h3&gt;

&lt;p&gt;If you need native JSON but want to stay within the Google ecosystem, you can use the Custom Search JSON API. Google provides 100 free queries per day.&lt;/p&gt;

&lt;p&gt;To make this act like a dedicated news engine:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Programmable Search Engine in your Google Cloud Console.&lt;/li&gt;
&lt;li&gt;Restrict the search scope to authoritative news domains (e.g., &lt;code&gt;reuters.com&lt;/code&gt;, &lt;code&gt;apnews.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Generate a free API key from the Google developer credentials dashboard.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While this approach works great for hobby projects, that 100-query daily limit is a hard ceiling that you'll quickly hit in production.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Managed SERP APIs (e.g., SerpApi)
&lt;/h3&gt;

&lt;p&gt;When I build micro-SaaS MVPs that require structural stability without the headache of rotating proxies or managing broken HTML scrapers, I offload the parsing to third-party SERP providers.&lt;/p&gt;

&lt;p&gt;For instance, &lt;a href="https://serpapi.org" rel="noopener noreferrer"&gt;SerpApi&lt;/a&gt; offers a free tier of 100 searches per month with no credit card required. It returns clean, structured JSON:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"news_results"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tech giants announce new open-source models..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"link"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://example-news-outlet.com/article"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Tech News"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"date"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2 hours ago"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This completely decouples your application code from Google's front-end layout changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pro-Tip: Optimize with Time Filters
&lt;/h3&gt;

&lt;p&gt;To maximize efficiency and keep your data payloads lightweight under free limits, utilize Google's time-filtering &lt;code&gt;tbs&lt;/code&gt; parameters in your queries:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tbs=qdr:h&lt;/code&gt; (Past hour)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tbs=qdr:d&lt;/code&gt; (Past 24 hours)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;tbs=qdr:w&lt;/code&gt; (Past week)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By targeting narrow time windows, you avoid processing duplicate historical data and keep your pipelines highly optimized.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quick Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Free Limit&lt;/th&gt;
&lt;th&gt;Auth Required&lt;/th&gt;
&lt;th&gt;Output Format&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google RSS&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;High (soft IP limits)&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;Rapid prototyping, personal scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google CSE&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 queries/day&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Low-volume, domain-restricted queries&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;SerpApi&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 queries/month&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;JSON&lt;/td&gt;
&lt;td&gt;Production MVPs, zero-maintenance pipelines&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/how-to-get-a-google-news-api-key-free" rel="noopener noreferrer"&gt;How to get a google news api key free&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to use Google Search API for free without billing fears</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Mon, 24 Aug 2026 04:14:17 +0000</pubDate>
      <link>https://dev.to/serpapiorg/how-to-use-google-search-api-for-free-without-billing-fears-529l</link>
      <guid>https://dev.to/serpapiorg/how-to-use-google-search-api-for-free-without-billing-fears-529l</guid>
      <description>&lt;p&gt;Many developers steer clear of Google Cloud simply because they fear an accidental credit card charge. However, when it comes to the Custom Search JSON API, the fear is largely misplaced. You can integrate search data into your projects without ever touching the billing section, thanks to a hard-coded limit that stops the service once your quota is exhausted.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why the risk is non-existent
&lt;/h3&gt;

&lt;p&gt;The service provides a permanent, daily allowance of 100 queries. This is not a trial; it is a fixed tier that resets every day at midnight Pacific Standard Time (PST). If your application hits request number 101, the API returns a &lt;code&gt;403 Forbidden&lt;/code&gt; error. Because the service effectively shuts down, there is no mechanism to trigger a payment. Simply put: if you don’t attach a credit card, you cannot be billed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting started safely
&lt;/h3&gt;

&lt;p&gt;To configure this, follow these three essential steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Create a Programmable Search Engine:&lt;/strong&gt; Visit the dashboard and toggle "Search the entire web" to &lt;strong&gt;ON&lt;/strong&gt;. This generates your CX identifier. Skipping this step often leads to empty JSON responses, which wastes your precious daily quota.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Generate a Restricted API Key:&lt;/strong&gt; Within the Google Cloud Console, enable the Custom Search API. &lt;strong&gt;Crucial:&lt;/strong&gt; Apply HTTP referrers or IP restrictions immediately. Without these, a leaked key allows others to exhaust your daily quota in seconds.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Secure your credentials:&lt;/strong&gt; Never commit keys to version control. Use &lt;code&gt;.env&lt;/code&gt; files or secret management tools to ensure your tokens remain local.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Implementation best practices
&lt;/h3&gt;

&lt;p&gt;When parsing results in Python or your language of choice, always treat the incoming JSON as untrusted input. If a query yields zero results, the &lt;code&gt;items&lt;/code&gt; key might be missing. Always include a safety check before iterating through the result set:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Example of a safe check
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;items&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;link&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;No results found or quota exceeded.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pro-tips for stable integrations
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Handle 429 Errors:&lt;/strong&gt; Implement exponential backoff in your code. This prevents your app from hammering the API if you encounter temporary rate limits.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Design for Failure:&lt;/strong&gt; Since the limit is rigid, your UI should gracefully handle "quota exceeded" states. Don't assume you will always have access to 100 results.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Monitor Usage:&lt;/strong&gt; Keep an eye on the Google Cloud Dashboard. If you find yourself hitting the 100-query mark daily, consider setting up automated alerts to notify you when you reach 80% usage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Scaling beyond the limit
&lt;/h3&gt;

&lt;p&gt;When your project outgrows the 100-query limit, you have two primary paths. If you want to maintain control and avoid costs, self-hosting a &lt;strong&gt;SearxNG&lt;/strong&gt; instance offers unlimited, private search results, though it requires maintaining your own server infrastructure. &lt;/p&gt;

&lt;p&gt;Alternatively, if you need structured data at scale without the headache of managing proxies or search engine responses, dedicated providers like SerpApi offer robust developer tiers. They handle the infrastructure, letting you focus on the logic of your application rather than troubleshooting request overhead. &lt;/p&gt;

&lt;p&gt;By keeping your project separate from the billing portal and applying strict API restrictions, you can leverage Google’s search index as a powerful tool in your tech stack without any financial anxiety.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/how-to-use-google-search-api-for-free-without-billing-fears" rel="noopener noreferrer"&gt;How to use Google Search API for free without billing fears&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Free news api key no credit card required: 2026 developer list</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Sun, 23 Aug 2026 03:26:15 +0000</pubDate>
      <link>https://dev.to/serpapiorg/free-news-api-key-no-credit-card-required-2026-developer-list-38ca</link>
      <guid>https://dev.to/serpapiorg/free-news-api-key-no-credit-card-required-2026-developer-list-38ca</guid>
      <description>&lt;p&gt;As someone who has spent years building data-driven side projects, I have learned one hard truth: adding a payment method just to test an endpoint is a developer’s nightmare. You need reliable pipelines, not a ticking clock toward an unexpected monthly charge.&lt;/p&gt;

&lt;p&gt;Finding data sources that respect a "zero-friction" workflow is essential for rapid prototyping. Here is my breakdown of reliable options that provide access without demanding credit card details at signup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Top Picks for Frictionless Integration
&lt;/h3&gt;

&lt;p&gt;These providers are my go-to choices because they prioritize accessibility, requiring only an email verification to get started.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API&lt;/th&gt;
&lt;th&gt;Daily Limit&lt;/th&gt;
&lt;th&gt;Best Use Case&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;NewsAPI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 requests&lt;/td&gt;
&lt;td&gt;Rapid prototyping and quick tests.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GNews&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 requests&lt;/td&gt;
&lt;td&gt;Learning and parsing JSON structures.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MediaStack&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 requests&lt;/td&gt;
&lt;td&gt;Standard, reliable headline feeds.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  My Workflow for Evaluating "Free" Tiers
&lt;/h3&gt;

&lt;p&gt;I have been burned before, so I follow a strict checklist to avoid "predatory" trials.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;The Billing Trap:&lt;/strong&gt; If a signup form asks for a credit card or billing address, it is a &lt;strong&gt;trial&lt;/strong&gt;, not a permanent free tier. Avoid these if you want to prevent surprise charges.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Dashboard Audits:&lt;/strong&gt; Even with no card attached, I check my account settings quarterly. Business models change; verify that your plan hasn't been migrated to a time-limited status.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Handling 429 Errors:&lt;/strong&gt; Most free tiers cap you at 100–500 requests per day. When you hit the limit, you will receive a &lt;code&gt;429 Too Many Requests&lt;/code&gt; status code. My advice? Implement &lt;strong&gt;exponential backoff&lt;/strong&gt; in your client-side code. It keeps your app from crashing and makes you a "good citizen" of their infrastructure.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Monitor Headers:&lt;/strong&gt; Keep an eye on the &lt;code&gt;X-RateLimit-Remaining&lt;/code&gt; header in the API response. You can use this to programmatically disable UI components before you hit your limit.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Security First: Protect Your Keys
&lt;/h3&gt;

&lt;p&gt;Never hardcode keys into your repository. I use &lt;code&gt;.env&lt;/code&gt; files locally and environment variables on my servers. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Frontend warning:&lt;/strong&gt; If you are building a SPA (Single Page Application), &lt;strong&gt;never&lt;/strong&gt; expose your key in the browser. Always route your calls through a lightweight backend proxy. If your key leaks, the provider might flag your account, and you will lose access.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  When Should You Pivot?
&lt;/h3&gt;

&lt;p&gt;These options are perfect for students or hobbyists, but they have ceilings. If you expect more than 3,000 calls per month, require historical data, or need high-concurrency for a production app, you will eventually outgrow these tiers.&lt;/p&gt;

&lt;p&gt;In those cases, I recommend building your architecture in a modular way. Keep your API-calling logic separate from your business logic so that you can swap providers without refactoring your entire codebase. &lt;/p&gt;

&lt;p&gt;If you are looking for a more robust, scalable solution for your production-grade data needs, I suggest looking into &lt;strong&gt;SerpApi&lt;/strong&gt;. It is built with a developer-first mindset and handles the complexities of data collection, allowing you to focus on building features rather than managing rate limits or infrastructure.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/free-news-api-key-no-credit-card-required-2026-developer-list" rel="noopener noreferrer"&gt;Free news api key no credit card required: 2026 developer list&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Scrape google search results python github: Resilient 2026 guide</title>
      <dc:creator>SerpApi.Org</dc:creator>
      <pubDate>Sat, 22 Aug 2026 07:50:38 +0000</pubDate>
      <link>https://dev.to/serpapiorg/scrape-google-search-results-python-github-resilient-2026-guide-3330</link>
      <guid>https://dev.to/serpapiorg/scrape-google-search-results-python-github-resilient-2026-guide-3330</guid>
      <description>&lt;p&gt;Having spent years maintaining data extraction pipelines, I’ve learned a hard truth: if your web scraper relies on class names to parse search engine results, it is already broken. Google dynamically updates and randomizes its HTML layout selectors. If you clone an open-source Python scraper from GitHub, chances are it will throw null-pointer errors within weeks of deployment.&lt;/p&gt;

&lt;p&gt;To build a truly resilient pipeline, you need to shift from scraping visual layers to targeting underlying structured data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bypassing CSS with JSON-LD Extraction
&lt;/h3&gt;

&lt;p&gt;Instead of targeting fragile CSS selectors, target the raw structured data embedded directly within the page source. Google relies on structured JSON-LD schemas to populate its rich snippets and knowledge graphs. This metadata resides inside script tags of type &lt;code&gt;application/ld+json&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Because this data feeds search engine engines, the keys stay consistent even when CSS classes change daily. Here is how I structure selector-free extraction in Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;bs4&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BeautifulSoup&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;extract_search_metadata&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html_content&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;soup&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BeautifulSoup&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;html_content&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;html.parser&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;scripts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;soup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;script&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;application/ld+json&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;extracted_data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;scripts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="c1"&gt;# Traverse the schema dictionary to find search result payloads
&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;itemListElement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;extracted_data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;itemListElement&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="nf"&gt;except &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;TypeError&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;extracted_data&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This approach shifts your code's maintenance cycle from weekly emergency hotfixes to simple, bi-annual structure audits.&lt;/p&gt;

&lt;h3&gt;
  
  
  Simulating Human Behavior with Playwright
&lt;/h3&gt;

&lt;p&gt;When dynamic search elements (like interactive maps or local listings) are required, static HTML parses are insufficient. I use Playwright to run headless browser sessions. However, modern anti-bot systems check for automated signatures.&lt;/p&gt;

&lt;p&gt;To execute successfully:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Remove Automation Indicators:&lt;/strong&gt; Disable the &lt;code&gt;navigator.webdriver&lt;/code&gt; flag inside your browser context.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Implement Micro-Scrolls:&lt;/strong&gt; Simulate human reading patterns by scrolling the page down in small, randomized pixel increments.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;De-synchronize Events:&lt;/strong&gt; Introduce randomized delays between 800ms and 2400ms before clicks or viewport changes.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Overcoming IP Bans and CAPTCHAs
&lt;/h3&gt;

&lt;p&gt;Running automation from standard hosting servers or GitHub Actions default runner IPs will trigger immediate blockages. Datacenter IP ranges are heavily monitored.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Utilize Rotating Residential Proxies:&lt;/strong&gt; These route requests through real consumer ISPs, maintaining a 98%+ success rate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rotate User-Agents Dynamically:&lt;/strong&gt; Match your rotated IPs with updated browser headers representing modern, active operating systems.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Exponential Backoff:&lt;/strong&gt; If your pipeline encounters a 429 rate limit, dynamically double the execution delay before retrying with a fresh IP address.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Build vs. Buy: The Technical Trade-off
&lt;/h3&gt;

&lt;p&gt;Building custom scraping infrastructure is a rewarding challenge, but scale changes the financial equation. When you calculate developer wages spent on maintaining code, premium residential proxy bandwidth, and running dynamic headless browsers, self-hosting can become incredibly expensive.&lt;/p&gt;

&lt;p&gt;For mission-critical production data, leveraging a managed JSON endpoint like SerpApi is often the more efficient engineering decision. It completely abstracts browser automation, IP pool rotation, and DOM changes, allowing you to focus on processing data rather than acquiring it.&lt;/p&gt;




&lt;p&gt;Originally published at &lt;a href="https://serpapi.org/posts/scrape-google-search-results-python-github-resilient-2026-guide" rel="noopener noreferrer"&gt;Scrape google search results python github: Resilient 2026 guide&lt;/a&gt;&lt;/p&gt;

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