<?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: Kabeer Ahmed</title>
    <description>The latest articles on DEV Community by Kabeer Ahmed (@kabeer099).</description>
    <link>https://dev.to/kabeer099</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%2F4206996%2Fa437acef-6af6-4750-b6d6-2d0636c8d0e0.png</url>
      <title>DEV Community: Kabeer Ahmed</title>
      <link>https://dev.to/kabeer099</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kabeer099"/>
    <language>en</language>
    <item>
      <title>Building 8 Production Web Scrapers &amp; Manifest V3 Browser Extensions in Node.js</title>
      <dc:creator>Kabeer Ahmed</dc:creator>
      <pubDate>Sun, 25 Oct 2026 18:09:32 +0000</pubDate>
      <link>https://dev.to/kabeer099/building-8-production-web-scrapers-manifest-v3-browser-extensions-in-nodejs-4m08</link>
      <guid>https://dev.to/kabeer099/building-8-production-web-scrapers-manifest-v3-browser-extensions-in-nodejs-4m08</guid>
      <description>&lt;p&gt;Over the past few weeks, I built and shipped 8 production cloud scrapers on the &lt;a href="https://apify.com/kabeer099" rel="noopener noreferrer"&gt;Apify Store&lt;/a&gt; alongside two cross-browser Manifest V3 extensions on the Mozilla Add-ons Store.&lt;/p&gt;

&lt;p&gt;Most scraping tutorials default to spinning up full headless Chromium instances for every URL. While Playwright and Puppeteer are essential when dealing with heavy client-side hydration, they are often overkill for structured B2B extraction, e-commerce catalog indexing, and technical SEO auditing. By combining &lt;code&gt;CheerioCrawler&lt;/code&gt; in &lt;a href="https://crawlee.dev/" rel="noopener noreferrer"&gt;Crawlee&lt;/a&gt; with hidden platform JSON endpoints and regex-backed DOM parsers, you can cut memory overhead and runtime costs by over 85%.&lt;/p&gt;

&lt;p&gt;Here is a practical look at the architecture behind these tools and where you can try them out.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Fast E-Commerce Catalog Extraction Without Headless Browsers
&lt;/h2&gt;

&lt;p&gt;When scraping Shopify or WooCommerce stores, rendering product grids in a headless browser is slow and fragile. Both platforms expose structured JSON APIs out of the box on almost every storefront:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shopify:&lt;/strong&gt; &lt;code&gt;GET /products.json?limit=250&amp;amp;page=1&lt;/code&gt; returns full product variants, SKUs, pricing, tags, and image URLs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;WooCommerce:&lt;/strong&gt; &lt;code&gt;GET /wp-json/wc/store/v1/products?per_page=100&lt;/code&gt; (Store API v1) exposes catalog items, stock status, and pricing metadata, with HTML fallback to Schema.org &lt;code&gt;Product&lt;/code&gt; JSON-LD when the REST route is restricted.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;fetchShopifyProducts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;maxProducts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/products.json?limit=250&amp;amp;page=1&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User-Agent&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Mozilla/5.0 (compatible; CatalogBot/1.0)&lt;/span&gt;&lt;span class="dl"&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;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[];&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;[]).&lt;/span&gt;&lt;span class="nf"&gt;slice&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="nx"&gt;maxProducts&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;p.title,&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="na"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;handle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;vendor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;vendor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;productType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;product_type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;price&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variants&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="nx"&gt;price&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;available&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;variants&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;available&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;false&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;I packaged these patterns into two dedicated cloud actors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/kabeer099/shopify-store-product-contact-scraper" rel="noopener noreferrer"&gt;Shopify Store Products, Pricing &amp;amp; Contact Scraper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/kabeer099/woocommerce-store-product-scraper" rel="noopener noreferrer"&gt;WooCommerce &amp;amp; WordPress Store Product &amp;amp; Contact Scraper&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  2. Converting Arbitrary Websites into Token-Sized Markdown Chunks for AI &amp;amp; RAG
&lt;/h2&gt;

&lt;p&gt;Feeding raw HTML into an LLM wastes context window tokens on navigation bars, cookie banners, inline SVGs, and tracking scripts. When building the &lt;a href="https://apify.com/kabeer099/website-to-markdown-ai-rag-scraper" rel="noopener noreferrer"&gt;Website to Clean Markdown &amp;amp; AI RAG Content Extractor&lt;/a&gt;, I structured the pipeline in three stages:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Boilerplate Stripping:&lt;/strong&gt; Remove &lt;code&gt;script&lt;/code&gt;, &lt;code&gt;style&lt;/code&gt;, &lt;code&gt;noscript&lt;/code&gt;, &lt;code&gt;svg&lt;/code&gt;, &lt;code&gt;nav&lt;/code&gt;, &lt;code&gt;footer&lt;/code&gt;, &lt;code&gt;header&lt;/code&gt;, and &lt;code&gt;aside&lt;/code&gt; nodes via Cheerio before inspecting text nodes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Semantic Markdown Conversion:&lt;/strong&gt; Convert headings (&lt;code&gt;h1&lt;/code&gt; to &lt;code&gt;h6&lt;/code&gt;), lists, tables, code blocks, and anchor links into clean Markdown while preserving document hierarchy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token-Aware Chunking:&lt;/strong&gt; Split long documents on heading boundaries into configurable chunk sizes (e.g. 500 to 1,000 words) with metadata (&lt;code&gt;url&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;chunkIndex&lt;/code&gt;, &lt;code&gt;estimatedTokens&lt;/code&gt;) ready for direct ingestion into vector databases like Pinecone, Qdrant, or pgvector.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. Detecting 40+ Tech Stack Signatures, Ad Pixels &amp;amp; B2B Contact Signals
&lt;/h2&gt;

&lt;p&gt;For sales intelligence and agency prospecting, knowing whether a company runs Shopify Plus, Next.js, HubSpot, Klaviyo, Meta Pixel, or Google Tag Manager is just as important as finding their contact email.&lt;/p&gt;

&lt;p&gt;In the &lt;a href="https://apify.com/kabeer099/website-tech-stack-detector" rel="noopener noreferrer"&gt;Website Tech Stack, Pixel &amp;amp; CMS Detector&lt;/a&gt;, each page response is evaluated across four lightweight inspection layers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Script &lt;code&gt;src&lt;/code&gt; &amp;amp; Link &lt;code&gt;href&lt;/code&gt; patterns:&lt;/strong&gt; Detects CDN signatures (&lt;code&gt;cdn.shopify.com&lt;/code&gt;, &lt;code&gt;/_next/static/&lt;/code&gt;, &lt;code&gt;js.hs-scripts.com&lt;/code&gt;, &lt;code&gt;static.klaviyo.com&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inline Script Globals:&lt;/strong&gt; Matches initialization snippets such as &lt;code&gt;fbq('init'&lt;/code&gt;, &lt;code&gt;gtag('config'&lt;/code&gt;, &lt;code&gt;lintrk&lt;/code&gt;, and &lt;code&gt;ttq.load&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Meta Generator &amp;amp; DOM Attributes:&lt;/strong&gt; Checks &lt;code&gt;meta[name="generator"]&lt;/code&gt;, &lt;code&gt;data-wf-site&lt;/code&gt; (Webflow), and &lt;code&gt;ng-version&lt;/code&gt; (Angular).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTP Response Headers:&lt;/strong&gt; Inspects &lt;code&gt;x-powered-by&lt;/code&gt;, &lt;code&gt;server&lt;/code&gt;, and &lt;code&gt;x-shopify-stage&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here are the rest of the B2B and SEO actors in the suite:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://apify.com/kabeer099/b2b-website-contact-scraper" rel="noopener noreferrer"&gt;B2B Website Email, Phone, WhatsApp &amp;amp; Social Links Scraper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/kabeer099/seo-meta-schema-auditor" rel="noopener noreferrer"&gt;Technical SEO, Meta Tags, OpenGraph &amp;amp; Schema JSON-LD Auditor&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/kabeer099/website-broken-link-sitemap-checker" rel="noopener noreferrer"&gt;Website Sitemap, Broken Links &amp;amp; Status Code Health Checker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://apify.com/kabeer099/company-careers-job-postings-scraper" rel="noopener noreferrer"&gt;Company Careers &amp;amp; Open Job Listings Scraper (Greenhouse, Lever &amp;amp; Ashby)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Shipping Cross-Browser Manifest V3 Extensions (Chrome &amp;amp; Firefox)
&lt;/h2&gt;

&lt;p&gt;Alongside the cloud scrapers, I wanted instant in-browser inspection tools when reviewing client websites. I built and published two Manifest V3 browser extensions on the official Mozilla Add-ons Store:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/leadsnap-pro-b2b-extractor/" rel="noopener noreferrer"&gt;LeadSnap Pro - B2B Contact &amp;amp; Email Extractor&lt;/a&gt;:&lt;/strong&gt; Extracts verified emails, phone numbers, WhatsApp links, and social profiles directly from the active tab DOM and &lt;code&gt;mailto:&lt;/code&gt; / &lt;code&gt;tel:&lt;/code&gt; links, with one-click CSV and JSON export.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/metapeek-pro-seo-auditor/" rel="noopener noreferrer"&gt;MetaPeek Pro - Technical SEO &amp;amp; Schema Auditor&lt;/a&gt;:&lt;/strong&gt; Audits canonical URLs, title/description pixel lengths, heading hierarchy (&lt;code&gt;H1&lt;/code&gt; to &lt;code&gt;H6&lt;/code&gt;), OpenGraph/Twitter cards, image alt coverage, and Schema.org JSON-LD blocks in real time.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Tip for Cross-Browser MV3 Manifests
&lt;/h3&gt;

&lt;p&gt;When packaging a single Manifest V3 codebase for both Chromium and Firefox, remember that Firefox requires &lt;code&gt;browser_specific_settings.gecko.id&lt;/code&gt; and currently uses background scripts or event pages alongside standard &lt;code&gt;scripting&lt;/code&gt; and &lt;code&gt;activeTab&lt;/code&gt; permissions. Keeping your DOM analyzer inside a self-contained content script injected via &lt;code&gt;chrome.scripting.executeScript&lt;/code&gt; (with &lt;code&gt;browser.*&lt;/code&gt; fallback) makes the extension work seamlessly across both engines with zero external runtime dependencies.&lt;/p&gt;




&lt;h2&gt;
  
  
  Wrap-Up &amp;amp; Links
&lt;/h2&gt;

&lt;p&gt;All 8 cloud actors and both browser extensions are live right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Apify Store Profile (All 8 Actors):&lt;/strong&gt; &lt;a href="https://apify.com/kabeer099" rel="noopener noreferrer"&gt;https://apify.com/kabeer099&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;LeadSnap Pro on Firefox Add-ons:&lt;/strong&gt; &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/leadsnap-pro-b2b-extractor/" rel="noopener noreferrer"&gt;https://addons.mozilla.org/en-US/firefox/addon/leadsnap-pro-b2b-extractor/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MetaPeek Pro on Firefox Add-ons:&lt;/strong&gt; &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/metapeek-pro-seo-auditor/" rel="noopener noreferrer"&gt;https://addons.mozilla.org/en-US/firefox/addon/metapeek-pro-seo-auditor/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/Kabeer099" rel="noopener noreferrer"&gt;https://github.com/Kabeer099&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Portfolio:&lt;/strong&gt; &lt;a href="https://kabeer.site/" rel="noopener noreferrer"&gt;https://kabeer.site/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you are building data pipelines, e-commerce integrations, or custom web applications and want to chat, feel free to reach out through my portfolio or GitHub!&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
