<?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: Get Anything</title>
    <description>The latest articles on DEV Community by Get Anything (@get_anything).</description>
    <link>https://dev.to/get_anything</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%2F4024040%2Fe9066f23-9178-40c1-9855-eca27d8a6fd1.png</url>
      <title>DEV Community: Get Anything</title>
      <link>https://dev.to/get_anything</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/get_anything"/>
    <language>en</language>
    <item>
      <title>Scrape Google Play: apps, details &amp; reviews for market research (no API key)</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Thu, 17 Sep 2026 06:32:25 +0000</pubDate>
      <link>https://dev.to/get_anything/scrape-google-play-apps-details-reviews-for-market-research-no-api-key-5a57</link>
      <guid>https://dev.to/get_anything/scrape-google-play-apps-details-reviews-for-market-research-no-api-key-5a57</guid>
      <description>&lt;p&gt;If you're doing app market research — tracking competitors, mining reviews for feature requests, or watching ratings over time — you need structured Google Play data: app details, install counts, ratings, and user reviews. Here's how to get it without the Play Console or any API key.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's useful to pull
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; apps by keyword or category&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App details&lt;/strong&gt;: installs, rating, price, developer, version, last update, screenshots&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reviews&lt;/strong&gt;: text, star rating, date, thumbs-up count — the goldmine for product insight&lt;/li&gt;
&lt;li&gt;Any &lt;strong&gt;country store&lt;/strong&gt; and language&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The easy way
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/get_anything/google-play-scraper" rel="noopener noreferrer"&gt;Google Play Scraper&lt;/a&gt; does search + details + reviews across any country store. No API key.&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;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"reviews"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"appId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"com.whatsapp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ae"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"maxReviews"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&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;One clean row per app or review — export to JSON, CSV or Excel, or pull via the API.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to do with it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Competitor tracking&lt;/strong&gt; — monitor a rival app's rating and review volume over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review mining&lt;/strong&gt; — run reviews through an LLM to cluster complaints and feature requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ASO research&lt;/strong&gt; — see which apps rank for a keyword and how they're positioned&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Due diligence&lt;/strong&gt; — installs, ratings and update cadence at a glance&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Connect it to Claude or ChatGPT
&lt;/h2&gt;

&lt;p&gt;Every Apify actor is callable over MCP. Point Claude Desktop at &lt;code&gt;https://mcp.apify.com&lt;/code&gt; and ask it to "pull the latest reviews for this app and summarize the top complaints." Guide: &lt;a href="https://dev.to/get_anything/connect-any-apify-scraper-to-claude-or-chatgpt-in-2-minutes-mcp-37he"&gt;Connect Apify actors to Claude &amp;amp; ChatGPT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://apify.com/get_anything/google-play-scraper" rel="noopener noreferrer"&gt;Google Play Scraper&lt;/a&gt;. Public store data only.&lt;/p&gt;

</description>
      <category>python</category>
      <category>api</category>
      <category>tutorial</category>
      <category>webscraping</category>
    </item>
    <item>
      <title>Get live gold prices in any currency, per gram/tola/karat (no API key)</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Thu, 17 Sep 2026 06:31:40 +0000</pubDate>
      <link>https://dev.to/get_anything/get-live-gold-prices-in-any-currency-per-gramtolakarat-no-api-key-3ecm</link>
      <guid>https://dev.to/get_anything/get-live-gold-prices-in-any-currency-per-gramtolakarat-no-api-key-3ecm</guid>
      <description>&lt;p&gt;Most "gold price API" services are paywalled and quote only USD per troy ounce. But if you're building anything for the Gulf or India — a jewelry site, a savings app, a dashboard — you need &lt;strong&gt;per gram, per tola, per karat, in AED/INR/SAR&lt;/strong&gt;. Here's how to get exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  The units that actually matter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Jewelry is sold &lt;strong&gt;per gram&lt;/strong&gt; and by &lt;strong&gt;karat&lt;/strong&gt; (24k/22k/21k/18k), not per ounce.&lt;/li&gt;
&lt;li&gt;South Asian markets quote the &lt;strong&gt;tola&lt;/strong&gt; (~11.66 g).&lt;/li&gt;
&lt;li&gt;Buyers want their &lt;strong&gt;local currency&lt;/strong&gt;, not USD.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So the useful output is: spot price converted to your currency, then divided into grams/tola and scaled by karat purity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The easy way
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/get_anything/gold-price-scraper" rel="noopener noreferrer"&gt;Gold Price Scraper&lt;/a&gt; returns gold, silver, platinum and palladium in any currency, per gram/tola/ounce and by karat — built on live futures + FX. No API key.&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;"metals"&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="s2"&gt;"gold"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"silver"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"AED"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"karats"&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="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18&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;Output is one clean row per metal/unit, ready for a site, app or sheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Jewelry &amp;amp; retail&lt;/strong&gt; — show today's 22k/gram price in local currency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Savings &amp;amp; fintech apps&lt;/strong&gt; — value gold holdings live&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dashboards &amp;amp; alerts&lt;/strong&gt; — track spot moves on a schedule&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Connect it to Claude or ChatGPT
&lt;/h2&gt;

&lt;p&gt;Every Apify actor is callable over MCP. Point Claude Desktop at &lt;code&gt;https://mcp.apify.com&lt;/code&gt; and ask "what's 22k gold per gram in AED today?" Guide: &lt;a href="https://dev.to/get_anything/connect-any-apify-scraper-to-claude-or-chatgpt-in-2-minutes-mcp-37he"&gt;Connect Apify actors to Claude &amp;amp; ChatGPT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://apify.com/get_anything/gold-price-scraper" rel="noopener noreferrer"&gt;Gold Price Scraper&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>api</category>
      <category>python</category>
      <category>finance</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Get any YouTube video's transcript as clean text for your LLM (no API key)</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Thu, 17 Sep 2026 06:30:33 +0000</pubDate>
      <link>https://dev.to/get_anything/get-any-youtube-videos-transcript-as-clean-text-for-your-llm-no-api-key-e6i</link>
      <guid>https://dev.to/get_anything/get-any-youtube-videos-transcript-as-clean-text-for-your-llm-no-api-key-e6i</guid>
      <description>&lt;p&gt;Feeding a YouTube video to an LLM starts with one thing: the &lt;strong&gt;transcript&lt;/strong&gt;. Here's how to get it as clean, token-efficient text for summarization, Q&amp;amp;A, or a RAG knowledge base — without the YouTube Data API or any key.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why not the official API?
&lt;/h2&gt;

&lt;p&gt;The YouTube Data API doesn't return caption text without OAuth and extra hoops, and it has quotas. For transcripts, the captions track is public for most videos — you just fetch and clean it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you want out
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The full transcript as plain text and as Markdown&lt;/li&gt;
&lt;li&gt;Cleaned for LLMs: HTML entities decoded, newlines collapsed&lt;/li&gt;
&lt;li&gt;Metadata (title, channel, duration) as a bonus&lt;/li&gt;
&lt;li&gt;Works with auto-generated captions, falls back across languages&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The easy way
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://apify.com/get_anything/youtube-transcript-scraper" rel="noopener noreferrer"&gt;YouTube Transcript Scraper&lt;/a&gt; does exactly this. Give it video URLs and it returns pre-cleaned &lt;code&gt;transcript&lt;/code&gt; and &lt;code&gt;markdown&lt;/code&gt; fields, only charging for videos that actually have captions.&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;"videoUrls"&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="s2"&gt;"https://www.youtube.com/watch?v=..."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&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;Pipe the &lt;code&gt;markdown&lt;/code&gt; straight into your model:&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="n"&gt;items&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://api.apify.com/v2/datasets/&amp;lt;DATASET_ID&amp;gt;/items?format=json&lt;/span&gt;&lt;span class="sh"&gt;"&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="n"&gt;context&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;items&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;markdown&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;
  
  
  Use cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Summarize long talks and lectures in one prompt&lt;/li&gt;
&lt;li&gt;Q&amp;amp;A over videos — chunk the transcript into a vector DB&lt;/li&gt;
&lt;li&gt;Repurpose a video into a blog post or thread&lt;/li&gt;
&lt;li&gt;Build a searchable archive of a channel&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Connect it to Claude or ChatGPT
&lt;/h2&gt;

&lt;p&gt;Every Apify actor is callable over MCP. Point Claude Desktop at &lt;code&gt;https://mcp.apify.com&lt;/code&gt; and ask it to get a video's transcript and summarize it. Guide: &lt;a href="https://dev.to/get_anything/connect-any-apify-scraper-to-claude-or-chatgpt-in-2-minutes-mcp-37he"&gt;Connect Apify actors to Claude &amp;amp; ChatGPT&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Try it: &lt;a href="https://apify.com/get_anything/youtube-transcript-scraper" rel="noopener noreferrer"&gt;YouTube Transcript Scraper&lt;/a&gt;. Public captions only — respect creators' rights.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>tutorial</category>
      <category>api</category>
    </item>
    <item>
      <title>Connect any Apify scraper to Claude or ChatGPT in 2 minutes (MCP)</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:49:02 +0000</pubDate>
      <link>https://dev.to/get_anything/connect-any-apify-scraper-to-claude-or-chatgpt-in-2-minutes-mcp-37he</link>
      <guid>https://dev.to/get_anything/connect-any-apify-scraper-to-claude-or-chatgpt-in-2-minutes-mcp-37he</guid>
      <description>&lt;p&gt;You can give Claude, ChatGPT, Cursor, or any MCP client the ability to &lt;strong&gt;run real web scrapers and pull live data&lt;/strong&gt; — search results, web pages behind Cloudflare, business leads, job listings — without writing any integration code. Here's how, using the &lt;strong&gt;Apify MCP server&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one thing you need to know
&lt;/h2&gt;

&lt;p&gt;Apify hosts an MCP server at &lt;strong&gt;&lt;code&gt;https://mcp.apify.com&lt;/code&gt;&lt;/strong&gt;. Point any MCP client at it and your AI can discover and run any of thousands of Apify Actors (scrapers), read their results, and adapt to new tasks on the fly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Desktop (easiest)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Settings → &lt;strong&gt;Connectors&lt;/strong&gt; → &lt;strong&gt;Add custom connector&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Server URL: &lt;code&gt;https://mcp.apify.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Your browser opens once to sign in to Apify and approve access.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it — ask Claude &lt;em&gt;"search the web for X"&lt;/em&gt; or &lt;em&gt;"scrape this URL"&lt;/em&gt; and it runs the tool.&lt;/p&gt;

&lt;h2&gt;
  
  
  Any MCP client (Cursor, VS Code, Claude Code…)
&lt;/h2&gt;

&lt;p&gt;Add this to your MCP config:&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;"mcpServers"&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;"apify"&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;"url"&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://mcp.apify.com"&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;Prefer a token over OAuth? Add a header:&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;"mcpServers"&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;"apify"&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;"url"&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://mcp.apify.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&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;"Authorization"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Bearer &amp;lt;APIFY_TOKEN&amp;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="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;Get your token from the &lt;a href="https://console.apify.com/settings/integrations" rel="noopener noreferrer"&gt;Apify Console → API &amp;amp; Integrations&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Load only the tools you want
&lt;/h2&gt;

&lt;p&gt;By default the server loads discovery tools + a web browser. To expose &lt;strong&gt;specific scrapers&lt;/strong&gt; as ready-to-call tools, list them in the URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mcp.apify.com?tools=get_anything/serp-scraper,get_anything/web-unblocker,get_anything/contact-extractor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A few of mine that are genuinely useful to LLM workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/serp-scraper" rel="noopener noreferrer"&gt;serp-scraper&lt;/a&gt;&lt;/strong&gt; — Google/Bing/DuckDuckGo results as JSON for RAG grounding&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/web-unblocker" rel="noopener noreferrer"&gt;web-unblocker&lt;/a&gt;&lt;/strong&gt; — fetch any URL past Cloudflare/DataDome and return clean Markdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/llm-web-scraper" rel="noopener noreferrer"&gt;llm-web-scraper&lt;/a&gt;&lt;/strong&gt; — any URL/site → LLM-ready Markdown&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/contact-extractor" rel="noopener noreferrer"&gt;contact-extractor&lt;/a&gt;&lt;/strong&gt; — emails/phones/socials from a list of domains&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/google-maps-leads" rel="noopener noreferrer"&gt;google-maps-leads&lt;/a&gt;&lt;/strong&gt; — local businesses with phone, website &amp;amp; email&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  No-token discovery mode
&lt;/h2&gt;

&lt;p&gt;For discovery/testing you can connect with &lt;strong&gt;no token&lt;/strong&gt; by loading only the read-only tools:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://mcp.apify.com?tools=search-actors,fetch-actor-details,search-apify-docs,fetch-apify-docs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running an Actor (and getting data back) needs a token or OAuth sign-in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Instead of copy-pasting data into your prompt, your AI &lt;strong&gt;fetches it live&lt;/strong&gt; — grounded, current, and structured. That's the difference between an LLM that guesses and one that knows.&lt;/p&gt;

&lt;p&gt;Try it: point Claude Desktop at &lt;code&gt;https://mcp.apify.com&lt;/code&gt; and ask it to scrape something. Full docs: &lt;a href="https://docs.apify.com/platform/integrations/mcp" rel="noopener noreferrer"&gt;Apify MCP server&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webscraping</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Google Maps scrapers give you the phone. Here's how to get the email too</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:08:47 +0000</pubDate>
      <link>https://dev.to/get_anything/google-maps-scrapers-give-you-the-phone-heres-how-to-get-the-email-too-513c</link>
      <guid>https://dev.to/get_anything/google-maps-scrapers-give-you-the-phone-heres-how-to-get-the-email-too-513c</guid>
      <description>&lt;p&gt;Google Maps is the best source of local business leads — but most Maps scrapers stop at name, address and phone. The field that actually closes deals, &lt;strong&gt;email&lt;/strong&gt;, isn't on Maps at all. Here's how to get it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The extra step that matters
&lt;/h2&gt;

&lt;p&gt;Maps gives you the business &lt;strong&gt;website&lt;/strong&gt;. So after scraping each listing, take one more hop: fetch the business's own site (and its contact page) and pull the email. That single step turns a directory dump into a real outreach list.&lt;/p&gt;

&lt;p&gt;Verified on a live run for &lt;code&gt;coffee shop, Dubai Marina&lt;/code&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Business&lt;/th&gt;
&lt;th&gt;Phone&lt;/th&gt;
&lt;th&gt;Email&lt;/th&gt;
&lt;th&gt;Rating&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Roast Speciality Coffee&lt;/td&gt;
&lt;td&gt;+971 50 502 5854&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:info@roastdubai.com"&gt;info@roastdubai.com&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Roasters Specialty Coffee&lt;/td&gt;
&lt;td&gt;+971 58 572 5444&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:beans@roasterscoffee.ae"&gt;beans@roasterscoffee.ae&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Drinkit coffee&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;&lt;a href="mailto:ask@drinkit.io"&gt;ask@drinkit.io&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4.8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Scroll the Maps results feed and collect every place.&lt;/li&gt;
&lt;li&gt;Open each place for name, category, address, phone, website, rating, reviews.&lt;/li&gt;
&lt;li&gt;For each website, fetch the site + a contact page and extract the email.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Input
&lt;/h2&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;"searchQueries"&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="s2"&gt;"marketing agency"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"dentist"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Dubai"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extractEmails"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&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;h2&gt;
  
  
  Use it for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Local lead generation&lt;/strong&gt; — niche + city prospect lists with email.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agencies&lt;/strong&gt; — find local businesses to pitch web/marketing services.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Market research&lt;/strong&gt; — competitor density, ratings, categories by area.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it: &lt;a href="https://apify.com/get_anything/google-maps-leads" rel="noopener noreferrer"&gt;Google Maps Leads Scraper on Apify&lt;/a&gt;. Public data only — respect GDPR/CAN-SPAM when contacting leads.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Turn a list of domains into a lead list: emails, phones, socials</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:07:49 +0000</pubDate>
      <link>https://dev.to/get_anything/turn-a-list-of-domains-into-a-lead-list-emails-phones-socials-2ea8</link>
      <guid>https://dev.to/get_anything/turn-a-list-of-domains-into-a-lead-list-emails-phones-socials-2ea8</guid>
      <description>&lt;p&gt;The most universal sales task there is: &lt;em&gt;"I have a list of company websites — get me their emails and phone numbers."&lt;/em&gt; Here's how to do it reliably, and cheaply, without a browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the data actually hides
&lt;/h2&gt;

&lt;p&gt;Businesses rarely put their email on the homepage. It's on the &lt;strong&gt;contact / about / imprint / support&lt;/strong&gt; page. So the trick isn't just fetching one URL — it's following the few same-domain links that look like contact pages, then scanning those too.&lt;/p&gt;

&lt;p&gt;The highest-confidence sources are &lt;code&gt;mailto:&lt;/code&gt; and &lt;code&gt;tel:&lt;/code&gt; links; after that, scan visible text with a well-filtered regex (drop asset filenames like &lt;code&gt;logo@2x.png&lt;/code&gt;, tracking IDs, and example addresses).&lt;/p&gt;

&lt;h2&gt;
  
  
  Pure HTTP is enough (and cheap)
&lt;/h2&gt;

&lt;p&gt;No browser needed. &lt;code&gt;curl_cffi&lt;/code&gt; with Chrome TLS impersonation fetches the pages; BeautifulSoup + regex pull the contacts. That keeps cost per site tiny — which matters when you're processing thousands of domains.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input / output
&lt;/h2&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;"startUrls"&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;"url"&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.com"&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;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"acme.io"&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;"crawlContactPages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxPagesPerSite"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;5&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;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;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"apify.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"emails"&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="s2"&gt;"hello@apify.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"support@apify.com"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"phones"&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="s2"&gt;"+1 ..."&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"socials"&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;"linkedin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"twitter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"youtube"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;h2&gt;
  
  
  Use it for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lead generation&lt;/strong&gt; — enrich a list of company domains with reachable contacts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sales prospecting&lt;/strong&gt; — pair it with a Google Maps or directory scraper: one finds the businesses, this gets their contacts.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CRM enrichment&lt;/strong&gt; — fill missing email/phone fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ready-made: &lt;a href="https://apify.com/get_anything/contact-extractor" rel="noopener noreferrer"&gt;Contact &amp;amp; Email Extractor on Apify&lt;/a&gt;. Public pages only — and respect anti-spam / data-protection laws (GDPR, CAN-SPAM) when you reach out.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A search-results scraper for LLMs that doesn't return zero</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:06:29 +0000</pubDate>
      <link>https://dev.to/get_anything/a-search-results-scraper-for-llms-that-doesnt-return-zero-3jf0</link>
      <guid>https://dev.to/get_anything/a-search-results-scraper-for-llms-that-doesnt-return-zero-3jf0</guid>
      <description>&lt;p&gt;Everyone building RAG or an LLM agent eventually wants the same thing: &lt;strong&gt;live search results, fed into the model&lt;/strong&gt;. And everyone hits the same wall — the Google-only SERP scrapers keep dying on the &lt;code&gt;/sorry&lt;/code&gt; CAPTCHA page the moment they run from a cloud IP.&lt;/p&gt;

&lt;p&gt;I tested it directly: from datacenter and even residential cloud IPs, Google's CAPTCHA wall is a coin-flip. So the honest answer isn't "beat Google" — it's &lt;strong&gt;use an engine that actually returns data every run&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bing is the pragmatic default
&lt;/h2&gt;

&lt;p&gt;Bing returns organic results comparable to Google, is far more tolerant of automated access, and exposes the same fields you need: title, URL, snippet, position, related searches. So the &lt;a href="https://apify.com/get_anything/serp-scraper" rel="noopener noreferrer"&gt;SERP Scraper&lt;/a&gt; defaults to &lt;strong&gt;Bing&lt;/strong&gt;, with &lt;strong&gt;DuckDuckGo&lt;/strong&gt; as a second reliable engine and &lt;strong&gt;Google&lt;/strong&gt; as best-effort (with an honest disclaimer, not a false promise).&lt;/p&gt;

&lt;h2&gt;
  
  
  One gotcha: residential IP personalization
&lt;/h2&gt;

&lt;p&gt;Early on, a query for "best web scraping tools" returned… adult Reddit threads. The cause: residential proxy IPs are real users' connections, and their &lt;strong&gt;Bing session/personalization leaks&lt;/strong&gt; into your results. The fix:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clear cookies before each query,&lt;/li&gt;
&lt;li&gt;force &lt;code&gt;mkt&lt;/code&gt; (market) + SafeSearch,&lt;/li&gt;
&lt;li&gt;don't carry any session cookie.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After that, results are clean and query-driven every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Input
&lt;/h2&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;"queries"&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="s2"&gt;"apify web scraping platform"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"engine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxResults"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"us"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&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;You get one row per organic result:&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;"query"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"apify web scraping platform"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"engine"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"bing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"position"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1&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;"Apify: The largest marketplace of trusted tools for AI"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"url"&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://apify.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"apify.com"&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;h2&gt;
  
  
  Use it for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;RAG / LLM grounding&lt;/strong&gt; — pair it with a URL-to-Markdown reader to build a full "search + read" web browser for your model.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SEO / rank tracking&lt;/strong&gt; — per country and language.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyword research&lt;/strong&gt; — harvest Related Searches.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it: &lt;a href="https://apify.com/get_anything/serp-scraper" rel="noopener noreferrer"&gt;SERP Scraper on Apify&lt;/a&gt;. No API key; public search-results data only.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to tell which anti-bot a website uses (and fetch the page anyway)</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Thu, 17 Sep 2026 05:05:22 +0000</pubDate>
      <link>https://dev.to/get_anything/how-to-tell-which-anti-bot-a-website-uses-and-fetch-the-page-anyway-j7m</link>
      <guid>https://dev.to/get_anything/how-to-tell-which-anti-bot-a-website-uses-and-fetch-the-page-anyway-j7m</guid>
      <description>&lt;p&gt;If you scrape the web, you know the wall: a 403, a 429, or a "Just a moment…" page that never resolves. Before you sink a day into building a scraper, two questions matter:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Which anti-bot is protecting this site?&lt;/strong&gt; (Cloudflare, DataDome, PerimeterX/HUMAN, Akamai, Imperva…)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Can I get the page anyway?&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's a way to answer both in one call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Detecting the anti-bot vendor
&lt;/h2&gt;

&lt;p&gt;Each vendor leaves fingerprints in the response headers and body:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Vendor&lt;/th&gt;
&lt;th&gt;Tell-tale signs&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloudflare&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;cf-ray&lt;/code&gt; header, &lt;code&gt;Server: cloudflare&lt;/code&gt;, "Just a moment", &lt;code&gt;challenge-platform&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DataDome&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;x-datadome&lt;/code&gt; header, &lt;code&gt;datadome&lt;/code&gt; cookie, &lt;code&gt;captcha-delivery.com&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PerimeterX / HUMAN&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;_px*&lt;/code&gt; cookies, &lt;code&gt;px-captcha&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Akamai Bot Manager&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;_abck&lt;/code&gt; / &lt;code&gt;ak_bmsc&lt;/code&gt; cookies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Imperva / Incapsula&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;incap_ses&lt;/code&gt; cookie, &lt;code&gt;x-iinfo&lt;/code&gt; header&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If you just want the answer without wiring this up yourself, the &lt;a href="https://apify.com/get_anything/web-unblocker" rel="noopener noreferrer"&gt;Web Unblocker actor&lt;/a&gt; returns a &lt;code&gt;protectionDetected&lt;/code&gt; field for any URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fetching the page anyway
&lt;/h2&gt;

&lt;p&gt;The strategy that works from cloud IPs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fast path&lt;/strong&gt; — an HTTP request with real Chrome TLS/JA3 impersonation (&lt;code&gt;curl_cffi&lt;/code&gt;). Cheap, instant for unprotected pages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Browser render&lt;/strong&gt; — if that's blocked, render in a hardened browser (Camoufox — a fingerprint-hardened Firefox) which clears most JavaScript challenges.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry on a fresh IP&lt;/strong&gt; — if it's still blocked, rotate to a new residential IP and try again.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  One call, both answers
&lt;/h2&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;"startUrls"&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;"url"&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.com/protected"&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;"renderJs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"outputFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"html"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"maxRetries"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"proxyConfiguration"&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;"useApifyProxy"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"apifyProxyGroups"&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="s2"&gt;"RESIDENTIAL"&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;You get back the final HTML (or clean Markdown, or a screenshot), the HTTP status, the anti-bot vendor detected, and a &lt;code&gt;bypassed&lt;/code&gt; flag telling you whether the real page came through:&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;"url"&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.com/protected"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"statusCode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"protectionDetected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Cloudflare"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"bypassed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&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;h2&gt;
  
  
  When to use it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You keep getting 403/429 on a target and want the HTML to parse yourself.&lt;/li&gt;
&lt;li&gt;You want to know what a site runs &lt;strong&gt;before&lt;/strong&gt; committing to a scraper build.&lt;/li&gt;
&lt;li&gt;You need protected pages as clean Markdown for a RAG/LLM pipeline.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Try it here: &lt;a href="https://apify.com/get_anything/web-unblocker" rel="noopener noreferrer"&gt;Web Unblocker on Apify&lt;/a&gt;. Only public pages, no logins — respect each site's terms.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GCC Tech Salaries in 2026: How to Track Vision 2030 Hiring &amp; Pay with Live Data</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Tue, 28 Jul 2026 04:28:37 +0000</pubDate>
      <link>https://dev.to/get_anything/gcc-tech-salaries-in-2026-how-to-track-vision-2030-hiring-pay-with-live-data-j49</link>
      <guid>https://dev.to/get_anything/gcc-tech-salaries-in-2026-how-to-track-vision-2030-hiring-pay-with-live-data-j49</guid>
      <description>&lt;p&gt;The Gulf is in the middle of the biggest hiring wave in its history. The six GCC states are projected to hire around &lt;strong&gt;2.5 million skilled professionals over three years&lt;/strong&gt;, Saudi Arabia is targeting 50,000 new tech jobs under &lt;strong&gt;Vision 2030&lt;/strong&gt;, and senior-developer pay in the UAE and Saudi Arabia is reportedly inflating &lt;strong&gt;15–25% a year&lt;/strong&gt;. Salaries overall are forecast up ~4.6% in Saudi and ~4.1% in the UAE for 2026.&lt;/p&gt;

&lt;p&gt;If you're recruiting, job-hunting, or building a jobs product in this market, generic salary surveys are already stale by the time they publish. Here's how to track &lt;strong&gt;live GCC salary and hiring data&lt;/strong&gt; yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: most Gulf job boards hide salary
&lt;/h2&gt;

&lt;p&gt;Bayt, GulfTalent and NaukriGulf rarely publish pay. The two sources that &lt;em&gt;do&lt;/em&gt; — &lt;strong&gt;Indeed&lt;/strong&gt; and &lt;strong&gt;Glassdoor&lt;/strong&gt; — sit behind Cloudflare and heavy anti-bot protection, so a normal scraper just hits a "Security Check" page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix: pull salary-tagged jobs across the Gulf
&lt;/h2&gt;

&lt;p&gt;Two ready-made tools get past the anti-bot walls (using a hardened, fingerprint-spoofing browser) and return structured jobs &lt;em&gt;with salary&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/indeed-gcc-jobs" rel="noopener noreferrer"&gt;Indeed Scraper — GCC Jobs, Salaries &amp;amp; Employers&lt;/a&gt;&lt;/strong&gt; — 70–80% of GCC listings carry a salary range, plus employment type, remote flag and company rating.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/glassdoor-gcc-jobs" rel="noopener noreferrer"&gt;Glassdoor Scraper — GCC Jobs &amp;amp; Salary Data&lt;/a&gt;&lt;/strong&gt; — employer-provided salary ranges and company data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Give each a &lt;strong&gt;keyword&lt;/strong&gt; (e.g. "software engineer", "data scientist", "AI engineer") and one or more &lt;strong&gt;countries&lt;/strong&gt; (UAE, Saudi Arabia, Qatar, Kuwait, Bahrain, Oman).&lt;/p&gt;

&lt;h3&gt;
  
  
  Example (Indeed) output
&lt;/h3&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;"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;"Senior Software Engineer"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"company"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&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;"city"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Riyadh"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"country"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Saudi Arabia"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"employmentType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"full-time"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salaryText"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SAR 25,000 - SAR 35,000 a month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salaryMin"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;25000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"salaryCurrency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SAR"&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;h2&gt;
  
  
  Track the trends that matter in 2026
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vision 2030 tech demand&lt;/strong&gt; — software, full-stack, data science, AI/ML roles in Riyadh, NEOM, Dubai&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tech salary inflation&lt;/strong&gt; — benchmark senior-dev pay month over month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Saudization&lt;/strong&gt; — which roles are shifting to Saudi-national-only and how pay moves with it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sector shifts&lt;/strong&gt; — tourism, construction, healthcare, education (5,000+ teaching roles a quarter)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Want coverage first, salary second?
&lt;/h2&gt;

&lt;p&gt;Start with the free flagship: &lt;strong&gt;&lt;a href="https://apify.com/get_anything/gcc-jobs-search" rel="noopener noreferrer"&gt;GCC Jobs Search&lt;/a&gt;&lt;/strong&gt; — searches Bayt, GulfTalent, NaukriGulf, Foundit and Tanqeeb together with filters for field, experience, city, salary and company, then layer Indeed/Glassdoor for salary depth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask it in plain English
&lt;/h2&gt;

&lt;p&gt;All three plug into ChatGPT/Claude via the &lt;a href="https://mcp.apify.com" rel="noopener noreferrer"&gt;Apify MCP server&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What do senior data engineers earn in Riyadh right now?"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Tools: &lt;a href="https://apify.com/get_anything/indeed-gcc-jobs" rel="noopener noreferrer"&gt;Indeed GCC&lt;/a&gt; · &lt;a href="https://apify.com/get_anything/glassdoor-gcc-jobs" rel="noopener noreferrer"&gt;Glassdoor GCC&lt;/a&gt; · &lt;a href="https://apify.com/get_anything/gcc-jobs-search" rel="noopener noreferrer"&gt;GCC Jobs Search (free)&lt;/a&gt;. By &lt;a href="https://apify.com/get_anything" rel="noopener noreferrer"&gt;Get Anything&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>jobs</category>
      <category>dubai</category>
      <category>webscraping</category>
      <category>career</category>
    </item>
    <item>
      <title>Build a Dubai Real Estate AI Agent with MCP (No Code) — Asking Price vs Sold Price</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Tue, 28 Jul 2026 04:27:43 +0000</pubDate>
      <link>https://dev.to/get_anything/build-a-dubai-real-estate-ai-agent-with-mcp-no-code-asking-price-vs-sold-price-3bcd</link>
      <guid>https://dev.to/get_anything/build-a-dubai-real-estate-ai-agent-with-mcp-no-code-asking-price-vs-sold-price-3bcd</guid>
      <description>&lt;p&gt;AI agents are only as good as the tools you give them. Ask ChatGPT or Claude "what's a fair price for a 1-bed in JVC?" and you'll get a vague, out-of-date guess — because the model has no live data. The fix in 2026 is &lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt;: you connect real data tools to your assistant, and it answers with actual numbers.&lt;/p&gt;

&lt;p&gt;Here's how to give an AI assistant two Dubai property superpowers — &lt;strong&gt;live asking prices&lt;/strong&gt; and &lt;strong&gt;real sold prices&lt;/strong&gt; — with no code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The two tools your agent needs
&lt;/h2&gt;

&lt;p&gt;The gap every property decision hinges on is &lt;em&gt;asking price vs sold price&lt;/em&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/bayut-property-scraper" rel="noopener noreferrer"&gt;Bayut Property Scraper&lt;/a&gt;&lt;/strong&gt; — live listings (what sellers &lt;em&gt;ask&lt;/em&gt;): price, beds, baths, area, agent, for sale or rent, across Dubai and the UAE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://apify.com/get_anything/dld-transactions-scraper" rel="noopener noreferrer"&gt;Dubai DLD Transactions Scraper&lt;/a&gt;&lt;/strong&gt; — Dubai Land Department registered transactions (what buyers &lt;em&gt;paid&lt;/em&gt;): price per sqm, first-sale vs resale, by community — free, no API key.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both are Apify Actors, and both are MCP-ready.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect them in ~2 minutes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the &lt;a href="https://mcp.apify.com" rel="noopener noreferrer"&gt;Apify MCP server&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Add the two Actors above as tools.&lt;/li&gt;
&lt;li&gt;Point your MCP client (Claude Desktop, ChatGPT, Cursor, or any MCP-compatible app) at the server.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it — your assistant can now call them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can now ask
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;"What's the average sold price per sqm for flats in Dubai Marina this month, first-sale vs resale?"&lt;/p&gt;

&lt;p&gt;"Find 2-bed apartments for sale in JVC under AED 1.2M, then tell me how that compares to what 2-beds actually sold for there."&lt;/p&gt;

&lt;p&gt;"Which communities had the most transactions last month, and what's the off-plan vs resale split?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The agent calls Bayut for the listings, DLD for the registered prices, and reconciles them — the kind of answer that used to need an analyst and a spreadsheet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this matters in 2026
&lt;/h2&gt;

&lt;p&gt;Dubai just posted its biggest half-year on record (~AED 291.7bn, ~71% off-plan), and prices are up ~9%. In a market moving this fast, static reports are stale on arrival. An MCP agent wired to live listings + registered transactions gives you an always-current answer to "is this priced right?"&lt;/p&gt;

&lt;h2&gt;
  
  
  Beyond real estate
&lt;/h2&gt;

&lt;p&gt;The same pattern works for hiring: connect the &lt;strong&gt;&lt;a href="https://apify.com/get_anything/indeed-gcc-jobs" rel="noopener noreferrer"&gt;Indeed&lt;/a&gt;&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://apify.com/get_anything/glassdoor-gcc-jobs" rel="noopener noreferrer"&gt;Glassdoor&lt;/a&gt;&lt;/strong&gt; GCC scrapers and ask your assistant "what do senior developers earn in Riyadh right now?"&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Tools: &lt;a href="https://apify.com/get_anything/bayut-property-scraper" rel="noopener noreferrer"&gt;Bayut&lt;/a&gt; · &lt;a href="https://apify.com/get_anything/dld-transactions-scraper" rel="noopener noreferrer"&gt;Dubai DLD Transactions&lt;/a&gt;. More AI-ready Gulf data tools by &lt;a href="https://apify.com/get_anything" rel="noopener noreferrer"&gt;Get Anything&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>webscraping</category>
      <category>chatgpt</category>
    </item>
    <item>
      <title>Dubai Off-Plan vs Resale in 2026: What the DLD Transaction Data Actually Shows</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Tue, 28 Jul 2026 04:27:42 +0000</pubDate>
      <link>https://dev.to/get_anything/dubai-off-plan-vs-resale-in-2026-what-the-dld-transaction-data-actually-shows-26m7</link>
      <guid>https://dev.to/get_anything/dubai-off-plan-vs-resale-in-2026-what-the-dld-transaction-data-actually-shows-26m7</guid>
      <description>&lt;p&gt;Dubai's property market just had its biggest six months on record — &lt;strong&gt;87,800 transactions worth around AED 291.7 billion in H1 2026&lt;/strong&gt;, with average prices up ~9% and off-plan making up roughly &lt;strong&gt;71% of all volume&lt;/strong&gt;. Every headline is about off-plan. But if you're actually deploying capital, the question isn't "is off-plan hot?" — it's &lt;em&gt;"first-sale or resale, in which community, at what price per sqm, right now?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The only data that answers that is &lt;strong&gt;registered transaction data&lt;/strong&gt; from the &lt;strong&gt;Dubai Land Department (DLD)&lt;/strong&gt; — not the asking prices on the portals. Here's how to pull it and read the off-plan vs resale story yourself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "off-plan vs resale" is the metric that matters
&lt;/h2&gt;

&lt;p&gt;The DLD tags every sale with a &lt;strong&gt;sale sequence&lt;/strong&gt;: &lt;em&gt;first sale&lt;/em&gt; (off-plan / primary, straight from the developer) or &lt;em&gt;resale&lt;/em&gt; (secondary market). That single flag tells you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Where the primary pipeline is concentrated&lt;/strong&gt; — first-sale volume clusters in emerging communities with new launches (Dubai South, JVC, Dubai Islands, Dubai Creek Harbour).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The premium/discount between primary and secondary&lt;/strong&gt; — first-sale price per sqm vs resale price per sqm in the &lt;em&gt;same&lt;/em&gt; community, the same month.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Momentum&lt;/strong&gt; — rising resale volume in an off-plan-heavy area signals an exit market forming.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to get it (free, no API key)
&lt;/h2&gt;

&lt;p&gt;The DLD publishes this on its public transactions page. Instead of wrangling it by hand, the &lt;strong&gt;&lt;a href="https://apify.com/get_anything/dld-transactions-scraper" rel="noopener noreferrer"&gt;Dubai DLD Transactions Scraper&lt;/a&gt;&lt;/strong&gt; turns it into clean JSON for any date range — one record per &lt;strong&gt;community × sub-type × sale sequence&lt;/strong&gt;, with &lt;code&gt;pricePerSqmAed&lt;/code&gt;, &lt;code&gt;avgTransactionValueAed&lt;/code&gt;, &lt;code&gt;transactionCount&lt;/code&gt; and &lt;code&gt;totalValueAed&lt;/code&gt;, in English and Arabic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: reading the split in JVC
&lt;/h3&gt;

&lt;p&gt;For Jumeirah Village Circle — one of the highest-volume communities in 2026 — the data separates:&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;"community"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JUMEIRAH VILLAGE CIRCLE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"propertySubType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Flat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"saleSequence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"First"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="nl"&gt;"transactionCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;118&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"pricePerSqmAed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;16218&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;"community"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"JUMEIRAH VILLAGE CIRCLE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"propertySubType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Flat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"saleSequence"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Second"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"transactionCount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;110&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"pricePerSqmAed"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;12106&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;First-sale (off-plan) clears higher per sqm than resale in the same community — the "new-build premium" you can now quantify per area, per month.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to build with it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Off-plan heat maps&lt;/strong&gt; — first-sale volume by community over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Primary vs secondary price gap&lt;/strong&gt; trackers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Absorption / exit signals&lt;/strong&gt; — when resale volume rises in an off-plan area&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Valuation comparables&lt;/strong&gt; grounded in registered prices, not listings&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pair it with live listings
&lt;/h2&gt;

&lt;p&gt;To see &lt;em&gt;asking vs sold&lt;/em&gt; in the same community, add the &lt;strong&gt;&lt;a href="https://apify.com/get_anything/bayut-property-scraper" rel="noopener noreferrer"&gt;Bayut Property Scraper&lt;/a&gt;&lt;/strong&gt; (live listings: price, beds, area, agent). Asking price from Bayut, sold price from DLD — the full gap in one view.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask it in plain English
&lt;/h2&gt;

&lt;p&gt;Both tools plug into ChatGPT/Claude via the &lt;a href="https://mcp.apify.com" rel="noopener noreferrer"&gt;Apify MCP server&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Compare off-plan vs resale price per sqm in Business Bay this quarter."&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;Tool: &lt;a href="https://apify.com/get_anything/dld-transactions-scraper" rel="noopener noreferrer"&gt;Dubai DLD Transactions Scraper&lt;/a&gt; · more Gulf data tools by &lt;a href="https://apify.com/get_anything" rel="noopener noreferrer"&gt;Get Anything&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>realestate</category>
      <category>dubai</category>
      <category>webscraping</category>
      <category>data</category>
    </item>
    <item>
      <title>Scraping bilingual data: the Arabic/English traps that quietly corrupt your dataset</title>
      <dc:creator>Get Anything</dc:creator>
      <pubDate>Mon, 27 Jul 2026 11:29:17 +0000</pubDate>
      <link>https://dev.to/get_anything/scraping-bilingual-data-the-arabicenglish-traps-that-quietly-corrupt-your-dataset-48fc</link>
      <guid>https://dev.to/get_anything/scraping-bilingual-data-the-arabicenglish-traps-that-quietly-corrupt-your-dataset-48fc</guid>
      <description>&lt;p&gt;Most scraping advice assumes one language. Build for a bilingual market and you meet a category of bug that never throws an exception: the request succeeds, the HTML parses, and every field you wanted comes back empty.&lt;/p&gt;

&lt;p&gt;Here is what I learned building job datasets that have to work in both Arabic and English.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bug that returns null instead of failing
&lt;/h2&gt;

&lt;p&gt;I was fetching job detail pages and extracting the stated seniority and employment type. The parser looked for the labels the page uses, matched them, and pulled the adjacent value. It worked in testing.&lt;/p&gt;

&lt;p&gt;In production, &lt;code&gt;seniorityStated&lt;/code&gt; and &lt;code&gt;employmentType&lt;/code&gt; came back &lt;code&gt;null&lt;/code&gt; for every record. No error. Status 200. Valid HTML.&lt;/p&gt;

&lt;p&gt;The links I was following pointed at a regional subdomain. That subdomain served the &lt;em&gt;Arabic&lt;/em&gt; version of the page. My selectors were matching on the English labels — "Seniority level", "Employment type" — and the page said &lt;code&gt;المستوى الوظيفي&lt;/code&gt; and &lt;code&gt;نوع التوظيف&lt;/code&gt;. Nothing matched. Nothing raised. The fields were simply absent.&lt;/p&gt;

&lt;p&gt;The fix was one line: normalize the host before fetching.&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;re&lt;/span&gt;

&lt;span class="c1"&gt;# Regional hosts serve localized pages whose labels don't match
# English selectors. Normalize to the canonical host.
&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://[a-z]{2}\.example\.com/&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;https://www.example.com/&lt;/span&gt;&lt;span class="sh"&gt;"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The lesson generalizes: &lt;strong&gt;a scraper that finds nothing and a scraper that finds the wrong language look identical from the outside.&lt;/strong&gt; If a field is null across every single record, suspect locale before you suspect your selector.&lt;/p&gt;

&lt;h2&gt;
  
  
  Assert on what you expect to find
&lt;/h2&gt;

&lt;p&gt;The defence is cheap. After a parse, check that the fields you rely on actually populated:&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="n"&gt;critical&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;seniority&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;employmentType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;missing&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;critical&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&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;f&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;r&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;records&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;missing&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;RuntimeError&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;No record has &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;missing&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; — wrong locale or stale selector?&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;A scraper that crashes loudly on an empty column is worth ten that return tidy nulls.&lt;/p&gt;

&lt;h2&gt;
  
  
  Numerals are not the digits your regex expects
&lt;/h2&gt;

&lt;p&gt;Arabic pages frequently use Eastern Arabic numerals. &lt;code&gt;٢٠٠&lt;/code&gt; is two hundred.&lt;/p&gt;

&lt;p&gt;Python is more helpful here than people assume, which is exactly why this bites. &lt;code&gt;int("٢٠٠")&lt;/code&gt; returns &lt;code&gt;200&lt;/code&gt;. &lt;code&gt;"٢٠٠".isdigit()&lt;/code&gt; is &lt;code&gt;True&lt;/code&gt;. &lt;code&gt;re.findall(r"\d+", ...)&lt;/code&gt; finds them, because &lt;code&gt;\d&lt;/code&gt; is Unicode-aware by default.&lt;/p&gt;

&lt;p&gt;The thing that silently fails is the character class almost everyone actually writes:&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;re&lt;/span&gt;

&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;أكثر من ٢٠٠ متقدم&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;          &lt;span class="c1"&gt;# "more than 200 applicants"
&lt;/span&gt;
&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[0-9]+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# []          &amp;lt;- silently empty
&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\d+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ASCII&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# []          &amp;lt;- same trap
&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\d+&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;             &lt;span class="c1"&gt;# ['٢٠٠']     &amp;lt;- works
&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;٢٠٠&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                           &lt;span class="c1"&gt;# 200         &amp;lt;- works
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So a scraper that extracts applicant counts with &lt;code&gt;[0-9]+&lt;/code&gt; doesn't crash on an Arabic page. It reports that the page contains no numbers, forever, and you conclude the field is missing rather than that your regex is ASCII-only.&lt;/p&gt;

&lt;p&gt;If you want ASCII digits in your output regardless of the source, translate rather than strip:&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="n"&gt;ARABIC_DIGITS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;maketrans&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;٠١٢٣٤٥٦٧٨٩&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;0123456789&lt;/span&gt;&lt;span class="sh"&gt;"&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;to_int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\D&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;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ARABIC_DIGITS&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I nearly published the claim that &lt;code&gt;int()&lt;/code&gt; raises on Arabic numerals. It doesn't. I only found out because I ran the snippet before shipping the article, which is the entire moral of this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  Don't let a substring match decide a language
&lt;/h2&gt;

&lt;p&gt;Keyword matching across languages goes wrong in ways that are hard to see. Two real examples from classifying job titles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matching the seniority abbreviation &lt;code&gt;coo&lt;/code&gt; as a substring also matches &lt;strong&gt;"Coordinator"&lt;/strong&gt;. A programme coordinator became a chief operating officer.&lt;/li&gt;
&lt;li&gt;Matching &lt;code&gt;partner&lt;/code&gt; as a substring promoted &lt;strong&gt;"Partner Onboarding Specialist"&lt;/strong&gt; to firm partner.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Word boundaries fix both. But the general point is sharper in a bilingual dataset, where titles mix scripts, transliterations and English loanwords in the same string. &lt;code&gt;re.search(r"\bcoo\b", title)&lt;/code&gt;, never &lt;code&gt;"coo" in title&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Print the rows behind the number
&lt;/h2&gt;

&lt;p&gt;I was about to publish a statistic saying 18% of roles in a market were executive-level. It felt too high, so I printed the titles in that bucket. Half of them were coordinators and onboarding specialists. The real figure was 16%, and the composition was completely different.&lt;/p&gt;

&lt;p&gt;Every heuristic you write will be wrong in a way that flatters your numbers. Print the rows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Machine translation is for labels, not for meaning
&lt;/h2&gt;

&lt;p&gt;If you add Arabic labels to an English dataset, keep the original. Store &lt;code&gt;title&lt;/code&gt; and &lt;code&gt;titleArabic&lt;/code&gt; side by side; never overwrite. Translation is lossy, brand names transliterate inconsistently, and someone downstream will want to match on the original string.&lt;/p&gt;

&lt;p&gt;For job titles specifically, a translated label is a display convenience. Every join, dedupe and filter should still run on the source-language field.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encoding, briefly
&lt;/h2&gt;

&lt;p&gt;Set your encoding explicitly at every boundary: reading files, writing files, and printing. On Windows the default console encoding will happily raise &lt;code&gt;UnicodeEncodeError&lt;/code&gt; on a perfectly good Arabic string, which sends you hunting for a scraping bug that doesn't exist.&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="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reconfigure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;pathlib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Path&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;read_text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;encoding&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;utf-8&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;Also: a UTF-8 byte order mark at the start of a JSON file will make some parsers reject it outright. If a tool insists your valid JSON is invalid, check for a BOM before you check your syntax.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this came from
&lt;/h2&gt;

&lt;p&gt;I maintain scrapers for regional job boards that output company and role labels in both Arabic and English. All of the above is scar tissue from building them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apify.com/get_anything" rel="noopener noreferrer"&gt;They're on my Apify page&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>webscraping</category>
      <category>data</category>
      <category>i18n</category>
    </item>
  </channel>
</rss>
