<?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: g4dr</title>
    <description>The latest articles on DEV Community by g4dr (@g4dr).</description>
    <link>https://dev.to/g4dr</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%2F4195058%2Ff5fe3ffd-7f8e-48a2-9c37-7a45413e3066.png</url>
      <title>DEV Community: g4dr</title>
      <link>https://dev.to/g4dr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/g4dr"/>
    <language>en</language>
    <item>
      <title>Scrape Kalshi Prediction Markets: Odds, Volume and Weather Data via API</title>
      <dc:creator>g4dr</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:33:00 +0000</pubDate>
      <link>https://dev.to/g4dr/scrape-kalshi-prediction-markets-odds-volume-and-weather-data-via-api-1fdc</link>
      <guid>https://dev.to/g4dr/scrape-kalshi-prediction-markets-odds-volume-and-weather-data-via-api-1fdc</guid>
      <description>&lt;p&gt;Kalshi is the regulated US prediction market — election odds, Fed decisions, economic prints, even &lt;strong&gt;weather markets&lt;/strong&gt;. Its public API exists but is rate-limited and awkward for bulk history. This tutorial shows the Apify-actor pipeline: markets, order books, and cross-platform arbitrage with Polymarket.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 &lt;strong&gt;Try it live&lt;/strong&gt; — chat with a Poe bot that generates the exact pipeline for your use case: &lt;a href="https://poe.com/leadlistgenerator" rel="noopener noreferrer"&gt;Lead List Generator&lt;/a&gt; · &lt;a href="https://poe.com/jobpostingsminer" rel="noopener noreferrer"&gt;Job Postings Miner&lt;/a&gt; · &lt;a href="https://poe.com/amazonproductminer" rel="noopener noreferrer"&gt;Amazon Product Miner&lt;/a&gt; · &lt;a href="https://poe.com/serpranktracker" rel="noopener noreferrer"&gt;SERP Rank Tracker&lt;/a&gt; · &lt;a href="https://poe.com/socialleadfinder" rel="noopener noreferrer"&gt;Social Lead Finder&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;&lt;/strong&gt; — Kalshi actors for markets, odds, volume, profiles. Free monthly credits included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; — 20 lines to a live odds feed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 — Get your API token
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Create an Apify account&lt;/a&gt; (free credits included)&lt;/li&gt;
&lt;li&gt;Console → Settings → Integrations → copy your API token&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export APIFY_TOKEN=your_token&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2 — Pull market data
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/scrapemint~kalshi-prediction-market-scraper/run-sync-get-dataset-items?token=&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"category": "economics", "maxItems": 100}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fields per market: &lt;code&gt;ticker&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;yesPrice&lt;/code&gt;, &lt;code&gt;noPrice&lt;/code&gt;, &lt;code&gt;volume&lt;/code&gt;, &lt;code&gt;openInterest&lt;/code&gt;, &lt;code&gt;closeTime&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Build an odds feed
&lt;/h2&gt;



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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scrapemint/kalshi-prediction-market-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&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;category&lt;/span&gt;&lt;span class="sh"&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;economics&lt;/span&gt;&lt;span class="sh"&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;maxItems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&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;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;yes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yesPrice&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="mi"&gt;0&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="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; YES=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;yes&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mf"&gt;4.2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; vol=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;m&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="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;volume&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Schedule it in Apify Console → snapshots → price-movement alerts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The arbitrage angle
&lt;/h2&gt;

&lt;p&gt;Kalshi and Polymarket price the same events — differently. &lt;a href="https://apify.com/congism/polymarket-kalshi-arb-finder" rel="noopener noreferrer"&gt;&lt;code&gt;congism/polymarket-kalshi-arb-finder&lt;/code&gt;&lt;/a&gt; (835 users) does the cross-platform matching and flags YES+NO &amp;lt; $1.00 pairs. Both are regulated/legit venues, so the spread is real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Niche gold: weather markets
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://apify.com/bigdavidson/kalshi-weather-markets" rel="noopener noreferrer"&gt;&lt;code&gt;bigdavidson/kalshi-weather-markets&lt;/code&gt;&lt;/a&gt; (282 users) pulls temperature/rain odds per city — energy traders, event insurers, and quants pay for this feed. Build it once, sell the dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful actors
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Actor&lt;/th&gt;
&lt;th&gt;Job&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;scrapemint/kalshi-prediction-market-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Markets + live event odds (115 users)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;congism/polymarket-kalshi-arb-finder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Kalshi↔Polymarket arbitrage pairs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;bigdavidson/kalshi-weather-markets&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Temperature &amp;amp; rain odds API (282 users)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pixflor/kalshi-markets-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Markets, odds, volume, order books&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;saswave/kalshi-profile-scraper&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Trader profile data&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Who uses this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traders&lt;/strong&gt; — arb alerts + order-book snapshots before market-moving events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quants/researchers&lt;/strong&gt; — odds history beats polling data for event probability studies&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data sellers&lt;/strong&gt; — cleaned odds/volume feeds = a sellable product&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automation
&lt;/h2&gt;

&lt;p&gt;Hourly schedule → diff → alert when a market's YES moves &amp;gt;5¢. A few cents a day on &lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;free credits&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  More resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/g4dr/apify-skills" rel="noopener noreferrer"&gt;apify-skills&lt;/a&gt; — Agent Skills so Claude Code / Cursor runs this from a prompt: &lt;code&gt;npx skills add g4dr/apify-skills&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/g4dr/awesome-web-scraping" rel="noopener noreferrer"&gt;awesome-web-scraping&lt;/a&gt; — curated scraping tools and actors&lt;/li&gt;
&lt;li&gt;Related: &lt;a href="https://github.com/g4dr/polymarket-odds-tracker" rel="noopener noreferrer"&gt;polymarket-odds-tracker&lt;/a&gt; — the Polymarket side of the arb pair&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kalshi</category>
      <category>webscraping</category>
      <category>api</category>
      <category>data</category>
    </item>
    <item>
      <title>Scrape Polymarket Odds: Build a Prediction Market Tracker (and Find Arbitrage)</title>
      <dc:creator>g4dr</dc:creator>
      <pubDate>Tue, 20 Oct 2026 13:32:49 +0000</pubDate>
      <link>https://dev.to/g4dr/scrape-polymarket-odds-build-a-prediction-market-tracker-and-find-arbitrage-6hh</link>
      <guid>https://dev.to/g4dr/scrape-polymarket-odds-build-a-prediction-market-tracker-and-find-arbitrage-6hh</guid>
      <description>&lt;p&gt;Prediction markets move billions and their odds are data gold — elections, sports, crypto, weather. Polymarket has an API, but it's rate-limited and incomplete for history and order books. Apify actors fill the gap: live odds, whale trades, and Kalshi-vs-Polymarket arbitrage detection.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 &lt;strong&gt;Try it live&lt;/strong&gt; — free Poe bots that generate the exact pipeline for your use case: &lt;a href="https://poe.com/leadlistgenerator" rel="noopener noreferrer"&gt;Lead List Generator&lt;/a&gt; · &lt;a href="https://poe.com/jobpostingsminer" rel="noopener noreferrer"&gt;Job Postings Miner&lt;/a&gt; · &lt;a href="https://poe.com/amazonproductminer" rel="noopener noreferrer"&gt;Amazon Product Miner&lt;/a&gt; · &lt;a href="https://poe.com/serpranktracker" rel="noopener noreferrer"&gt;SERP Rank Tracker&lt;/a&gt; · &lt;a href="https://poe.com/socialleadfinder" rel="noopener noreferrer"&gt;Social Lead Finder&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;&lt;/strong&gt; — dedicated prediction-market actors, some with 800+ users. Free monthly credits.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; — odds → CSV, alerts, dashboards.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 — Token
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Create an Apify account&lt;/a&gt; → Settings → Integrations → API token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Pull live market odds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/scrapemint~polymarket-market-monitor/run-sync-get-dataset-items?token=&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"category": "politics", "maxItems": 100}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fields per market: &lt;code&gt;question&lt;/code&gt;, &lt;code&gt;outcomes&lt;/code&gt; (YES/NO prices), &lt;code&gt;volume&lt;/code&gt;, &lt;code&gt;liquidity&lt;/code&gt;, &lt;code&gt;endDate&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Detect mispriced markets
&lt;/h2&gt;



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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;scrapemint/polymarket-market-monitor&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&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;category&lt;/span&gt;&lt;span class="sh"&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;crypto&lt;/span&gt;&lt;span class="sh"&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;maxItems&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&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;m&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;prices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;o&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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;o&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;m&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;outcomes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[])]&lt;/span&gt;
    &lt;span class="c1"&gt;# binary market where YES+NO != $1 = inefficiency
&lt;/span&gt;    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;prices&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.03&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;GAP:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;question&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][:&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;| prices:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prices&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;| vol:&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;volume&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;h2&gt;
  
  
  The arb play
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;congism/polymarket-kalshi-arb-finder&lt;/code&gt; (800+ users — the proven demand) compares the same event on both platforms. If Kalshi says YES at $0.52 and Polymarket says NO at $0.45, buying both locks ~3% risk-free. The actor outputs the pairs; you decide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Whale watching
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;jy-labs/polymarket-whale-tracker&lt;/code&gt; surfaces the largest positions — when a wallet that called the last three elections moves $50k, that's a signal worth having before the odds move.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who uses this
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Traders&lt;/strong&gt; — arb alerts, momentum on whale entries.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Journalists/analysts&lt;/strong&gt; — prediction odds beat polls for breaking stories.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data sellers&lt;/strong&gt; — cleaned odds history = a sellable dataset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Schedule the monitor hourly → diff snapshots → odds-movement alerts. Cost: cents.&lt;/p&gt;

&lt;p&gt;More tools: &lt;a href="https://github.com/g4dr/awesome-web-scraping" rel="noopener noreferrer"&gt;awesome-web-scraping&lt;/a&gt;. Skills: &lt;code&gt;npx skills add g4dr/apify-skills&lt;/code&gt; (&lt;a href="https://github.com/g4dr/apify-skills" rel="noopener noreferrer"&gt;repo&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Which markets are you tracking — politics, crypto, or sports?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>polymarket</category>
      <category>webscraping</category>
      <category>crypto</category>
      <category>data</category>
    </item>
    <item>
      <title>Best Web Scraping Tools in 2026: Apify vs Bright Data vs ScraperAPI (Honest Comparison)</title>
      <dc:creator>g4dr</dc:creator>
      <pubDate>Tue, 20 Oct 2026 08:22:09 +0000</pubDate>
      <link>https://dev.to/g4dr/best-web-scraping-tools-in-2026-apify-vs-bright-data-vs-scraperapi-honest-comparison-2pa9</link>
      <guid>https://dev.to/g4dr/best-web-scraping-tools-in-2026-apify-vs-bright-data-vs-scraperapi-honest-comparison-2pa9</guid>
      <description>&lt;p&gt;Picking a scraping platform is a commitment — you'll build pipelines on it, so switching costs real time. After running lead-gen, price-monitoring, and SERP pipelines on all three, here's the honest breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;&lt;/strong&gt; — best all-rounder: 4,000+ ready-made actors, free tier, agent-friendly. Where I'd start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bright Data&lt;/strong&gt; — best raw proxy network and enterprise compliance. Pricier, heavier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ScraperAPI&lt;/strong&gt; — simplest "give me HTML" endpoint. Good for one-off projects, thin on coverage.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; actor marketplace + platform credits. You rent pre-built scrapers ("actors") or run your own on their infra.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;4,000+ maintained actors — Google Maps, Amazon, LinkedIn, Instagram, SERP... someone already built it&lt;/li&gt;
&lt;li&gt;Free tier with monthly credits — genuinely enough to test real pipelines&lt;/li&gt;
&lt;li&gt;Built-in scheduling, datasets, webhooks, proxies included&lt;/li&gt;
&lt;li&gt;Best fit for AI agents — actors are basically APIs with documented inputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Credit pricing can confuse beginners (costs vary per actor)&lt;/li&gt;
&lt;li&gt;Heavy custom crawls need some platform learning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; if you need leads, products, reviews, or SERP data &lt;em&gt;this week&lt;/em&gt;, &lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify's free tier&lt;/a&gt; gets you there fastest. It's what I use for the pipelines below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bright Data
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; premium proxy network + dedicated scraper APIs + datasets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Largest residential/mobile proxy pool — unmatched geo coverage&lt;/li&gt;
&lt;li&gt;Enterprise-grade compliance documentation (KYC, legal review)&lt;/li&gt;
&lt;li&gt;Web Unlocker handles brutal targets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pricing is enterprise-oriented — minimum commits sting for solo builders&lt;/li&gt;
&lt;li&gt;More moving pieces; steeper setup&lt;/li&gt;
&lt;li&gt;Overkill if your target isn't heavily protected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; the serious option when you're scraping at volume against hard targets, or when legal/compliance sign-off matters.&lt;/p&gt;

&lt;h2&gt;
  
  
  ScraperAPI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Model:&lt;/strong&gt; single endpoint — send a URL, get HTML. They rotate proxies and render JS for you.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strengths&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dead simple — one API call&lt;/li&gt;
&lt;li&gt;Predictable per-request pricing&lt;/li&gt;
&lt;li&gt;Quick to bolt onto existing code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Weaknesses&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You still write and maintain the parsing logic&lt;/li&gt;
&lt;li&gt;No ready-made extractors; weaker for JS-heavy marketplaces&lt;/li&gt;
&lt;li&gt;Costs climb on protected targets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; great for DIY scrapers who just want the unblocking layer. Less great if you want structured data out-of-the-box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Head-to-head
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;&lt;/th&gt;
&lt;th&gt;Bright Data&lt;/th&gt;
&lt;th&gt;ScraperAPI&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ready-made scrapers&lt;/td&gt;
&lt;td&gt;4,000+ actors&lt;/td&gt;
&lt;td&gt;API per site&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Free tier&lt;/td&gt;
&lt;td&gt;✅ monthly credits&lt;/td&gt;
&lt;td&gt;trial&lt;/td&gt;
&lt;td&gt;trial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Proxy network&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;td&gt;best-in-class&lt;/td&gt;
&lt;td&gt;included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fit for AI agents&lt;/td&gt;
&lt;td&gt;✅ skills + API&lt;/td&gt;
&lt;td&gt;partial&lt;/td&gt;
&lt;td&gt;partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best for&lt;/td&gt;
&lt;td&gt;leads, ecommerce, social, SERP&lt;/td&gt;
&lt;td&gt;enterprise scale&lt;/td&gt;
&lt;td&gt;DIY unblocking&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I'd pick
&lt;/h2&gt;

&lt;p&gt;Solo dev / lead-gen / affiliate projects: &lt;strong&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;&lt;/strong&gt; — the marketplace saves weeks, and the free tier is real.&lt;/p&gt;

&lt;p&gt;Enterprise with compliance requirements: &lt;strong&gt;Bright Data&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You already have parsers and just need unblocking: &lt;strong&gt;ScraperAPI&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it yourself
&lt;/h2&gt;

&lt;p&gt;Concrete pipelines I run on Apify, all documented with copy-paste code:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/g4dr/scrape-google-maps-leads" rel="noopener noreferrer"&gt;Scrape Google Maps leads&lt;/a&gt; — phones, emails, websites at scale&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/g4dr/scrape-job-postings" rel="noopener noreferrer"&gt;Scrape job postings&lt;/a&gt; — hiring signals as sales leads&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/g4dr/amazon-affiliate-feed" rel="noopener noreferrer"&gt;Amazon affiliate feed&lt;/a&gt; — live prices for affiliate sites&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/g4dr/google-serp-tracker" rel="noopener noreferrer"&gt;Google SERP tracker&lt;/a&gt; — rank tracking without $100/mo SaaS&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/g4dr/website-to-markdown-rag" rel="noopener noreferrer"&gt;Website → markdown for RAG&lt;/a&gt; — LLM-ready pipelines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More tools, proxies, and niche actors in &lt;a href="https://github.com/g4dr/awesome-web-scraping" rel="noopener noreferrer"&gt;awesome-web-scraping&lt;/a&gt;, plus &lt;a href="https://github.com/g4dr/apify-skills" rel="noopener noreferrer"&gt;agent skills&lt;/a&gt; that run these pipelines from a prompt.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What are you scraping? Comments open.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>api</category>
      <category>tools</category>
      <category>comparison</category>
    </item>
    <item>
      <title>Build an Amazon Affiliate Feed with Live Prices in 2026</title>
      <dc:creator>g4dr</dc:creator>
      <pubDate>Tue, 20 Oct 2026 07:29:28 +0000</pubDate>
      <link>https://dev.to/g4dr/build-an-amazon-affiliate-feed-with-live-prices-in-2026-1fg8</link>
      <guid>https://dev.to/g4dr/build-an-amazon-affiliate-feed-with-live-prices-in-2026-1fg8</guid>
      <description>&lt;p&gt;Static prices kill affiliate conversions. A "best standing desks" table that says $299 while Amazon shows $349? Your reader bounces. Live data converts — here's how to build a self-updating product feed with Apify actors.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 &lt;strong&gt;Try it live&lt;/strong&gt; — chat with a Poe bot that generates the exact pipeline for your niche: &lt;a href="https://poe.com/amazonproductminer" rel="noopener noreferrer"&gt;Amazon Product Miner&lt;/a&gt; · &lt;a href="https://poe.com/leadlistgenerator" rel="noopener noreferrer"&gt;Lead List Generator&lt;/a&gt; · &lt;a href="https://poe.com/jobpostingsminer" rel="noopener noreferrer"&gt;Job Postings Miner&lt;/a&gt; · &lt;a href="https://poe.com/serpranktracker" rel="noopener noreferrer"&gt;SERP Rank Tracker&lt;/a&gt; · &lt;a href="https://poe.com/socialleadfinder" rel="noopener noreferrer"&gt;Social Lead Finder&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;&lt;/strong&gt; — &lt;code&gt;apify/amazon-crawler&lt;/code&gt; handles Amazon's anti-bot wall. Free credits to start.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nightly schedule&lt;/strong&gt; — fresh prices every morning, zero maintenance.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 — Token
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Create an Apify account&lt;/a&gt; → Settings → Integrations → API token → &lt;code&gt;export APIFY_TOKEN=...&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Scrape ASINs in batch
&lt;/h2&gt;



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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;asins&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;B0ABC12345&lt;/span&gt;&lt;span class="sh"&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;B0DEF67890&lt;/span&gt;&lt;span class="sh"&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;B0GHI11223&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apify/amazon-crawler&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&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;productUrls&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;url&lt;/span&gt;&lt;span class="sh"&gt;"&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;https://www.amazon.com/dp/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;a&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;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;asins&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;proxyCountry&lt;/span&gt;&lt;span class="sh"&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;AUTO_SELECT_PROXY_COUNTRY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&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;asin&lt;/span&gt;&lt;span class="sh"&gt;"&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;title&lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inStock&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;p&gt;Fields: &lt;code&gt;asin&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;price&lt;/code&gt;, &lt;code&gt;listPrice&lt;/code&gt;, &lt;code&gt;stars&lt;/code&gt;, &lt;code&gt;reviewsCount&lt;/code&gt;, &lt;code&gt;inStock&lt;/code&gt;, &lt;code&gt;thumbnailImage&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Scheduled snapshots → live table
&lt;/h2&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="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;

&lt;span class="n"&gt;DB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prices.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;current&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;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;current&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;asin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&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;price&lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&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;stock&lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;inStock&lt;/span&gt;&lt;span class="sh"&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;stars&lt;/span&gt;&lt;span class="sh"&gt;"&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="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;stars&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;old&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;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DB&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="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;asin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;asin&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;asin&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
        &lt;span class="n"&gt;drop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;asin&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;asin&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;drop&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.10&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;PRICE DROP &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;asin&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;asin&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;price&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&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="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dump&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;current&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&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;p&gt;Put the actor on a daily schedule in Apify Console → this script runs via cron/Actions → your comparison pages always show today's price.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Reviews for content angles
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;junglee/amazon-reviews-scraper&lt;/code&gt; with &lt;code&gt;filterByRating: "critical"&lt;/code&gt; pulls the worst reviews first — exactly what you need for "pros &amp;amp; cons" sections that readers trust:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/junglee~amazon-reviews-scraper/run-sync-get-dataset-items?token=&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"productUrls": [{"url": "https://www.amazon.com/dp/B0EXAMPLE"}], "maxReviews": 100, "filterByRating": "critical"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Pro tips
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;proxyCountry&lt;/code&gt; must match the marketplace (US → .com, DE → .de) or data comes back wrong/blocked.&lt;/li&gt;
&lt;li&gt;Batch ASINs in one run; re-run only failures.&lt;/li&gt;
&lt;li&gt;Pair prices with your Associates tag in the outbound URL — &lt;code&gt;?tag=yourtag-20&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;More tools on &lt;a href="https://github.com/g4dr/awesome-web-scraping" rel="noopener noreferrer"&gt;awesome-web-scraping&lt;/a&gt;. Agent users: &lt;code&gt;npx skills add g4dr/apify-skills&lt;/code&gt; — the &lt;code&gt;apify-amazon-products&lt;/code&gt; skill does this end-to-end (&lt;a href="https://github.com/g4dr/apify-skills" rel="noopener noreferrer"&gt;repo&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What niche are you building a feed for?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>amazon</category>
      <category>affiliate</category>
      <category>webscraping</category>
      <category>api</category>
    </item>
    <item>
      <title>Scrape Job Postings at Scale: Hiring Signals Are Buying Signals</title>
      <dc:creator>g4dr</dc:creator>
      <pubDate>Tue, 20 Oct 2026 07:24:28 +0000</pubDate>
      <link>https://dev.to/g4dr/scrape-job-postings-at-scale-hiring-signals-are-buying-signals-5fl8</link>
      <guid>https://dev.to/g4dr/scrape-job-postings-at-scale-hiring-signals-are-buying-signals-5fl8</guid>
      <description>&lt;p&gt;Companies posting jobs are revealing exactly what they need — in real time. A company hiring "SEO specialist" needs SEO help. Five sales openings mean they want pipeline. Hiring a "migration engineer"? They need a dev agency.&lt;/p&gt;

&lt;p&gt;Here's how to turn public job boards into a lead-gen machine using Apify actors — no scraper maintenance, no proxy bills.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 &lt;strong&gt;Try it live&lt;/strong&gt; — chat with a Poe bot that generates the exact pipeline for your search: &lt;a href="https://poe.com/jobpostingsminer" rel="noopener noreferrer"&gt;Job Postings Miner&lt;/a&gt; · &lt;a href="https://poe.com/leadlistgenerator" rel="noopener noreferrer"&gt;Lead List Generator&lt;/a&gt; · &lt;a href="https://poe.com/amazonproductminer" rel="noopener noreferrer"&gt;Amazon Product Miner&lt;/a&gt; · &lt;a href="https://poe.com/serpranktracker" rel="noopener noreferrer"&gt;SERP Rank Tracker&lt;/a&gt; · &lt;a href="https://poe.com/socialleadfinder" rel="noopener noreferrer"&gt;Social Lead Finder&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;&lt;/strong&gt; — ready-made actors for Google Jobs, Indeed, and LinkedIn. Free monthly credits included.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python + apify_client&lt;/strong&gt; — 20 lines to a clean CSV.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 — Token
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Create an Apify account&lt;/a&gt; → Console → Settings → Integrations → copy the API token → &lt;code&gt;export APIFY_TOKEN=...&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Run the Google Jobs actor
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/apify~google-jobs-scraper/run-sync-get-dataset-items?token=&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "queries": "remote react developer",
    "countryCode": "us",
    "maxPagesPerQuery": 2
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output fields: &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;companyName&lt;/code&gt;, &lt;code&gt;location&lt;/code&gt;, &lt;code&gt;salary&lt;/code&gt;, &lt;code&gt;description&lt;/code&gt;, &lt;code&gt;applyUrl&lt;/code&gt;, &lt;code&gt;postedAt&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Hiring-signal filter
&lt;/h2&gt;



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

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;apify/google-jobs-scraper&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&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;queries&lt;/span&gt;&lt;span class="sh"&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;seo specialist&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;content writer&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;ppc manager&lt;/span&gt;&lt;span class="sh"&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;countryCode&lt;/span&gt;&lt;span class="sh"&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;us&lt;/span&gt;&lt;span class="sh"&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;maxPagesPerQuery&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="n"&gt;signals&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;job&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;job&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;companyName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setdefault&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;,&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;job&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Companies hiring multiple roles = hot prospects
&lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;titles&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;signals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&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="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; openings -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;titles&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;]&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The lead-gen play
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Schedule the actor daily in Apify Console&lt;/li&gt;
&lt;li&gt;Filter new postings per company&lt;/li&gt;
&lt;li&gt;Enrich the company domain with &lt;code&gt;vdrmota/contact-info-scraper&lt;/code&gt; (emails, socials)&lt;/li&gt;
&lt;li&gt;Outreach: &lt;em&gt;"Saw you're hiring for X — we deliver that as a service today"&lt;/em&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Companies hiring are companies with budget. You're not cold-calling — you're showing up exactly when the pain is public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Extras
&lt;/h2&gt;

&lt;p&gt;More scrapers and proxies on my &lt;a href="https://github.com/g4dr/awesome-web-scraping" rel="noopener noreferrer"&gt;awesome-web-scraping&lt;/a&gt; list. And if you use Claude Code/Cursor: &lt;code&gt;npx skills add g4dr/apify-skills&lt;/code&gt; teaches your agent this whole pipeline — &lt;a href="https://github.com/g4dr/apify-skills" rel="noopener noreferrer"&gt;repo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dedupe on &lt;code&gt;(companyName, title)&lt;/code&gt; — boards cross-post the same job everywhere. Cap &lt;code&gt;maxPagesPerQuery&lt;/code&gt; at 1-3 to control spend.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What niche are you scraping jobs for? Drop it below — I'll share the run input.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>jobs</category>
      <category>api</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Scrape Google Maps into a Lead List in 2026 (No Code Required)</title>
      <dc:creator>g4dr</dc:creator>
      <pubDate>Mon, 19 Oct 2026 23:43:41 +0000</pubDate>
      <link>https://dev.to/g4dr/how-to-scrape-google-maps-into-a-lead-list-in-2026-no-code-required-4c9f</link>
      <guid>https://dev.to/g4dr/how-to-scrape-google-maps-into-a-lead-list-in-2026-no-code-required-4c9f</guid>
      <description>&lt;p&gt;You need a list of plumbers in Manchester, dentists in Miami, or roofers in Lyon — with phones, emails, and websites. Doing it by hand takes days. Writing a scraper takes hours... until Google rate-limits you into CAPTCHA hell.&lt;/p&gt;

&lt;p&gt;Here's the 2026 way: run a maintained &lt;strong&gt;Apify actor&lt;/strong&gt; that handles proxies, pagination, and anti-blocking — then let your AI agent do the plumbing.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🤖 &lt;strong&gt;Try it live&lt;/strong&gt; — chat with a Poe bot that generates the exact pipeline for your niche: &lt;a href="https://poe.com/leadlistgenerator" rel="noopener noreferrer"&gt;Lead List Generator&lt;/a&gt; · &lt;a href="https://poe.com/jobpostingsminer" rel="noopener noreferrer"&gt;Job Postings Miner&lt;/a&gt; · &lt;a href="https://poe.com/amazonproductminer" rel="noopener noreferrer"&gt;Amazon Product Miner&lt;/a&gt; · &lt;a href="https://poe.com/serpranktracker" rel="noopener noreferrer"&gt;SERP Rank Tracker&lt;/a&gt; · &lt;a href="https://poe.com/socialleadfinder" rel="noopener noreferrer"&gt;Social Lead Finder&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Apify&lt;/a&gt;&lt;/strong&gt; — actor marketplace with ready-made Google Maps scrapers. Free tier includes monthly credits — enough to test this end-to-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your AI agent&lt;/strong&gt; (Claude Code, Cursor, Codex...) — runs the pipeline via a skill that knows the actor inputs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No proxies to configure. No headless browser tuning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 — Get your API token
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://console.apify.com/sign-up?fpr=dx06p" rel="noopener noreferrer"&gt;Create an Apify account&lt;/a&gt; (free credits included)&lt;/li&gt;
&lt;li&gt;Console → Settings → Integrations → copy your API token&lt;/li&gt;
&lt;li&gt;&lt;code&gt;export APIFY_TOKEN=your_token&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2 — Run the lead-extraction actor
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;lukaskrivka/google-maps-with-contact-details&lt;/code&gt; actor doesn't just grab businesses — it visits each website and extracts &lt;strong&gt;emails and social profiles&lt;/strong&gt; automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="s2"&gt;"https://api.apify.com/v2/acts/lukaskrivka~google-maps-with-contact-details/run-sync-get-dataset-items?token=&lt;/span&gt;&lt;span class="nv"&gt;$APIFY_TOKEN&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "searchStringsArray": ["dentist"],
    "locationQuery": "Miami, FL",
    "maxCrawledPlacesPerSearch": 100,
    "language": "en"
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get back a JSON array with &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;phone&lt;/code&gt;, &lt;code&gt;website&lt;/code&gt;, &lt;code&gt;emails&lt;/code&gt;, &lt;code&gt;address&lt;/code&gt;, &lt;code&gt;totalScore&lt;/code&gt;, &lt;code&gt;reviewsCount&lt;/code&gt;, &lt;code&gt;categoryName&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Clean lead CSV with Python
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;apify_client&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ApifyClient&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;ApifyClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;APIFY_TOKEN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;actor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;lukaskrivka/google-maps-with-contact-details&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run_input&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;searchStringsArray&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&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;plumber&lt;/span&gt;&lt;span class="sh"&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;locationQuery&lt;/span&gt;&lt;span class="sh"&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;Austin, TX&lt;/span&gt;&lt;span class="sh"&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;maxCrawledPlacesPerSearch&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;prospects.csv&lt;/span&gt;&lt;span class="sh"&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;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;newline&lt;/span&gt;&lt;span class="o"&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;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;csv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;business&lt;/span&gt;&lt;span class="sh"&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;phone&lt;/span&gt;&lt;span class="sh"&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;email&lt;/span&gt;&lt;span class="sh"&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;website&lt;/span&gt;&lt;span class="sh"&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;rating&lt;/span&gt;&lt;span class="sh"&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;reviews&lt;/span&gt;&lt;span class="sh"&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;p&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;dataset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;defaultDatasetId&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;iterate_items&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;phone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;p&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;emails&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;writerow&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;title&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;p&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;phone&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;emails&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;])[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
                &lt;span class="n"&gt;p&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;website&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;p&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;totalScore&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
                &lt;span class="n"&gt;p&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;reviewsCount&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&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;Dedupe by &lt;code&gt;website&lt;/code&gt; or &lt;code&gt;phone&lt;/code&gt;, filter for &lt;code&gt;totalScore &amp;gt;= 3.5&lt;/code&gt; — and you have a clean outreach list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: let your agent run it for you
&lt;/h2&gt;

&lt;p&gt;I packaged this (plus 7 other scraping patterns — jobs, Amazon, social, SERP) as Agent Skills:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add g4dr/apify-skills
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installing, tell Claude Code &lt;em&gt;"get me all roofers in Birmingham"&lt;/em&gt; — it picks the right actor, builds the run input, and hands you the data. Full repo: &lt;a href="https://github.com/g4dr/apify-skills" rel="noopener noreferrer"&gt;g4dr/apify-skills&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For the bigger picture (proxies, headless browsers, niche actors), I maintain an &lt;a href="https://github.com/g4dr/awesome-web-scraping" rel="noopener noreferrer"&gt;awesome-web-scraping&lt;/a&gt; list.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compliance note
&lt;/h2&gt;

&lt;p&gt;Google Maps data is public business info — but respect GDPR and outreach laws (CAN-SPAM, opt-outs). Scrape public data, don't republish personal info, and honor platform ToS.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Questions? Drop them in the comments — happy to share run inputs for specific niches.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webscraping</category>
      <category>leadgeneration</category>
      <category>api</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
