<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[The Web Scraping Club]]></title><description><![CDATA[News, solutions and interviews about web scraping.
In this substack you will find weekly content about:
- Web Scraping techniques
- Interviews with key people in the industry
- Anti bot infos and counter measures
- Real world examples and code]]></description><link>https://www.scraping.club</link><image><url>https://substackcdn.com/image/fetch/$s_!gJt2!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fbucketeer-e05bbc84-baa3-437e-9518-adb32be77984.s3.amazonaws.com%2Fpublic%2Fimages%2F1e343ec9-7946-4440-8c00-57209a1d99a1_1024x1024.png</url><title>The Web Scraping Club</title><link>https://www.scraping.club</link></image><generator>Substack</generator><lastBuildDate>Sun, 04 Oct 2026 21:17:13 GMT</lastBuildDate><atom:link href="https://www.scraping.club/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[The Web Scraping Club SRL]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[pier@thewebscraping.club]]></webMaster><itunes:owner><itunes:email><![CDATA[pier@thewebscraping.club]]></itunes:email><itunes:name><![CDATA[Pierluigi Vinciguerra]]></itunes:name></itunes:owner><itunes:author><![CDATA[Pierluigi Vinciguerra]]></itunes:author><googleplay:owner><![CDATA[pier@thewebscraping.club]]></googleplay:owner><googleplay:email><![CDATA[pier@thewebscraping.club]]></googleplay:email><googleplay:author><![CDATA[Pierluigi Vinciguerra]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Can invisible_playwright Beat Bot Detection? A Hands-On Test and Review]]></title><description><![CDATA[Have we finally found a good replacement for playwright-stealth, or even a strong alternative to Camoufox or Patchright?]]></description><link>https://www.scraping.club/p/invisible-playwright-beat-bot-detection-scraping</link><guid isPermaLink="false">https://www.scraping.club/p/invisible-playwright-beat-bot-detection-scraping</guid><dc:creator><![CDATA[Antonello Zanini]]></dc:creator><pubDate>Sun, 04 Oct 2026 13:14:11 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/7ebafb85-ee43-4b49-8b07-d1573adc4d8e_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>invisible_playwright is an open-source anti-detect browser engine for Playwright. It lets you write automation scripts that control Firefox while reducing the risk of bot detection.</p><p>In this post, I&#8217;ll explain what the tool is, how it works, and which features it offers. I&#8217;ll also show you how to use it, evaluate its performance against anti-bot detection systems, and compare it with other similar libraries.</p><h2>What Is invisible_playwright?</h2><p><a href="https://github.com/feder-cr/invisible_playwright">invisible_playwright</a> is a Python library created by <a href="https://it.linkedin.com/in/federico-elia-5199951b6">Federico Elia</a>. It patches Firefox at the C++ source level to help bypass bot detection systems.</p><p>The project is open source and free to use, and is designed to help avoid anti-bot systems and CAPTCHA challenges such as reCAPTCHA v3, Cloudflare Turnstile, DataDome, Kasada, Akamai Bot Manager, PerimeterX, hCaptcha, and Imperva.</p><p>The library addresses two questions that anti-bot systems typically ask:</p><ol><li><p><em>Is this a real browser?</em> Yes, as the tool employs Firefox patched at the native level.</p></li><li><p><em>Is a real person using it?</em> It simulates human-like interactions to make automated activity look more natural.</p></li></ol><p>At its core, invisible_playwright works as a drop-in replacement for Playwright. The core difference is that it combines a modified browser engine, configurable fingerprints, and built-in human-like interactions. As of this writing, the project boasts more than 2k GitHub stars!</p><p>Further reading:</p><ul><li><p><em><a href="https://github.com/feder-cr/invisible_playwright/tree/main/docs">Official documentation</a></em></p></li><li><p><em><a href="https://github.com/feder-cr/invisible_playwright/wiki">Official wiki</a></em></p></li><li><p><em><a href="https://github.com/feder-cr/invisible_playwright/blob/main/docs/guides.md">Official guides</a></em></p></li><li><p><em><a href="https://publish.obsidian.md/twsc-public/Web+Scraping/Wiki/entities/invisible-playwright">invisible_playwright TWSC wiki page</a></em></p></li></ul><div><hr></div><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p><div><hr></div></blockquote><h2>Main Features</h2><p>Now that you know what invisible_playwright is, let me introduce what it brings to the table.</p><h3>Drop-In Playwright Replacement</h3><p>invisible_playwright is 100% compatible with Playwright. That means you don&#8217;t need to rewrite your code. Both sync and async work, and every method remains the same. So, there&#8217;s no learning curve.</p><p>You can switch from standard Playwright like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!QLb5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!QLb5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png 424w, https://substackcdn.com/image/fetch/$s_!QLb5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png 848w, https://substackcdn.com/image/fetch/$s_!QLb5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png 1272w, https://substackcdn.com/image/fetch/$s_!QLb5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!QLb5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png" width="1456" height="228" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:228,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Old code vs new code&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Old code vs new code" title="Old code vs new code" srcset="https://substackcdn.com/image/fetch/$s_!QLb5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png 424w, https://substackcdn.com/image/fetch/$s_!QLb5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png 848w, https://substackcdn.com/image/fetch/$s_!QLb5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png 1272w, https://substackcdn.com/image/fetch/$s_!QLb5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fea433a74-c230-44f6-9c9d-db3a321bc909_1676x262.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Old code vs new code</figcaption></figure></div><p>That&#8217;s the only change needed. Now, each Playwright browser automation session will automatically get a distinct fingerprint. Note that the <a href="https://www.scraping.club/p/understanding-browser-fingerprint">browser fingerprint</a> generated includes GPU, audio, fonts, screen, and roughly 200 other fields.</p><h3>Human-like movement and interaction</h3><p>invisible_playwright simulates more natural mouse interactions. As opposed to instantly moving the pointer to a target, the cursor travels toward the target along a human-like path. This behavior is controlled through the <code>humanize</code> option, which applies to actions such as clicking, hovering, and dragging.</p><p>Enabled by default (<code>humanize=True</code>), you can disable it by setting it to <code>False</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">with InvisiblePlaywright(humanize=True) as browser:
    page = browser.new_page()
    # Browser automation logic....</code></pre></div><h3>Fingerprint Seeds for Reproducibility</h3><p>To make runs reproducible, you can pin a specific fingerprint. This helps with debugging, as if a scrape fails with a specific seed, you can replay it exactly.</p><p>You can use this feature like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python"># Initialize the InvisiblePlaywright engine
sf = InvisiblePlaywright()

# Create a new Playwright-like browser instance
with sf as browser:
    # Access the randomly assigned fingerprint for each run.
    print("seed =", sf.seed)

    page = browser.new_page()
    # Browser automation logic....</code></pre></div><p>This will produce an output like this:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sjLe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sjLe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png 424w, https://substackcdn.com/image/fetch/$s_!sjLe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png 848w, https://substackcdn.com/image/fetch/$s_!sjLe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png 1272w, https://substackcdn.com/image/fetch/$s_!sjLe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sjLe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png" width="1456" height="26" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:26,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the seed number&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the seed number" title="Note the seed number" srcset="https://substackcdn.com/image/fetch/$s_!sjLe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png 424w, https://substackcdn.com/image/fetch/$s_!sjLe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png 848w, https://substackcdn.com/image/fetch/$s_!sjLe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png 1272w, https://substackcdn.com/image/fetch/$s_!sjLe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7982e1db-490b-4eee-9804-b17cc5764d0c_2150x38.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Note the seed number</figcaption></figure></div><p>Then, you can reuse the same fingerprint with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python"># Same fingerprint every time
with InvisiblePlaywright(seed=1561645783) as browser:
    page = browser.new_page()
    # Browser automation logic....</code></pre></div><p>The seed-based fingerprint generation adopted by invisible_playwright is deterministic. In other words, you are not rolling the dice on every run. Instead, the fingerprint is derived from a known seed value, making the same fingerprint reproducible across runs. This makes bugs easier to reproduce and debug, which is particularly useful when <a href="https://www.scraping.club/p/python-async-for-faster-scraping">scraping at scale</a>.</p><h3>Proxy Support</h3><p>invisible_playwright natively supports SOCKS5, SOCKS4, HTTP, and HTTPS proxies. You can configure a proxy as follows:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">proxy = {
    "server": "http://your-proxy-domain.com:1234",
    "username": "my_wonderful_username",
    "password": "my_very_secret_password",
}
with InvisiblePlaywright(proxy=proxy) as browser:
    page = browser.new_page()
    page.goto("https://example.com")</code></pre></div><p>DNS traffic is routed through the proxy by default, helping prevent local DNS leaks. The timezone is automatically derived from the proxy&#8217;s exit IP, keeping the browser configuration consistent with the proxy location.</p><p>If needed, you can override it by specifying a custom timezone:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">with InvisiblePlaywright(proxy=proxy, timezone="Europe/Rome") as browser:
    #  Browser automation logic....</code></pre></div><div><hr></div><blockquote><p><em>Reliable access is the foundation of any scraping project. <strong><a href="https://iproyal.com/pricing/residential-proxies/?r=380132">IPRoyal</a></strong> offers 64M+ residential IPs to help you reach any website without blocks or bans.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://iproyal.com/pricing/residential-proxies/?r=380132" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!uAvv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!uAvv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!uAvv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!uAvv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!uAvv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png" width="1024" height="512" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:506839,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://iproyal.com/pricing/residential-proxies/?r=380132&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/215976609?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!uAvv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!uAvv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!uAvv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!uAvv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3991eff8-5610-424e-a59f-fa2f006ee3f3_1024x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://iproyal.com/pricing/residential-proxies/?r=380132&quot;,&quot;text&quot;:&quot;Visit IPRoyal&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://iproyal.com/pricing/residential-proxies/?r=380132"><span>Visit IPRoyal</span></a></p></blockquote><div><hr></div><h3>Custom Fingerprint Fields</h3><p>invisible_playwright lets you pin specific fingerprint fields while keeping the remaining fields derived from the seed. You can do that through the <code>pin</code> parameter:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">with InvisiblePlaywright(
    seed=1561645783,
    pin={
        "gpu.renderer": "ANGLE (AMD, AMD Radeon RX 7900 XTX Direct3D11)",
        "gpu.vendor": "Google Inc. (AMD)",
        "screen.width": 1920,
        "screen.height": 1080,
        "hardware.concurrency": 8,
    },
) as browser:
    page = browser.new_page()
    # Browser automation logic...</code></pre></div><p>In this example, the GPU, screen resolution, and CPU core count remain fixed, while other fingerprint fields continue to be generated from the seed. That&#8217;s useful when you want to target a specific device configuration without manually defining the entire fingerprint.</p><h3>CLI Usage</h3><p>The <a href="https://pypi.org/project/invisible-playwright/">PyIP </a><code>invisible-playwright</code><a href="https://pypi.org/project/invisible-playwright/"> package</a> installs an <code>invisible-playwright</code> CLI command. The main supported commands are:</p><ul><li><p><code>invisible-playwright fetch</code>: Downloads the patched browser engine if it&#8217;s not already installed. The download is approximately 240&#8211;265 MB, depending on your platform. The engine is cached locally after the first download, and the command also verifies its SHA-256 hash.</p></li><li><p><code>invisible-playwright version</code>: Displays version information for the patched browser engine, the invisible_playwright library, and other information.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eV3A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eV3A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png 424w, https://substackcdn.com/image/fetch/$s_!eV3A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png 848w, https://substackcdn.com/image/fetch/$s_!eV3A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png 1272w, https://substackcdn.com/image/fetch/$s_!eV3A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eV3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png" width="1456" height="97" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:97,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The output of the &#8220;invisible-playwright version&#8221; command&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The output of the &#8220;invisible-playwright version&#8221; command" title="The output of the &#8220;invisible-playwright version&#8221; command" srcset="https://substackcdn.com/image/fetch/$s_!eV3A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png 424w, https://substackcdn.com/image/fetch/$s_!eV3A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png 848w, https://substackcdn.com/image/fetch/$s_!eV3A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png 1272w, https://substackcdn.com/image/fetch/$s_!eV3A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd77f4bd4-9b81-4998-bb82-3b863145e566_2760x184.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The output of the &#8220;invisible-playwright version&#8221; command</figcaption></figure></div><h3>MCP Server</h3><p>invisible_playwright can also run as an <a href="https://github.com/feder-cr/AIHawk/wiki/mcp-server">MCP server</a>, giving Claude Code, Claude Desktop, Cursor, Codex, and all other MCP-compatible clients access to a real stealth Firefox browser.</p><p>The exposed MCP server supports navigation, page reading, clicking, typing, screenshots, and JavaScript-based data extraction. You can register it in Claude Code with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">claude mcp add stealth -- uvx aihawk</code></pre></div><p>The server is bundled via <a href="https://github.com/feder-cr/AIHawk">AIHawk</a>, which also provides a UI and OpenRouter support for users who prefer not to work directly from the command line.</p><h3>Multiple Integrations</h3><p>invisible_playwright works with a long list of Python frameworks:</p><ul><li><p>Scrapy, via the <code>scrapy-playwright</code> middleware.</p></li><li><p>Crawlee for Python, with a plugin subclass or single-line setup.</p></li><li><p>Playwright MCP, with two flags on the Microsoft server.</p></li><li><p>CodeceptJS, through the <code>firefox</code> block configuration.</p></li><li><p>Robot Framework Browser, with named keyword arguments.</p></li><li><p><a href="https://github.com/feder-cr/invisible_playwright/tree/main/docs/integrations">And more&#8230;</a></p></li></ul><h2>How invisible_playwright Avoids Anti-Bot Triggering</h2><p>Anti-bot systems generally rely on two main signals to detect automated browsers:</p><ol><li><p>Browser identity, via fingerprinting signals.</p></li><li><p>Interaction behavior, such as whether mouse movements and clicks resemble those of a real user.</p></li></ol><p>invisible_playwright addresses both areas by patching Firefox at the source level and supporting human-like interactions. Discover how!</p><h3>Browser Identity and C++ Level Patching</h3><p>Vanilla Playwright relies on the host machine&#8217;s native browser fingerprint and the default configuration of a fresh browser session. Signals like GPU, installed fonts, screen resolution, canvas rendering, and other browser properties can make automated sessions easier to identify.</p><p>invisible_playwright addresses this by <a href="https://www.scraping.club/p/fingerprint-injection-playwright">patching Firefox at the source-code level</a>. Instead of injecting spoofed values through page-level JavaScript, it sets fingerprint data inside the browser engine before it becomes accessible to scripts.</p><p>Rather than <a href="https://www.scraping.club/p/browser-api-an-introduction">simply spoofing </a><code>navigator.webdriver</code> or injecting modified canvas data, the library configures several fingerprint surfaces, including:</p><ul><li><p>GPU and WebGL values that are coherent and matching.</p></li><li><p>Canvas and WebGL rendering that&#8217;s deterministic per seed.</p></li><li><p>Fonts bundled with the browser for consistency across platforms.</p></li><li><p>Audio context data from the profile instead of the host device.</p></li><li><p>WebRTC that offers a synthetic ICE candidate.</p></li><li><p>Timezone and DNS routed through the proxy.</p></li><li><p>Input events with proper <code>isTrusted</code> values.</p></li></ul><p>These properties are derived from a single seed, helping keep different fingerprint surfaces consistent with one another. Anti-bot systems can often identify spoofed environments when individual signals contradict each other, such as a browser reporting Windows-related properties alongside macOS-specific characteristics.</p><h3>Human-Like Input and Event Fields</h3><p>Most humanization libraries rely on <a href="https://pomax.github.io/bezierinfo/">B&#233;zier curves</a> to generate smooth mouse movements from point A to point B instead of instantly teleporting the cursor. That&#8217;s an improvement, but it may not be enough on its own. After all, a perfectly smooth curve with uniform timing can still look artificial.</p><p>invisible_playwright goes further by generating B&#233;zier-curve mouse paths from the selected seed. This makes movement patterns vary between browser identities while remaining reproducible for debugging.</p><p>It also patches the browser&#8217;s native input handling so pointer events contain more realistic values, including:</p><ul><li><p><strong>Variable timing</strong>: Movement timing adapts to the device&#8217;s refresh rate instead of following a uniform schedule.</p></li><li><p><strong>Appropriate pressure</strong>: Pressure is set to <code>0</code> while hovering and to a non-zero value when clicking.</p></li><li><p><strong>Correct pointer type</strong>: <code>pointerType</code> is consistently set to <code>mouse</code>.</p></li><li><p><strong>Accurate movement deltas</strong>: <code>movementX</code> and <code>movementY</code> reflect the actual pointer displacement.</p></li><li><p><strong>Sub-pixel coordinates</strong>: Pointer positions can account for fractional coordinates on scaled displays.</p></li></ul><p>These properties are determined by the browser&#8217;s native input-handling code, rather than being added or modified by the automation driver. Such a level of control requires patching the browser binary.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h2>invisible_playwright Against Popular Bot Detection Tests</h2><p>In this section, I&#8217;ll show you how to set up invisible_playwright and use it to score its performance against well-known bot detection tests:</p><ul><li><p><em><a href="https://antcpt.com/score_detector/">AntCpt.com&#8217;s Score Detector for reCAPTCHA v3</a></em></p></li><li><p><em><a href="https://www.apivoid.com/tools/bot-detection-test/">APIVoid&#8217;s Bot Detection Test</a></em></p></li><li><p><em><a href="https://cleantalk.org/am-i-a-bot">CleanTalk&#8217;s Am I a Bot?</a></em></p></li><li><p><em><a href="https://pixelscan.net/bot-check">Pixelscan&#8217;s Bot Detection Test</a></em></p></li></ul><h3>Prerequisites: Project Setup and Script Overview</h3><p>To use <code>invisible_playwright</code>, you need:</p><ul><li><p>Python 3.11 or newer.</p></li><li><p>Windows x86_64 or Linux x86_64/ARM64.</p></li></ul><p>In your Python project, install invisible_playwright with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">pip install invisible-playwright</code></pre></div><p>Then, download the patched browser engine using the CLI:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">invisible-playwright fetch</code></pre></div><p>You can now use invisible_playwright much like standard Playwright. For example, the following script opens a bot detection test page, waits 10 seconds for the test to complete, and takes a screenshot of the result:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">from invisible_playwright import InvisiblePlaywright

# Create a new InvisiblePlaywright instance
with InvisiblePlaywright() as browser:
    page = browser.new_page()

    # Visit the bot detection test and wait for 10 seconds
    page.goto("&lt;BOT_DETECTION_PAGE_TEST_URL&gt;")
    page.wait_for_timeout(10000)

    # Take a screenshot of the entire page
    page.screenshot(path="antibot-challenge.png")</code></pre></div><h3>Vs Fingerprint</h3><p>The result was:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5Pf3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5Pf3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png 424w, https://substackcdn.com/image/fetch/$s_!5Pf3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png 848w, https://substackcdn.com/image/fetch/$s_!5Pf3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png 1272w, https://substackcdn.com/image/fetch/$s_!5Pf3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5Pf3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png" width="1456" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;invisible_playwright vs Fingerprint&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="invisible_playwright vs Fingerprint" title="invisible_playwright vs Fingerprint" srcset="https://substackcdn.com/image/fetch/$s_!5Pf3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png 424w, https://substackcdn.com/image/fetch/$s_!5Pf3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png 848w, https://substackcdn.com/image/fetch/$s_!5Pf3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png 1272w, https://substackcdn.com/image/fetch/$s_!5Pf3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6750bd78-4ba2-420e-9307-e6291263b053_1920x947.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">invisible_playwright vs Fingerprint</figcaption></figure></div><p>Note the &#8220;Confidence Score&#8221; of 1 from Fingerprint, one of the most complete and popular device intelligence and visitor identification platforms.</p><h3>Vs AntCpt.com&#8217;s Score Detector for reCAPTCHA v3</h3><p>The result was:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ldPx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ldPx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png 424w, https://substackcdn.com/image/fetch/$s_!ldPx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png 848w, https://substackcdn.com/image/fetch/$s_!ldPx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!ldPx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ldPx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png" width="1456" height="809" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:809,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;invisible_playwright vs AntCpt.com's reCAPTCHA v3 score detector&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="invisible_playwright vs AntCpt.com's reCAPTCHA v3 score detector" title="invisible_playwright vs AntCpt.com's reCAPTCHA v3 score detector" srcset="https://substackcdn.com/image/fetch/$s_!ldPx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png 424w, https://substackcdn.com/image/fetch/$s_!ldPx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png 848w, https://substackcdn.com/image/fetch/$s_!ldPx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png 1272w, https://substackcdn.com/image/fetch/$s_!ldPx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fab63008d-b1af-46fc-96a5-cffb72e8437c_1920x1067.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">invisible_playwright vs AntCpt.com&#8217;s reCAPTCHA v3 score detector</figcaption></figure></div><p>A score of 0.9 is excellent and matches the score I achieved in my regular browser session.</p><h3>Vs APIVoid&#8217;s Bot Detection Test</h3><p>The result was:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!1tre!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!1tre!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png 424w, https://substackcdn.com/image/fetch/$s_!1tre!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png 848w, https://substackcdn.com/image/fetch/$s_!1tre!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png 1272w, https://substackcdn.com/image/fetch/$s_!1tre!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!1tre!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png" width="1456" height="743" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:743,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;invisible_playwright vs APIVoid's Bot Detection Test&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="invisible_playwright vs APIVoid's Bot Detection Test" title="invisible_playwright vs APIVoid's Bot Detection Test" srcset="https://substackcdn.com/image/fetch/$s_!1tre!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png 424w, https://substackcdn.com/image/fetch/$s_!1tre!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png 848w, https://substackcdn.com/image/fetch/$s_!1tre!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png 1272w, https://substackcdn.com/image/fetch/$s_!1tre!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd6b4871-0ab4-44f3-8271-1a8f1212c8dc_2560x1307.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">invisible_playwright vs APIVoid&#8217;s Bot Detection Test</figcaption></figure></div><p>The detected risk score was 0, indicating a very low likelihood that the session came from a bot.</p><h3>Vs CleanTalk&#8217;s Am I a Bot?</h3><p>The result was:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ts73!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ts73!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png 424w, https://substackcdn.com/image/fetch/$s_!Ts73!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png 848w, https://substackcdn.com/image/fetch/$s_!Ts73!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png 1272w, https://substackcdn.com/image/fetch/$s_!Ts73!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ts73!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png" width="1456" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;invisible_playwright vs CleanTalk's Am I a Bot?&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="invisible_playwright vs CleanTalk's Am I a Bot?" title="invisible_playwright vs CleanTalk's Am I a Bot?" srcset="https://substackcdn.com/image/fetch/$s_!Ts73!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png 424w, https://substackcdn.com/image/fetch/$s_!Ts73!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png 848w, https://substackcdn.com/image/fetch/$s_!Ts73!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png 1272w, https://substackcdn.com/image/fetch/$s_!Ts73!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F84488754-1e34-481a-ad31-7eef51982bf3_1920x947.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">invisible_playwright vs CleanTalk&#8217;s Am I a Bot?</figcaption></figure></div><p>The test returned a 100/100 score with a clear &#8220;Looks human&#8221; result.</p><h3>Vs Pixelscan&#8217;s Bot Detection Test</h3><p>The result was:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!9uml!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!9uml!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png 424w, https://substackcdn.com/image/fetch/$s_!9uml!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png 848w, https://substackcdn.com/image/fetch/$s_!9uml!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png 1272w, https://substackcdn.com/image/fetch/$s_!9uml!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!9uml!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png" width="1456" height="718" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:718,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;invisible_playwright vs Pixelscan's Bot Detection Test&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="invisible_playwright vs Pixelscan's Bot Detection Test" title="invisible_playwright vs Pixelscan's Bot Detection Test" srcset="https://substackcdn.com/image/fetch/$s_!9uml!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png 424w, https://substackcdn.com/image/fetch/$s_!9uml!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png 848w, https://substackcdn.com/image/fetch/$s_!9uml!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png 1272w, https://substackcdn.com/image/fetch/$s_!9uml!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadfe365c-b59c-4880-836b-4c673f2524ff_1920x947.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">invisible_playwright vs Pixelscan&#8217;s Bot Detection Test</figcaption></figure></div><p>The &#8220;You&#8217;re finally a Human&#8221; message is a strong indication that the tool successfully passed the test.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h3>Anti-Bot Performance Benchmarks</h3><p>To evaluate invisible_playwright, I ran a simple script against a chosen website protected by each of the major anti-bot systems. The results are summarized in the following table:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qWan!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qWan!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png 424w, https://substackcdn.com/image/fetch/$s_!qWan!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png 848w, https://substackcdn.com/image/fetch/$s_!qWan!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png 1272w, https://substackcdn.com/image/fetch/$s_!qWan!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qWan!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png" width="1456" height="402" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:402,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;invisible_playwright vs anti-bot performance benchmarks&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="invisible_playwright vs anti-bot performance benchmarks" title="invisible_playwright vs anti-bot performance benchmarks" srcset="https://substackcdn.com/image/fetch/$s_!qWan!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png 424w, https://substackcdn.com/image/fetch/$s_!qWan!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png 848w, https://substackcdn.com/image/fetch/$s_!qWan!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png 1272w, https://substackcdn.com/image/fetch/$s_!qWan!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1f92d05f-3dff-4f68-b07b-1dd038f66bca_1920x530.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">invisible_playwright vs anti-bot performance benchmarks</figcaption></figure></div><p><strong>Note</strong>: All tests were performed locally using my ISP-provided residential IP address.</p><p>In this limited experiment, invisible_playwright successfully loaded all five test sites, achieving a 100% success rate. By comparison, vanilla Playwright consistently failed in headless mode and also struggled with Kasada in headful mode.</p><h2>Comparisons with Other Stealth Browser Automation Tools</h2><p>This is how invisible_playwright compares with other <a href="https://www.scraping.club/p/browser-automation-landscape-2025">anti-detect browser automation tools</a>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mboM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mboM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png 424w, https://substackcdn.com/image/fetch/$s_!mboM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png 848w, https://substackcdn.com/image/fetch/$s_!mboM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png 1272w, https://substackcdn.com/image/fetch/$s_!mboM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mboM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png" width="1456" height="336" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:336,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;invisible_playwright vs other stealth browser automation tools&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="invisible_playwright vs other stealth browser automation tools" title="invisible_playwright vs other stealth browser automation tools" srcset="https://substackcdn.com/image/fetch/$s_!mboM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png 424w, https://substackcdn.com/image/fetch/$s_!mboM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png 848w, https://substackcdn.com/image/fetch/$s_!mboM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png 1272w, https://substackcdn.com/image/fetch/$s_!mboM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a6b3613-5e06-42ae-9e7b-9a2af7042141_1921x443.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">invisible_playwright vs other stealth browser automation tools</figcaption></figure></div><p>Each approach involves trade-offs. Firefox has a smaller market share than Chromium, which may itself be a detection signal. At the same time, it&#8217;s currently the only browser engine that can be patched at the native binary level.</p><p>Chromium-based tools typically patch the browser driver or inject JavaScript into the page, leaving more detectable surface area exposed.</p><p>playwright-stealth is lightweight and works with multiple browsers, but it relies on injected JavaScript, which anti-bot systems may detect. <a href="https://www.scraping.club/p/is-camoufox-still-effective-scraping">Camoufox uses a fingerprint database</a> in place of seed-derived values, so it doesn&#8217;t provide the same reproducibility across runs.</p><p>invisible_playwright, by contrast, focuses on reproducible fingerprints and deep, native-level browser patching.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Final Comment</h2><p>Let me get straight to the point: invisible_playwright looks like a very solid choice for web scraping projects where bot detection is a concern. The library not only performed well in my tests and delivered on its promises, but is also exceptionally well documented, with a long list of guides, examples, and low-level explanations of how it works.</p><p>There is one potential downside, though. Because of that, and the fact that the project is fully open source, anti-bot providers could potentially reverse-engineer its implementation as it gains adoption within the community.</p><p>That&#8217;s probably my biggest concern with the library, along with its reliance on a single main maintainer. However, both are challenges that apply to many open-source stealth browser automation tools.</p><p>I also want to add a personal note and give a shout-out to Federico Elia, the author of the library. In the era of AI, where almost anyone can vibe-code a product or library in a matter of hours, or even minutes, it&#8217;s genuinely refreshing to see this level of robustness and documentation. In my experience, that combination is still far from common. Well done!</p><p>The biggest advantages of invisible_playwright are definitely its full Playwright compatibility and straightforward setup. The seed-based fingerprinting is another particularly interesting feature that not all anti-detect browser automation libraries offer.</p><p>Keep in mind that the tool requires Firefox and Python. If you need Chromium or Node.js support, you&#8217;ll have to look elsewhere. Otherwise, I strongly recommend giving this project a try and seeing how it performs for yourself!</p><div><hr></div><p><em>Did you like this article? Share it with someone who might find it useful and get a discount on paid plans.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/invisible-playwright-beat-bot-detection-scraping?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/invisible-playwright-beat-bot-detection-scraping?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[What breaks in a long-running authenticated scraper session, and how to keep it logged in]]></title><description><![CDATA[Most scrapers work fine for a few hours, but not if you keep one logged in for a few weeks.]]></description><link>https://www.scraping.club/p/authenticated-scraper-sessions</link><guid isPermaLink="false">https://www.scraping.club/p/authenticated-scraper-sessions</guid><dc:creator><![CDATA[Joel Griffith]]></dc:creator><pubDate>Tue, 29 Sep 2026 08:01:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!G3Em!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>This is a guest post written by <span>Joel Griffith, Founder of </span><a href="https://www.browserless.io/?utm_source=thewebscrapingclub&amp;utm_medium=guest-post&amp;utm_campaign=authenticated-scraper-sessions"><span>Browserless</span></a>.</em></p><div><hr></div><p><span>Most authenticated scrapers I&#8217;ve seen don&#8217;t fail at login. They fail when one piece of state stops matching everything else, even while the login still seems valid.</span></p><p><span>That causes problems if you&#8217;re scraping account-gated dashboards, portals, or other authenticated applications over long periods. Saving a cookie can work well enough for a short-lived job. But if you run the same job for weeks, the login &#8220;state&#8221; becomes something you have to manage as well.</span></p><p><span>In my experience, you really have two options: save authenticated state and replay it into new browsers, or keep the same browser session alive. Both still end in re-authentication eventually.</span></p><p><span>So, what do you need to preserve, and what can safely be rebuilt?</span></p><h2><span>What does being logged in actually look like?</span></h2><p><span>It&#8217;s tempting to think of an authenticated session as one cookie, even though sometimes it is just that.</span></p><p><span>But more often, the browser ends up carrying authentication-related &#8220;signals&#8221; in several other places as well. You might have an HttpOnly session cookie, a token in localStorage, another value in IndexedDB, and a temporary token associated with an OAuth flow someplace else.</span></p><p><span>The issue is that all these technologies don&#8217;t share the same eviction timeframe, and sometimes those timeframes don&#8217;t align.</span></p><ul><li><p><span>A cookie could still exist locally after the server has invalidated the session behind it.</span></p></li><li><p><span>An access token may expire while a refresh token remains usable.</span></p></li><li><p><span>A refresh token may be rotated, meaning the old value stops working as soon as the new one is issued.</span></p></li><li><p><span>There&#8217;s another interim state that has changed: maybe an IP address or even geolocation changes.</span></p></li></ul><p><span>Some applications also make risk decisions using signals outside the state you saved, such as network location or characteristics of the browser making the request. This is the part that trips people up most: a person logs in by hand, and then a script picks up where they left off. Anti-bot detection loops run passively all the time, and if something looks suspicious, they&#8217;re quick to revoke access.</span></p><p><span>I&#8217;ve stopped thinking of it as logged in or logged out. It&#8217;s closer to three states: valid, stale, and recovering. The middle one is where I&#8217;ve lost the most time.</span></p><h2><span>Why a saved storageState snapshot always breaks eventually</span></h2><p><span>For most scraping jobs, replaying auth state into a fresh browser beats logging in on every run. Here&#8217;s what that looks like with Playwright:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;2a57431f-b33e-468e-be91-e4109040e7c6&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const context = await browser.newContext({
  storageState: &#8220;auth.json&#8221;,
});

const page = await context.newPage();
await page.goto(PROTECTED_URL);</code></pre></div><p><span>You authenticate once, persist the relevant state, then use it to bootstrap later browser contexts. Re-applying prior auth is much faster than repeating the login flow, for obvious reasons, and puts less load on the target. This means you don&#8217;t have to automate passwords or manage multi-factor authentication unnecessarily.</span></p><p><span>But there are a few gotchas, the biggest being: the state file only contains IndexedDB if you asked for it when you saved it.</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;beef4536-a8db-40a1-8c31-debc38f9f054&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">await context.storageState({ path: &#8220;auth.json&#8221;, indexedDB: true });</code></pre></div><p><span>The option was introduced in Playwright v1.51. On older versions, apps that keep tokens in IndexedDB (like Firebase Authentication) will silently lose them.</span></p><p><span>I think of auth.json as a photo of your login on the day you took it, not the login itself.</span></p><p><span>Imagine the scraper starts on Monday with a working token. On Wednesday, the application rotates that token during normal use. Your live browser now contains the new token, but the state file you created on Monday doesn&#8217;t.</span></p><p><span>Restart the worker on Thursday, and you restore Monday&#8217;s version of reality. You can start to see how this problem plays out, and why its nondeterministic state can cause a lot of confusion. To make matters worse, this &#8220;invalidation&#8221; can happen out of nowhere. If you&#8217;re paying per run, that isn&#8217;t just downtime. It&#8217;s money spent on scrapes that bring back a login page.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G3Em!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G3Em!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png 424w, https://substackcdn.com/image/fetch/$s_!G3Em!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png 848w, https://substackcdn.com/image/fetch/$s_!G3Em!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!G3Em!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G3Em!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G3Em!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png 424w, https://substackcdn.com/image/fetch/$s_!G3Em!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png 848w, https://substackcdn.com/image/fetch/$s_!G3Em!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!G3Em!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdccf93e3-9993-48a0-9958-049d4fbeddc7_2048x1152.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p><span>Cookies run into the same kind of trouble. Their local expiry tells you when the browser considers a cookie expired. It doesn&#8217;t tell you whether the server still accepts the session behind that cookie. In a perfect world, they&#8217;d always be in sync, but the web is anything but perfect!</span></p><p><span>Temporary state is another failure point. sessionStorage, for example, is deliberately scoped to a browser tab. Turn every piece of temporary browser state into something permanently replayable, and you can make authentication less reliable, particularly around redirects and CSRF protection.</span></p><p><span>My rule: assume any saved auth state is already going stale. Authenticated scraping is fundamentally a high-fault workflow, so take great care to ensure the system behaves as expected in production.</span></p><h2><span>Why not just keep the browser running?</span></h2><p><span>If replaying a snapshot loses state, the obvious alternative is to keep the original browser alive. For some workflows, that&#8217;s exactly what you need, but it can really depend on how long you need this transient state for.</span></p><p><span>A running browser preserves far more than a cookie file. Open tabs and JavaScript state survive, and storage updates happen naturally. If the application refreshes a token in the background, the browser keeps the new value rather than reverting to an older snapshot on the next run.</span></p><p><span>While trading off persistence for long-running processes, you&#8217;ve traded one problem for another, </span><em><span>and</span></em><span> you still haven&#8217;t solved it! Instead of asking whether your authentication state can survive for three weeks, you&#8217;re asking whether a Chrome process can. I wouldn&#8217;t bet on the Chrome process.</span></p><p><span>Long-running browser processes fail in ordinary ways:</span></p><ul><li><p><span>Pages leak memory.</span></p></li><li><p><span>Connections disappear.</span></p></li><li><p><span>Hosts restart.</span></p></li><li><p><span>Deployments happen.</span></p></li><li><p><span>Chrome crashes.</span></p></li><li><p><span>Your automation code crashes even when Chrome doesn&#8217;t.</span></p></li><li><p><span>... and all these problems compound with one another!</span></p></li></ul><p><span>You&#8217;re also limited when you need to scale. One persistent browser is one mutable environment. If ten workers need the same account, letting all ten operate against one live browser introduces coordination problems. With a saved state snapshot, each worker gets its own isolated copy instead.</span></p><p><span>A long-lived browser is useful when you need continuity inside the browser, but it isn&#8217;t a general replacement for saved state.</span></p><h2><span>How can you detect an expired session?</span></h2><p><span>The worst recovery strategy is waiting for the scraper to throw an exception, because authentication failures often don&#8217;t throw one.</span></p><p><span>A protected URL might respond with a 302 to /login. Another site returns 200, but the HTML is now a sign-in screen. An API request might start returning 401. Some applications send you to an account verification flow instead.</span></p><p><span>I normally want an authenticated scraper to validate application state explicitly after restoring a session. Here&#8217;s a quick example:</span></p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;1cc29ba3-334e-4235-841d-47aad909ed34&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">await page.goto(PROTECTED_URL, {
  waitUntil: &#8220;domcontentloaded&#8221;,
});

const authenticated =
  !page.url().includes(&#8221;/login&#8221;) &amp;&amp;
  (await page.locator(&#8221;[data-account-id]&#8221;).count()) &gt; 0;

if (!authenticated) {
  await reauthenticate(page);
  await saveFreshState(page);
}</code></pre></div><p><span>Here we&#8217;re using other signals on the page to determine if it&#8217;s properly authenticated or not. We don&#8217;t ask whether the cookie exists; instead, we ask whether the application still considers the browser authenticated. You </span><em><span>could </span></em><span>script up a cookie check, but from what we&#8217;ve seen running this at Browserless, cookie checks are brittle and throw a lot of false positives.</span></p><p><span>In production, I&#8217;d also distinguish auth failure from ordinary scraping failure. A changed selector shouldn&#8217;t trigger a login. Neither should a 500, a network timeout, or a missing asset. Otherwise, a minor site change becomes hundreds of unnecessary login attempts, which is a much worse failure mode. That&#8217;s a mistake you only need to make once. You have to pick one or two of the </span><em><span>strongest </span></em><span>signals you can see on the page and use those for your authentication condition check.</span></p><h2><span>When is re-authentication the right answer?</span></h2><p><span>Re-authentication tends to get treated as something a good persistence system should eliminate. I&#8217;d argue the opposite: it&#8217;s a recovery path you should design deliberately. I&#8217;ve never run a system that works 100% of the time, even ones we own end to end. I don&#8217;t expect it from a script running against someone else&#8217;s site.</span></p><p><span>If login is cheap and stable, periodically rebuilding state can be simpler than maintaining a browser indefinitely. Preserving authenticated state becomes much more valuable when login involves MFA, email links, or aggressive rate limits. Either way, you want re-authentication to happen only after you&#8217;ve positively identified expiry.</span></p><p><span>Your choice also hinges on concurrency. If many workers need the same authenticated starting point, a reusable snapshot lets each one launch its own browser from it. Keeping the browser itself alive makes more sense when a workflow relies on in-progress UI state.</span></p><p><span>In practice, reliable systems often use both. Start sessions from a known authenticated snapshot, let each browser mutate normally while it is alive, and validate authentication before doing expensive work. When the saved snapshot is no longer accepted, run the login flow again and replace it.</span></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!LPBy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!LPBy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png 424w, https://substackcdn.com/image/fetch/$s_!LPBy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png 848w, https://substackcdn.com/image/fetch/$s_!LPBy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!LPBy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!LPBy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!LPBy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png 424w, https://substackcdn.com/image/fetch/$s_!LPBy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png 848w, https://substackcdn.com/image/fetch/$s_!LPBy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png 1272w, https://substackcdn.com/image/fetch/$s_!LPBy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1902392c-5f28-4659-84bb-a50df3758fc0_2048x1152.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2><span>Saved state and live sessions solve different needs</span></h2><p><span>We ran into this distinction while building authenticated session support at Browserless.</span></p><p><span>Our </span><a href="https://docs.browserless.io/baas/features/authenticated-profiles"><span>Authenticated Profiles</span></a><span> feature stores cookies, localStorage, and IndexedDB, then loads a copy of that state into a fresh browser session. We deliberately skip sessionStorage, since replaying temporary tab state can break short-lived flows such as OAuth redirects and CSRF handling.</span></p><p><span>Changes made inside one of those browsers don&#8217;t rewrite the original saved profile. Think of it as a fresh copy of the authentication state, or a reference by value and not address. If the underlying authentication state expires, the profile needs to be refreshed.</span></p><p><span>That is deliberately separate from session persistence, which comes in two flavors. A standard session flags the running browser as reconnectable mid-script, so you can drop back into the same process, same page, and same in-memory state within a short window.</span></p><p><span>Persisting state goes further: the Session API keeps cookies, localStorage, and cache in an isolated userDataDir that survives full browser restarts for days, and processKeepAlive decides whether the process stays up in between. The two combine: pass a profile name when you create the session, and the browser starts from that saved auth state and then persists normally.</span></p><p><span>One caveat for Playwright users: both of the keep-the-process-alive paths rely on browser.disconnect(), which Playwright doesn&#8217;t expose, so with Playwright you get the on-disk state but not the live process.</span></p><p><span>This distinction forces you to decide what you actually need. Do you need the same authentication state, or do you need the same browser?</span></p><p><span>Once your scraper runs for weeks rather than minutes, those stop being interchangeable.</span></p><h2><span>Plan for the logout</span></h2><p><span>If I could give one piece of advice to anyone building an authenticated scraper, it&#8217;s to stop trying to keep the session alive forever. We spent a lot of time on this problem while building Browserless, and the biggest shift for us was treating a logout as a state to plan for and not a bug to get rid of.</span></p><p><span>Every session goes stale eventually. What separates a scraper that runs for weeks from one that falls over on day three is whether it notices. So I save the full picture: cookies, localStorage, and IndexedDB, but not sessionStorage. I ask the app whether I&#8217;m still logged in instead of trusting a cookie. And I only log in again once I&#8217;ve confirmed the session is gone, then replace the snapshot so the next worker isn&#8217;t starting from last Monday.</span></p><p><span>As for snapshots versus live browsers, I&#8217;d stop thinking of it as a choice. Most setups I&#8217;d put into production use both.</span></p><p><span>You won&#8217;t build a session that never expires, and I wouldn&#8217;t try. Build one that knows when it&#8217;s expired and fixes itself before anyone gets paged. And if you&#8217;ve found a pattern that holds up longer than this, I&#8217;d like to hear about it!</span></p>]]></content:encoded></item><item><title><![CDATA[How to Use Scraping to Analyze Social Media Trends]]></title><description><![CDATA[A deep dive int how to build a multi-platform social media scraping pipeline that turns posts, hashtags, and engagement data into meaningful trend insights.]]></description><link>https://www.scraping.club/p/how-to-scrape-social-media</link><guid isPermaLink="false">https://www.scraping.club/p/how-to-scrape-social-media</guid><dc:creator><![CDATA[Federico Trotta]]></dc:creator><pubDate>Sun, 27 Sep 2026 15:54:23 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/350aa11a-91df-4766-854f-0f7243d47c19_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Social media trend analysis starts with a simple question: &#8220;What are people starting to talk about, and how do I catch it before it becomes obvious?&#8221;</p><p>You could scroll through feeds, follow hashtags, and check what each platform labels as trending. But that only gives you part of the picture. This happens because conversations move across platforms, engagement changes over time, and what looks like growing interest might just be the same content reposted over and over.</p><p>That&#8217;s where social media scraping comes in and makes the game easier. If you&#8217;re wondering why, the answer is simple: it lets you collect posts and engagement metrics systematically, then track how conversations evolve. However, collecting the data isn&#8217;t enough. You need a pipeline that separates meaningful signals from noise, handles differences between platforms, and accounts for the legal requirements of collecting and using social data.</p><p>In this article, we&#8217;ll discuss how to choose your sources, build the collection infrastructure, extract and clean trend signals with Python, and turn them into useful analysis.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p><div><hr></div></blockquote><h2>Understanding the Social Media Data Landscape</h2><p>Before writing code, you need to map out the platform landscape you&#8217;re targeting. Social media scraping isn&#8217;t a one-size-fits-all discipline because each platform exposes data differently, enforces its own limits, and deploys different anti-bot measures.</p><p>So, you can&#8217;t just pick a social media platform at random and think to apply a scraping strategy to other platforms. You must align your platform choice with your trend-analysis goals and with the technical features each platform has.</p><h3>Checking for Platform-Specific Data Structures</h3><p>Once you&#8217;ve picked your social media targets, you&#8217;ll quickly notice that no two platforms structure their data the same way:</p><ul><li><p>Some platforms expose posts and engagement metrics through JSON-based GraphQL responses.</p></li><li><p>Others return JSON too, but through obfuscated and session-dependent internal APIs. And these are harder to reverse-engineer.</p></li><li><p>Others rely on server-rendered HTML. And this requires a more fragile extraction, as it is selector-based. But remember that, in such cases, a possible solution is <a href="https://www.scraping.club/p/scraping-with-llms-gpt-vision">using GPT vision to extract the data</a>.</p></li></ul><p>To make an example, X (formerly Twitter) fetches data through internal GraphQL endpoints visible in the browser through the DevTools:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gTzT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gTzT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png 424w, https://substackcdn.com/image/fetch/$s_!gTzT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png 848w, https://substackcdn.com/image/fetch/$s_!gTzT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png 1272w, https://substackcdn.com/image/fetch/$s_!gTzT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gTzT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png" width="1456" height="722" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:722,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!gTzT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png 424w, https://substackcdn.com/image/fetch/$s_!gTzT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png 848w, https://substackcdn.com/image/fetch/$s_!gTzT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png 1272w, https://substackcdn.com/image/fetch/$s_!gTzT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95b9e415-333f-404f-91d6-d741d951dd2b_1573x780.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Instead, <a href="https://www.scraping.club/p/scraping-linkedin-public-data">LinkedIn fetches feed and post data through internal JSON API calls</a> using obfuscated endpoint paths, rather than readable REST routes:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!z5LN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!z5LN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png 424w, https://substackcdn.com/image/fetch/$s_!z5LN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png 848w, https://substackcdn.com/image/fetch/$s_!z5LN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png 1272w, https://substackcdn.com/image/fetch/$s_!z5LN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!z5LN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png" width="1273" height="707" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7c249304-9968-4d90-af98-caf16674c707_1273x707.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:707,&quot;width&quot;:1273,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!z5LN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png 424w, https://substackcdn.com/image/fetch/$s_!z5LN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png 848w, https://substackcdn.com/image/fetch/$s_!z5LN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png 1272w, https://substackcdn.com/image/fetch/$s_!z5LN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7c249304-9968-4d90-af98-caf16674c707_1273x707.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This means your social media scraping pipeline can&#8217;t use a single generic extraction strategy. You need tailored logic for each source, focusing on the specific social media.</p><h3>API vs. Direct Scraping Trade-offs</h3><p>You&#8217;ll also have to decide early on whether to lean on official APIs or go the direct scraping route. APIs give you stability and predictable schemas, but they often come with strict rate limits, high costs, and severe limitations regarding the data you can retrieve.</p><p>For instance, <a href="https://docs.x.com/developer-guidelines">X is very specific about how developers should use their APIs</a> and what happens if they don&#8217;t:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_P8M!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_P8M!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png 424w, https://substackcdn.com/image/fetch/$s_!_P8M!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png 848w, https://substackcdn.com/image/fetch/$s_!_P8M!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png 1272w, https://substackcdn.com/image/fetch/$s_!_P8M!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_P8M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png" width="1456" height="471" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:471,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!_P8M!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png 424w, https://substackcdn.com/image/fetch/$s_!_P8M!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png 848w, https://substackcdn.com/image/fetch/$s_!_P8M!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png 1272w, https://substackcdn.com/image/fetch/$s_!_P8M!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F93dd4bc1-977e-4adc-876c-c7e135efa146_1873x606.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Even the <a href="https://learn.microsoft.com/en-us/linkedin/?context=linkedin/context">LinkedIn API</a> is very restrictive on use cases. For example, the public API doesn&#8217;t expose feed/post/engagement data for general use. This means that access is essentially locked to partners (limited marketing/talent solutions):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XAb6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XAb6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png 424w, https://substackcdn.com/image/fetch/$s_!XAb6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png 848w, https://substackcdn.com/image/fetch/$s_!XAb6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png 1272w, https://substackcdn.com/image/fetch/$s_!XAb6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XAb6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png" width="1456" height="628" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8131c8e1-367a-404d-952c-669391593c1e_1867x805.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:628,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!XAb6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png 424w, https://substackcdn.com/image/fetch/$s_!XAb6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png 848w, https://substackcdn.com/image/fetch/$s_!XAb6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png 1272w, https://substackcdn.com/image/fetch/$s_!XAb6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8131c8e1-367a-404d-952c-669391593c1e_1867x805.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Direct scraping, on the other hand, gives you far more flexibility and access to richer data, but it raises the stakes. Basically, you&#8217;re taking on:</p><ul><li><p>Greater legal exposure.</p></li><li><p>A heavier maintenance burden since platforms change their front-end structure without warning.</p></li><li><p>Infrastructure management. You need to account for: geo-targeted proxies, a wide pool of residential proxies, CAPTCHA-solving capabilities, <a href="https://www.scraping.club/p/scraping-high-frequency-python">throttle and rate limiting management as these are high-traffic websites</a>, and anything in between.</p></li></ul><div><hr></div><blockquote><p>Only pay for data you actually get &#8212; one request, one credit, every time. No surcharge for JS rendering, no charge when a call gets blocked. <em><strong>Claim your free 10,000 requests with coupon code</strong></em> <strong>WEBSCR</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sxTx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sxTx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sxTx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:403485,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/210089674?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!sxTx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k&quot;,&quot;text&quot;:&quot;Grab the deal!&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k"><span>Grab the deal!</span></a></p></blockquote><div><hr></div><h2>Legal and Ethical Considerations When Scraping Social Media for Trends</h2><p>Before moving into code and infrastructure, you need to think through the legal terrain you&#8217;re operating in. Otherwise, the risk is getting into legal trouble once you get the data you need.</p><p>If you&#8217;ve been web scraping for a while, you know that accounting for <a href="https://www.scraping.club/p/best-practices-for-ethical-web-scraping">ethical web scraping is a best practice</a> for any scraping case. But note that social media scraping is a delicate case. This is because it sits at the intersection of platform terms of service, privacy regulations like GDPR and CCPA, and copyright law that governs user-generated content.</p><p>This means that if you want to stay safe, you need a compliance framework in place from the beginning. And this matters even if you&#8217;re only collecting public posts for trend analysis. For this specific case, this is what matters most:</p><ul><li><p><strong>Compliance with platform terms of service:</strong> Most platforms explicitly ban automated access in their terms of service, and they don&#8217;t always distinguish between a well-intentioned research project and a malicious bot. If you violate those terms, you&#8217;re risking account bans, IP blocks, or even legal action from the platform itself. That&#8217;s why you want to do a proper risk assessment before you start scraping.</p></li><li><p><strong>Handling personally identifiable information (PII):</strong> Even when you&#8217;re only after trend data, you&#8217;ll almost certainly capture PII (usernames, bios, locations, and sometimes more) along the way. That&#8217;s where things get tricky under regulations like GDPR, which don&#8217;t care whether the data was &#8220;public&#8221; when you scraped it. If you think you need this kind of data for some reason, you better build in an anonymization layer and apply it to the data.</p></li><li><p><strong>Respecting robots.txt</strong>: That&#8217;s probably the evergreen rule. And at The Web Scraping Club, we deeply discussed the <a href="https://www.scraping.club/p/understanding-robotstxt-and-its-implications">implications of the robots.txt file</a>. Remember that it&#8217;s not legally binding on its own, but ignoring it undermines your compliance framework. And if you do that, it can be used as evidence of bad faith if a platform pursues legal action over your social media scraping activity. So, treat it as a baseline signal of the platform&#8217;s intent, then layer your ToS and privacy review on top of it rather than relying on robots.txt alone.</p></li></ul><p>And for the sake of being tied to reality, let&#8217;s check <a href="https://www.linkedin.com/robots.txt">LinkedIn&#8217;s robots.txt file</a>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SNIK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SNIK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png 424w, https://substackcdn.com/image/fetch/$s_!SNIK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png 848w, https://substackcdn.com/image/fetch/$s_!SNIK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png 1272w, https://substackcdn.com/image/fetch/$s_!SNIK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SNIK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png" width="1456" height="290" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:290,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!SNIK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png 424w, https://substackcdn.com/image/fetch/$s_!SNIK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png 848w, https://substackcdn.com/image/fetch/$s_!SNIK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png 1272w, https://substackcdn.com/image/fetch/$s_!SNIK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa3570238-cbf6-4fbf-a74e-253eb7054a44_1813x361.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><div><hr></div><p>The above image reports only the initial part of it. But, as you can see, it&#8217;s very clear: you can not use automated software to access LinkedIn unless you ask for specific permission via e-mail. And you&#8217;re not sure you&#8217;ll get permission from LinkedIn, of course.</p><h2>Building a Scalable Scraping Architecture</h2><p>A trend-analysis pipeline isn&#8217;t a simple scraper running on a cron job. Once you&#8217;re dealing with high-velocity, high-volume streams of short-lived social content, you need distributed crawling, proxy rotation, and storage systems built to keep up with the momentum.</p><p>So, let&#8217;s consider the case where you decided to go with your custom scraper because the platform APIs don&#8217;t cover your case. In that case, after assessing the legal risk and defining the legal framework you&#8217;ll work on, you need to build the infrastructure.</p><h3>Proxy Rotation and Anti-Detection Techniques</h3><p>Social platforms don&#8217;t take kindly to automated traffic, and their <a href="https://www.scraping.club/p/machine-learning-for-detecting-bots">anti-bot systems have become aggressive because they use machine learning to intercept detection triggers</a>. To stay under the radar, you need to master at least the following:</p><ul><li><p><a href="https://www.scraping.club/p/the-engineers-guide-residential-proxies">Residential proxies</a>, since they&#8217;re far less likely to get flagged than datacenter IPs.</p></li><li><p>Header randomization, so your requests don&#8217;t all look like they&#8217;re coming from the same bot.</p></li><li><p><a href="https://substack.thewebscraping.club/p/understanding-browser-fingerprint">Browser fingerprint spoofing</a>, which helps you avoid the CAPTCHAs and soft bans that kick in the moment a platform notices a suspicious pattern.</p></li></ul><p>None of these alone is a silver bullet. But combined, they buy you the runway you need to keep collecting data without getting IP-banned every few hours.</p><h3><strong>Headless Browsers vs. Lightweight HTTP Clients</strong></h3><p>Here&#8217;s where you need to be strategic about resource allocation. Dynamic, JS-rendered feeds (think <a href="https://substack.thewebscraping.club/p/handling-infinite-scrolling-python-js">infinite-scroll timelines</a>) often leave you no choice but to use headless browsers like <a href="https://playwright.dev/">Playwright</a> or <a href="https://playwright.dev/">Puppeteer</a>, since the content simply isn&#8217;t there until JavaScript executes. But that comes at a cost: headless browsers are slow and resource-hungry.</p><p>So, for static or semi-static endpoints, you&#8217;re better off with lightweight HTTP-based scrapers. They&#8217;re faster, cheaper to run at scale, and don&#8217;t need a full browser context spun up just to grab a JSON payload. The trick is knowing which endpoints actually need the heavy tooling and which don&#8217;t.</p><h3>Scheduling and Real-Time Data Pipelines</h3><p>Trend detection is a race against freshness. And a trend you catch six hours late isn&#8217;t a trend anymore. That&#8217;s why your scheduling strategy matters as much as your extraction logic. The rule of thumb is the following:</p><ul><li><p>Cron-based batch jobs work fine if you&#8217;re tracking slower-moving trends and can tolerate some lag.</p></li><li><p>Streaming architectures (Kafka, message queues) are what you need if you&#8217;re after near-real-time detection. This is because, in that case, you need to process data as it arrives instead of waiting for the next batch window.</p></li></ul><p>Which one you pick really comes down to how fast you need to know something&#8217;s trending, and how much infrastructure complexity you&#8217;re willing to take on to get there.</p><h2>What If You Don&#8217;t Want to Manage The Infrastructure?</h2><p>If you&#8217;re a scraping expert, you certainly know the burden of managing the scraping infrastructure: residential proxies are very expensive, CAPTCHAs block you, selectors change every one in a while, parallel requests take time to execute, and so on. Furthermore, the legalities of social media scraping get you up at night.</p><p>So&#8230;are there any other alternatives other than using official platform APIs and scraping on your own? The answer is yes!</p><p>As you know, the scraping market is strong, and lots of companies provide several services in it. Among the companies that provide scraping services, some offer social media scraping services. I don&#8217;t want to end up in a list here because everything is easily searchable on your favourite provider&#8217;s website. Just note that the majority of them provide pre-collected datasets and/or scraping APIs to retrieve data from social media.</p><p>In simple terms, you just need to make an API call and collect posts from Instagram, Facebook, TikTok, or whatever social media you&#8217;re targeting. The advantages of this approach are the following:</p><ul><li><p>The scraping service manages the infrastructure for you.</p></li><li><p>You don&#8217;t need to manage the legalities behind the data extraction part. But, yes: you still need to account for the legalities of anyting related, like data retention, storage, and usage.</p></li><li><p>If you&#8217;re ambitious and want to scale, you can do it along with the scraping service you&#8217;re using.</p></li><li><p>You don&#8217;t need to think about how the platform displays the data. Either they expose APIs or render HTML, you make an API call, and you&#8217;re good to go.</p></li><li><p>The price is generally fair. I mean: if you don&#8217;t own proxies or any other scraping infrastructure, API calls for retrieving data from social media platforms need just a few dollars. Furthermore, depending on the scale of your project, you may simply benefit from the service&#8217;s free trial.</p></li></ul><p>So, if you&#8217;re scraping social media to intercept trends, the suggestion is to take a look at these solutions before writing your own custom code. You may be surprised by how you can find the right solution for your case.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h2>Data Management Strategies for Trend Signals</h2><p>Grabbing raw posts from social media is only half the job. And that&#8217;s it, regardless of the data extraction method you used. To actually detect trends, your social media scraping pipeline needs to extract structured signals from content noise.</p><p>In social media posts, the fields that actually tell you if something is trending are hashtags, topics, engagement velocity, and mention frequency. So, let&#8217;s see how to manage these.</p><h3>Extracting Hashtags, Mentions, and Keywords</h3><p>Post text is messy. So, before you can count anything meaningful, you need to isolate the actual trend indicators from the surrounding noise. A &#8220;traditional&#8221; approach to do that is using regex.</p><p>That method gets you most of the way for hashtags and mentions. For example, consider the code below:</p><pre><code><code>import re  
from collections import Counter  
  
def extract_signals(text):  
    hashtags = re.findall(r"#(\w+)", text)  
    mentions = re.findall(r"@(\w+)", text)  
    return hashtags, mentions  
  
posts = [  
    "AI is eating the world #AI #MachineLearning cc @openai",  
    "New drop today #sneakers #AI incoming",  
]  
  
hashtag_counter = Counter()  
mention_counter = Counter()  
  
for post in posts:  
    tags, mentions = extract_signals(post)  
    hashtag_counter.update(tags)  
    mention_counter.update(mentions)  
  
print(hashtag_counter.most_common())  </code></code></pre><p><strong>NOTE</strong>: For the sake of simplicity, the <code>posts[]</code> list reports short content. An example from a complete scraping scenario works by opening a CSV or JSON file, extracting the content, and applying regex.</p><p>The result from such a basic example is the following:</p><pre><code><code>[('AI', 2), ('MachineLearning', 1), ('sneakers', 1)]</code></code></pre><p>The above result is a list of tuples. Each tuple shows the hashtag and how many times it appears in the analyzed content. This is an elegant result because regex gets you hashtags and mentions cleanly, but it won&#8217;t catch implicit topics people are talking about without tagging them. For that case, you need more than regex. A solution is to use <a href="https://www.scraping.club/p/using-nlp-scraped-data">NLP-based tokenization for entity extraction</a> on top of your script, like the following:</p><pre><code><code># pip install spacy
# python -m spacy download en_core_web_sm

import spacy  
  
nlp = spacy.load("en_core_web_sm")  
  
def extract_keywords(text):  
    doc = nlp(text.lower())  
    return [  
        token.lemma_ for token in doc  
        if not token.is_stop and not token.is_punct and token.pos_ in ("NOUN", "PROPN")  
    ]  
  
keywords = extract_keywords("New drop today, the sneakers are insane")  
print(keywords)   </code></code></pre><p>And the result is:</p><pre><code><code>['drop', 'today', 'sneaker']</code></code></pre><p>In that case, this content can tell you:</p><ul><li><p>drop &#8594; Something has it or is hitting the market.</p></li><li><p>today &#8594; That something occurred today.</p></li><li><p>sneaker &#8594; The actual product.</p></li></ul><p>Combine both approaches, and you&#8217;ve got a keyword pool you can feed into frequency counting or topic clustering downstream, without hand-tagging every post yourself.</p><p>As a final consideration, note that the NLP-based approach also has limitations. The main argument we could discuss is that this solution is based on the vocabulary you use. So, another technique is to use AI to extract entities and patterns from text. If you want to deepen that, we already covered this in the article &#8220;<a href="https://www.scraping.club/p/detect-pattern-scraped-data-with-ai">Using AI to Detect Patterns in Scraped Data</a>&#8221;.</p><h3>Capturing Engagement Metrics Over Time</h3><p>Hashtags, mentions, and keywords tell you what people are talking about. Engagement metrics tell you how fast the news is spreading. And that&#8217;s a moving target. This means that you can&#8217;t scrape a post once and call it a day. You need to hit the same post at certain time intervals and build a time series out of it. The following code helps you do that:</p><pre><code><code>import time  
import csv  
from datetime import datetime  
  
def scrape_engagement(post_id, fetch_fn):  
    data = fetch_fn(post_id)  
    return {  
        "post_id": post_id,  
        "timestamp": datetime.utcnow().isoformat(),  
        "likes": data["likes"],  
        "shares": data["shares"],  
        "comments": data["comments"],  
        "views": data.get("views", 0),  
    }  
  
def track_post(post_id, fetch_fn, interval_sec=900, iterations=8):  
    with open(f"{post_id}_engagement.csv", "a", newline="") as f:  
        writer = csv.DictWriter(f, fieldnames=["post_id", "timestamp", "likes", "shares", "comments", "views"])  
        if f.tell() == 0:  
            writer.writeheader()  
  
        for _ in range(iterations):  
            row = scrape_engagement(post_id, fetch_fn)  
            writer.writerow(row)  
            f.flush()  
            time.sleep(interval_sec)  </code></code></pre><p>In this example code:</p><ul><li><p><code>fetch_fn</code> is whatever extraction logic you&#8217;re using for that specific platform.</p></li><li><p>The <code>interval_sec</code> and <code>iterations</code> are up to you. Tighter intervals catch virality earlier, but they also burn through your proxy pool faster.</p></li></ul><p>Once you&#8217;ve got this data logged, you can compute engagement velocity (delta between snapshots) and feed it straight into the time-series analysis you&#8217;ll run downstream. Then, <a href="https://www.scraping.club/p/building-a-scraper-dashboard-streamlit">build a dashboard - for example, using Streamlit</a> - and use <a href="https://www.scraping.club/p/analyzing-scraped-data-pandas-matplotlib">Pandas, Matplotlib, and related libraries to analyze the scraped data</a> and get trends out of your time series.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h2>Data Cleaning and Normalization</h2><p>Social media trends don&#8217;t live in a single platform. A topic can break on Reddit, spike on X six hours later, and only show up on TikTok in a couple of days. So, if you&#8217;re only scraping one source, you risk tracking a fragment of the whole trend. As a consequence, if raw scraped data is messy by default when you get it from a single source, you can imagine the chaos with multiple sources.</p><p>This means your pipeline needs to standardize data across platforms. Otherwise, you&#8217;ll be comparing apples to oranges without realizing it. So let&#8217;s see some techniques to do so.</p><h3>Deduplication and Bot/Spam Filtering</h3><p>Bots and spammers are a real trouble for the web (they were so even in the &#8220;forums era&#8221;, if you&#8217;re old enough to remember it &#128513;). In the context of trend detection, if you consider them and reposts, you get inflated engagement. In other words, if you don&#8217;t filter them out, you&#8217;ll end up &#8220;detecting&#8221; trends that are really just coordinated inauthentic behavior.</p><p>Deduplication is the easy part. For that, content hashing gets you most of the way there as follows:</p><pre><code><code>import hashlib

posts = [
    {"text": "AI is eating the world #AI #MachineLearning"},
    {"text": "AI is eating the world #AI #MachineLearning"},  # exact duplicate
    {"text": "  ai IS eating the world #AI #MachineLearning  "},  # duplicate after normalization
    {"text": "New drop today #sneakers #AI incoming"},
    {"text": "Another unrelated post about crypto"},
]

def content_hash(text):
    normalized = text.strip().lower()
    return hashlib.sha256(normalized.encode("utf-8")).hexdigest()

seen_hashes = set()
unique_posts = []

for post in posts:
    h = content_hash(post["text"])
    if h not in seen_hashes:
        seen_hashes.add(h)
        unique_posts.append(post)

print(f"Original posts: {len(posts)}")
print(f"Unique posts: {len(unique_posts)}")
for p in unique_posts:
    print("-", p["text"])</code></code></pre><p>This code:</p><ul><li><p>Defines a <code>content_hash()</code> function that strips whitespace and lowercases the post text, then computes a SHA-256 hash of it. Note that normalizing before hashing means that formatting differences (extra spaces, capitalization) don&#8217;t prevent identical content from being detected as duplicates.</p></li><li><p>Iterates over the list of <code>posts</code>, computing a hash for each one.</p></li><li><p>Keeps a <code>seen_hashes</code> set to track which content hashes have already been encountered.</p></li></ul><p>So, if a post&#8217;s hash is new, it&#8217;s added to both <code>seen_hashes</code> and the <code>unique_posts</code> list; if the hash already exists, the post is skipped as a duplicate. The result, <code>unique_posts</code>, contains only the first occurrence of each distinct piece of content. When runing it, you&#8217;ll see the following:</p><pre><code><code>Original posts: 5
Unique posts: 3
- AI is eating the world #AI #MachineLearning
- New drop today #sneakers #AI incoming
- Another unrelated post about crypto</code></code></pre><p>Now, the code above accounts only for exact matches. However, that won&#8217;t catch near-duplicates (slightly reworded reposts). For that, you&#8217;ll want something like MinHash or embedding similarity:</p><pre><code><code># pip install sentence-transformers

from sentence_transformers import SentenceTransformer, util

model = SentenceTransformer("all-MiniLM-L6-v2")

posts = [
    {"text": "AI is eating the world"},
    {"text": "Artificial intelligence is taking over the world"},
    {"text": "New sneaker drop today"},
    {"text": "Sneakers just dropped today"},
    {"text": "Completely unrelated topic about cooking pasta"},
]

def find_near_duplicates(posts, threshold=0.6):
    texts = [p["text"] for p in posts]
    embeddings = model.encode(texts, convert_to_tensor=True)
    duplicates = []

    for i in range(len(texts)):
        for j in range(i + 1, len(texts)):
            sim = util.cos_sim(embeddings[i], embeddings[j]).item()
            if sim &gt; threshold:
                duplicates.append((i, j, sim))
    return duplicates

results = find_near_duplicates(posts, threshold=0.6)
for i, j, sim in results:
    print(f"({i}, {j}) sim={sim:.3f} -&gt; '{posts\[i\]['text']}' | '{posts\[j\]['text']}'")</code></code></pre><p>This snippet does the following:</p><ul><li><p>Loads a pre-trained sentence embedding model (<code>all-MiniLM-L6-v2</code>) via <code>SentenceTransformer</code>.</p></li><li><p>Encodes each post&#8217;s text into a dense vector embedding that captures its semantic meaning, not just exact wording.</p></li><li><p>Compares every pair of posts using cosine similarity (<code>util.cos_sim</code>) to measure how semantically close their content is.</p></li><li><p>Flags pairs whose similarity score exceeds the given <code>threshold</code> as near-duplicates. This catches reworded or paraphrased reposts that exact-hash matching (like the previous <code>content_hash</code> example) would miss.</p></li><li><p>Returns a list of tuples <code>(i, j, similarity_score)</code> identifying which post pairs are likely duplicates.</p></li></ul><p>As this solution uses machine learning, the actual similarity scores depend on the model run. So, the score you get can be slightly different from the following:</p><pre><code><code>(0, 1) sim=0.72 -&gt; 'AI is eating the world' | 'Artificial intelligence is taking over the world' (2, 3) sim=0.81 -&gt; 'New sneaker drop today' | 'Sneakers just dropped today'</code></code></pre><p>And, yes: this is a pretty good result!</p><h3>Normalizing Timestamps and Multilingual Text</h3><p>Cross-platform trend detection breaks down fast if you don&#8217;t normalize timestamps. This is because every platform reports time differently: some give you UTC ISO strings, others hand you Unix epochs, and some (looking at you, scraped HTML!) give you relative strings like &#8220;3h ago&#8221; that you have to resolve at scrape time before they become meaningless.</p><p>Timestamp conversion is the easy of the two:</p><pre><code><code>from datetime import datetime, timezone
import dateutil.parser

def normalize_timestamp(raw_ts):
    if isinstance(raw_ts, (int, float)):
        return datetime.fromtimestamp(raw_ts, tz=timezone.utc)
    return dateutil.parser.parse(raw_ts).astimezone(timezone.utc)

print(normalize_timestamp(1735689600))
print(normalize_timestamp("2025-01-01T00:00:00+05:30"))</code></code></pre><p>But relative timestamps need to be resolved against your scrape time, not stored as-is:</p><pre><code><code>import re
from datetime import timedelta

def resolve_relative_time(raw, scraped_at):
    match = re.match(r"(\d+)([hmd])", raw)
    if not match:
        return scraped_at
    value, unit = int(match.group(1)), match.group(2)
    delta = {"m": timedelta(minutes=value), "h": timedelta(hours=value), "d": timedelta(days=value)}[unit]
    return scraped_at - delta</code></code></pre><p>If you think that managing time is hard, consider that language is the harder problem. A trend can absolutely break in a non-English-speaking market first, and if your pipeline only handles English, you&#8217;ll miss it entirely. But the problem is that multilingual analysis can&#8217;t just be &#8220;run everything through a translator&#8221;. That&#8217;s where a lot of &#8220;translation&#8221; pipelines get sloppy.</p><p>To account for that, you first need language detection:</p><pre><code><code># pip install langdetect

from langdetect import detect
def detect_language(text):
    try:
        return detect(text)
    except Exception:
        return "unknown"
texts = [
    "AI is eating the world, and everyone is talking about it.",
    "L'intelligence artificielle est en train de conqu&#233;rir le monde.",
]
for t in texts:
    print(f"'{t}' -&gt; {detect_language(t)}")</code></code></pre><p>And the result you get is as expected:</p><pre><code><code>'AI is eating the world, and everyone is talking about it.' -&gt; en
'L'intelligence artificielle est en train de conqu&#233;rir le monde.' -&gt; fr</code></code></pre><p>Then, you can go through translation. Beyond translation quality, tokenization itself gets messy across languages. <a href="https://www.elastic.co/docs/reference/text-analysis/analysis-whitespace-tokenizer">Whitespace-based tokenizers</a> (fine for English) fall apart on languages without clear word boundaries, like Japanese or Chinese, where you need dedicated segmenters.</p><p>Overall, covering every nuance of multilingual translation and tokenization in depth is beyond the scope of this article. But knowing where these pitfalls lie helps you design a pipeline that&#8217;s ready to handle them as your trend-detection needs grow.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Analyzing Trends from Scraped Data</h2><p>Clean data is a reliable starting point, but it doesn&#8217;t tell you what&#8217;s trending. Now, your social media scraping pipeline needs to distinguish normal conversation from unusual growth, identify what people are actually discussing, and measure how that discussion changes over time.</p><p>And there&#8217;s an important distinction to make: a popular topic isn&#8217;t necessarily an emerging trend. A topic with consistently high mention volume might just be part of the platform&#8217;s normal activity. Meanwhile, a smaller conversation that&#8217;s spreading across independent communities could deserve your attention much earlier.</p><p>Basically, you need two complementary layers of analysis:</p><ul><li><p><strong>Time-series analysis for virality detection:</strong> Measure changes in mention volume, participation, and engagement against an appropriate baseline.</p></li><li><p><strong>Sentiment analysis and topic modeling:</strong> Identify the themes behind those changes and understand how people feel about the specific subjects involved.</p></li></ul><p>Both kinds of analysis can require a lot of work and, surely, require specialized engineers. So, allow me to just give you the high-level ideas that matter.</p><h3>Time-Series Analysis for Virality Detection</h3><p>Start by deciding what you&#8217;re counting and when you&#8217;re counting it. This sounds obvious, but it&#8217;s where you can accidentally turn a collection artifact into a trend.</p><p>For mention volume, you should group posts into fixed time windows using their publication timestamps. For engagement growth, use the timestamps of your repeated metric observations. These aren&#8217;t interchangeable, because a post published yesterday can receive new engagement today.</p><p>So, your time-series dataset should distinguish:</p><ul><li><p><strong>Mention volume:</strong> The number of distinct collected posts mentioning a topic within each window.</p></li><li><p><strong>Unique authors:</strong> The number of distinct participating accounts, measured within each platform unless cross-platform identities are reliably linked.</p></li><li><p><strong>Engagement increments:</strong> The change in a post&#8217;s likes, comments, shares, or views between observations.</p></li><li><p><strong>Collection coverage:</strong> Whether collection succeeded, which sources were available, and whether sampling or query settings changed.</p></li></ul><p>That last point matters more than it might seem because if your scraper stops collecting for an hour, you have missing observations.</p><h3>Sentiment Analysis and Topic Modeling</h3><p>Time-series analysis tells you that something changed. NLP helps you understand what changed.<br>But don&#8217;t make the mistake of collapsing sentiment and topic detection into the same task because:</p><ul><li><p>A topic model groups related discussions.</p></li><li><p>A sentiment model estimates expressed polarity toward something.</p></li></ul><p>This means that neither, on its own, explains why a conversation is growing.</p><p>Also, note that the results - especially related to sentiment analysis - highly depend on the specific neural network you&#8217;re using. This is a wide topic, and we already covered it with a practical tutorial. If you want to deepen it, check out our article &#8220;<a href="https://www.scraping.club/i/170801049/sentiment-analysis-on-scraped-product-reviews-step-by-step-tutorial">Sentiment Analysis on Scraped Product Reviews: Step-by-step Tutorial</a>&#8221;.</p><h2>Putting It All Together: From Social Media Scraping to Trend Insights</h2><p>At this point, you&#8217;ve seen the main pieces of the pipeline. But the actual value comes from connecting them. Social media scraping gets you the posts; extraction, cleaning, and analysis turn those posts into signals you can interpret.</p><p>So, before you start building, here&#8217;s how the whole process fits together:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jeWa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jeWa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png 424w, https://substackcdn.com/image/fetch/$s_!jeWa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png 848w, https://substackcdn.com/image/fetch/$s_!jeWa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png 1272w, https://substackcdn.com/image/fetch/$s_!jeWa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jeWa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png" width="1186" height="1426" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1426,&quot;width&quot;:1186,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!jeWa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png 424w, https://substackcdn.com/image/fetch/$s_!jeWa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png 848w, https://substackcdn.com/image/fetch/$s_!jeWa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png 1272w, https://substackcdn.com/image/fetch/$s_!jeWa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa17877a6-6e62-4413-b8bd-ad80718221a8_1186x1426.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>In practical terms, these are the stages your pipeline needs to cover:</p><ul><li><p><strong>Define what you&#8217;re tracking and where you can collect it</strong>: Choose platforms around your trend-analysis goals, then review the relevant access rules and legal requirements. Using a scraping provider changes who operates the infrastructure, but it doesn&#8217;t automatically remove your responsibilities around data collection and use.</p></li><li><p><strong>Collect posts and revisit engagement metrics</strong>: Decide whether to use official APIs, your own collectors, or managed services depending on your requirements. Store source identifiers, publication timestamps, and observation timestamps alongside the content. Remember that a dataset collected once can support historical analysis, but tracking engagement growth requires repeated observations.</p></li><li><p><strong>Extract signals, then clean and normalize them</strong>: Isolate hashtags, mentions, keywords, and engagement counters. Standardize timestamps and handle language differences before comparing sources. Also, distinguish duplicate collection from actual reposting: collecting the same post twice is a data-quality issue, while independent reposts can be evidence of a conversation spreading. Don&#8217;t automatically discard that signal.</p></li><li><p><strong>Analyze changes rather than raw popularity alone</strong>: Compare mention volume and engagement velocity against historical activity, then use topic modeling and sentiment analysis to understand the discussions behind those changes. And keep checking collection coverage.</p></li><li><p><strong>Visualize the results and monitor the pipeline</strong>: We haven&#8217;t explored data visualization in depth here, but it&#8217;s the final layer that makes your results easier to interpret. A <a href="http://thewebscrapingclub.substack.com/p/building-a-scraper-dashboard-streamlit">Streamlit dashboard</a>, for example, can display mention-volume curves, engagement growth, and topic or sentiment breakdowns. Just make sure it also shows data freshness and collection gaps, so readers know what they&#8217;re looking at.</p></li></ul><p>Overall, the thing to remember is this one: you don&#8217;t get reliable trends by only collecting more posts. You get them by keeping the whole pipeline consistent, from source selection to the dashboard. And when a spike appears, you should be able to trace it back to the underlying posts and collection conditions.</p><h2>Conclusion</h2><p>In this article, you learned that social media scraping for trend analysis is about more than collecting posts and counting hashtags. You need a pipeline that brings together platform-specific collection, clean data, repeated engagement measurements, and analysis that distinguishes unusual growth from normal activity.</p><p>The value is in how you connect those pieces. A spike in mentions doesn&#8217;t tell you much if you can&#8217;t tell whether it came from independent conversations, repeated content, or a change in your collection coverage. But a system that helps you understand what&#8217;s gaining attention, where it&#8217;s spreading, and how the discussion is changing? That&#8217;s where the real value is!</p><p>So, let us know: Are you using social media scraping to track trends? Which platforms are you collecting from, and what&#8217;s been the hardest part of turning those posts into useful signals? Let&#8217;s discuss in the comments!</p><div><hr></div><p><em>Did you like this article? Share it with someone who might find it useful and get a discount on paid plans.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/how-to-scrape-social-media?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/how-to-scrape-social-media?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[The LAB #116: Warming an Imperva reese84 cookie, and replaying it without a browser]]></title><description><![CDATA[A tenth of a cent buys thirteen minutes of scraping, from any IP I tried]]></description><link>https://www.scraping.club/p/the-lab-116-warming-an-imperva-reese84</link><guid isPermaLink="false">https://www.scraping.club/p/the-lab-116-warming-an-imperva-reese84</guid><dc:creator><![CDATA[Pierluigi Vinciguerra]]></dc:creator><pubDate>Thu, 24 Sep 2026 15:15:17 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/013af3b9-d3cb-4631-a5e1-ba1cbd3d9c6a_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Imperva is one of the anti-bots we didn&#8217;t write a lot about in the past, probably because, for some reason I ignore, I&#8217;ve never encountered it in my career of scraping ecommerce websites (or maybe, if I encountered, it was so easy to bypass that I didn&#8217;t notice that). </p><p>To fill this gap, today I&#8217;m creating a case study for smythstoys.com, the Irish site of Smyths Toys. I picked it because a reader described the exact problem on the r/webscraping subreddit: Smyths runs Imperva, the product pages are server-rendered HTML, and the one internal endpoint that returns stock is protected too. The idea in that thread was to keep one hot cookie per proxy, forged using a browser, and replay it over cheap datacenter IPs. I wanted to check three things: does that actually work, how long does the cookie last, and when does it eventually break?</p><p>This time I worked two ways at once. I built a bypass that warms a session with a browser, solves the challenge, and then runs on a plain HTTP client. And I ran Manus against the same site to read the protection from the inside (so I could explain why the bypass keeps working, instead of only showing that it does). The bypass is mine, while the deep read of the sensor, the token, and the renewal protocol is Manus&#8217;s, checked against my own captures where the two overlap.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p></blockquote><h2>Manus, and how I used it here</h2><p>Manus is an agent that pairs a language model with a sandboxed Linux VM and a Chromium browser. It can drive a page, run Node and Python, and instrument the browser while it executes, which is what makes it useful here. You may have noticed that in the latest The Lab issues I used that a lot:  in <a href="https://www.scraping.club/p/deobfuscating-kasada-with-manus-ai">THE LAB #114</a> against Kasada and <a href="https://www.scraping.club/p/datadome-on-leboncoin-scraping">THE LAB #115</a> against DataDome. <br>This is mainly for two reasons: it uses the sandboxed VMs, so it can spawn a browser and run tests in its virtual environment, and, at the same time, it&#8217;s not so heavily guardrailed, so these tasks can be performed with ease.</p><p>For this article, Manus hooked <code>JSON.stringify</code> and the <code>btoa</code> boundary before the page scripts ran, so it logged the exact sensor request and the clear-text fingerprint the moment they were built. Then it ran cold, warm and mutation matrices against the token endpoint. Its run was on 18 September 2026, in headless Chromium 151.0.7922.71, anonymous, thirteen page navigations, no credentials and no CAPTCHA solving. One detail from that setup matters later: its browser reported <code>navigator.webdriver=true</code>, so it announced itself as automated.</p><p>I trust the numbers Manus reported across those runs, and I checked the ones that agree with my own captures. Where I quote a Manus figure I say so, because I did not reproduce its in-browser instrumentation myself. Manus also did not vary the IP, the User-Agent or the TLS fingerprint, and it did not solve a CAPTCHA, so those parts of the story are mine.</p><h2>The protection at a high level</h2><p>Before jumping into the details, let&#8217;s see what happens if we cURL the target website:</p><pre><code><code>$ curl -s -D - -A "Mozilla/5.0 ... Chrome/140.0.0.0 Safari/537.36" https://www.smythstoys.com/ie/en-ie/
HTTP/2 200
x-cdn: Imperva
x-iinfo: 10-32110005-0 NNNN RT(...) ...
set-cookie: visid_incap_2483049=...; Domain=.smythstoys.com; ...
set-cookie: incap_ses_416_2483049=...; Domain=.smythstoys.com; ...</code></code></pre><p>The <code>x-cdn: Imperva</code> header and the <code>visid_incap</code> and <code>incap_ses</code> cookies are the Incapsula signature. Of course, what we receive it&#8217;s not the home page of the website but an error page. It&#8217;s a 1,158 byte HTML shell with an iframe that says &#8220;Request unsuccessful. Incapsula incident ID: ...&#8221;. So the edge already decided my plain client is not welcome, before any product page is served.</p><p>There are five pieces here, and it helps to name them before going deep on any one. The edge WAF answers the navigation with the interstitial (the &#8220;Pardon Our Interruption&#8221; page that sits between you and the shop), or with the real shop once you are cleared. A throwaway fingerprint cookie called <code>___utmvc</code> is built in the browser and lives for about twenty seconds. The reese84 sensor is the real collector, two large obfuscated scripts of around 800 KB each loaded from paths that look like random english words. The token exchange is the POST that sends the sensor result and gets the reese84 token back. And the GeeTest CAPTCHA is what Imperva falls back to when the sensor result alone is not enough.</p><div><hr></div><blockquote><p><em>Tired of getting blocked while scraping the web?<br>ScrapingBee handles proxies, browsers, anti-bot systems, and retries so you can focus on your data. Get clean Markdown, JSON, or HTML from the web with up to a 99.9% success rate. ScrapingBee is SOC 2 Type II and GDPR compliant, and trusted by 4,000+ developers.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Pj1_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Pj1_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png 424w, https://substackcdn.com/image/fetch/$s_!Pj1_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png 848w, https://substackcdn.com/image/fetch/$s_!Pj1_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!Pj1_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Pj1_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png" width="1456" height="437" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:437,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:128210,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/216891176?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!Pj1_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png 424w, https://substackcdn.com/image/fetch/$s_!Pj1_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png 848w, https://substackcdn.com/image/fetch/$s_!Pj1_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png 1272w, https://substackcdn.com/image/fetch/$s_!Pj1_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F355793ca-3a3b-4369-8c43-0f54aaa79b69_2000x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scrapingbee.com/?utm_source=sponsored_newsletter&amp;utm_medium=email&amp;utm_campaign=the_web_scraping_club&quot;,&quot;text&quot;:&quot;Discover ScrapingBee&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.scrapingbee.com/?utm_source=sponsored_newsletter&amp;utm_medium=email&amp;utm_campaign=the_web_scraping_club"><span>Discover ScrapingBee</span></a></p></blockquote><div><hr></div><p>Manus drew the whole thing as one diagram, which is the clearest way to see how these pieces connect.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Fr5X!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Fr5X!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png 424w, https://substackcdn.com/image/fetch/$s_!Fr5X!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png 848w, https://substackcdn.com/image/fetch/$s_!Fr5X!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png 1272w, https://substackcdn.com/image/fetch/$s_!Fr5X!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Fr5X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png" width="1456" height="2660" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/caf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:2660,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:535321,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/216891176?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Fr5X!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png 424w, https://substackcdn.com/image/fetch/$s_!Fr5X!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png 848w, https://substackcdn.com/image/fetch/$s_!Fr5X!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png 1272w, https://substackcdn.com/image/fetch/$s_!Fr5X!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaf72c38-005e-41ce-87ac-4a0549f4b059_3120x5700.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"><em>The reese84 flow end to end, mapped from the Manus run. It shows the edge challenge and the two browser collectors, the short-lived </em><code>___utmvc</code><em> helper and the reese84 interrogator. It then splits into the cold, warm and replacement token paths, and ends at the edge policy check. That last box is where a CAPTCHA-solved jar and an interrogation-only jar go different ways.</em></figcaption></figure></div><p>The server-side scoring is out of scope, for the simple reason that nobody outside Imperva can see it. Everything I claim below is something one of us saw live, in the cookie jar, or in the sensor code as it ran. We have covered the general idea before: cookies and sessions as a clearance store in <a href="https://www.scraping.club/p/the-lab-94-using-cookies-and-session">THE LAB #94</a>, and a browser-to-HTTP handoff in <a href="https://www.scraping.club/p/hybrid-scraping-camoufox-curl-cffi">THE LAB #100</a>. This is the same shape, applied to Imperva, with the extra question of what the token is tied to.</p><h2>The bypass: warm a session, then run without a browser</h2><p>The bypass has three tools, each for one job.</p><p><a href="https://github.com/D4Vinci/Scrapling">Scrapling</a> does the warming. Its <code>StealthySession</code> launches a Chromium browser and keeps cookies across requests. I use it because it gives me a <code>page_action</code> callback with the real Playwright page inside, so I can watch the network and drive the challenge frame by hand.</p><p><a href="https://www.capsolver.com/">CapSolver</a> solves the CAPTCHA. Imperva shows a GeeTest challenge when the sensor alone is not enough, and CapSolver has a GeeTest task type that returns the three values GeeTest wants back.</p><p><a href="https://github.com/yifeikong/curl_cffi">curl_cffi</a> does the replay. It sends HTTP requests with the TLS fingerprint of a real Chrome, without a browser, so I can test whether the warmed cookie works on its own.</p><p>All of it runs in the shared venv on Python 3.11. My code is in the <code>116-Imperva-Reese84</code> directory of <a href="https://github.com/TheWebScrapingClub/thelab">The Lab repository</a>, with the scripts and the captured results, so you can rerun every number that carries my name below.</p><p>When I warm a session with Scrapling and log every request on smythstoys.com, the order is always the same. The browser loads the home page and gets the interstitial. The sensor scripts load. The sensor POSTs its blob to a random path, and a second POST returns the token:</p><pre><code><code>POST /mbit-And-Dirers-him-Face-and-sure-such-Parry-qui?d=www.smythstoys.com
{"token":"3:nHkG6Ry2bxW+gbWD+elLTg==:RZgGQ1gd...","renewInSec":699,"cookieDomain":"www.smythstoys.com"}</code></code></pre><p>That <code>token</code> value becomes the <code>reese84</code> cookie. The <code>renewInSec</code> is 699, so the browser is told to refresh the token in about eleven and a half minutes. The <code>cookieDomain</code> is the host, so the cookie is scoped to <code>www.smythstoys.com</code>. On Smyths this token alone was never enough for my headless Chromium. Every warming run ended on a GeeTest challenge, so I had to solve it.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><p>The challenge flow is readable in the interstitial frame. A GET to <code>/_Incapsula_Resource?SWCNGEEC=...</code> returns the GeeTest parameters:</p><pre><code><code>{"challenge": "230a350828feeac904b737841e83ecd8", "gt": "ce33de396f8d04030f6eca8fbd225070", "new_captcha": true, "success": 1}</code></code></pre><p>The <code>gt</code> was the same across every run, <code>ce33de396f8d04030f6eca8fbd225070</code>, which is the site&#8217;s GeeTest id. The <code>challenge</code> changes each time. When the widget is solved, the page POSTs the result to <code>/_Incapsula_Resource?SWCGHOEL=gee&amp;...</code> with <code>geetest_challenge</code>, <code>geetest_validate</code> and <code>geetest_seccode</code>, then reloads the parent frame.</p><p>My <code>warm_session.py</code> does exactly that, from inside the frame. It reads the two URLs out of the frame&#8217;s HTML, calls the GET to get <code>gt</code> and <code>challenge</code>, sends those to CapSolver as a <code>GeeTestTaskProxyLess</code> task, and gets back the three values. Then it POSTs them to the <code>SWCGHOEL=gee</code> URL using the frame&#8217;s own <code>fetch</code>, so the request carries the session cookies, and reloads the page.</p><p>CapSolver returned a solution in about ten to twelve seconds each time. It&#8217;s not perfectly reliable: I saw it fail with <code>ERROR_CAPTCHA_SOLVE_FAILED</code> code 1001 on some challenges, so the script retries up to three times. GeeTest solves cost one dollar per thousand on CapSolver when I ran this, so a failed attempt followed by a good one is still a fraction of a cent. After the solved reload, the page title finally read &#8220;Smyths Toys Superstores | Buy Toys for Kids&#8221;, which is the real shop. Here is the tail of a real run, warmed through an Irish residential proxy:</p><pre><code><code>attempt 1: challenge 6abbf70a... gt ce33de396f8d04030f6eca8fbd225070
capsolver solved in 10.3s
imperva captcha submit -&gt; 200 '&lt;html&gt;&lt;head&gt;&lt;script&gt;window.parent.location.reload(true);&lt;/script&gt;&lt;/head&gt;...'
SAVED status=REAL_AFTER_CAPTCHA cookies=[incap_ses, reese84, incap_sh, visid_incap, nlbi, nlbi]</code></code></pre><p>Now the part that makes the whole thing worth doing: does the clearance survive without the browser? I take the cookie jar from that warmed session (the full set of cookies the browser collected) and replay it with curl_cffi, no browser, impersonating Chrome. I fetch the home page and the Magic The Gathering category page the reader mentioned:</p><pre><code><code>jar: warm_pub01.json  status=REAL_AFTER_CAPTCHA  minted 86s ago
warm proxy (same exit)   | home      | 200  603618 REAL | 'Smyths Toys Superstores | Buy Toys for Kids'
warm proxy (same exit)   | category  | 200  471472 REAL | 'Magic The Gathering | Smyths Toys Ireland'
replay proxy             | home      | 200  603752 REAL | 'Smyths Toys Superstores | Buy Toys for Kids'
replay proxy             | category  | 200  471605 REAL | 'Magic The Gathering | Smyths Toys Ireland'
direct (no proxy)        | home      | 200  603751 REAL | 'Smyths Toys Superstores | Buy Toys for Kids'
direct (no proxy)        | category  | 200  471605 REAL | 'Magic The Gathering | Smyths Toys Ireland'</code></code></pre><p>The warmed jar returns the real page from the same Irish residential IP that created it, from a datacenter IP in Ohio, and from my own connection in Italy. I ran the same jar from a second Irish residential IP too, with the same result. So, at least in my tests, the clearance is not bound to the minting IP. This is what makes the reader&#8217;s architecture work: you warm on a good residential IP, then you replay over whatever is cheapest.</p><p>I went further and varied the HTTP client itself, same warmed jar, direct connection:</p><pre><code><code>chrome136 + Chrome UA (match)      | 200  467891 REAL
firefox135 + Firefox UA            | 200  467891 REAL
chrome136 + Firefox UA             | 200  467891 REAL
no impersonation + Chrome UA       | 200  467891 REAL</code></code></pre><p>On this site, once the jar is warmed, the TLS fingerprint and the User-Agent stop mattering. Even curl_cffi with no impersonation, which sends a TLS handshake no browser would send, gets the real page. So the warmed reese84 works as a bearer token (a token that works for whoever presents it, with nothing tying it to one client): any client that presents the jar gets the real page back.</p><p>That is the working bypass. The rest of the article explains why it holds, using the Manus report.</p><h2>Why the replay works</h2>
      <p>
          <a href="https://www.scraping.club/p/the-lab-116-warming-an-imperva-reese84">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Build or buy, now that writing code is almost free]]></title><description><![CDATA[Understanding the non-deterministic nature of AI web access, and why web scraping is the best retrieval layer]]></description><link>https://www.scraping.club/p/build-or-buy-scrapers-in-llm-era</link><guid isPermaLink="false">https://www.scraping.club/p/build-or-buy-scrapers-in-llm-era</guid><dc:creator><![CDATA[Pierluigi Vinciguerra]]></dc:creator><pubDate>Mon, 21 Sep 2026 14:53:45 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/f8a5a080-9c6b-4b21-8cd4-36c2fa61bd59_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Back in November 2023, I published <a href="https://www.scraping.club/p/the-true-costs-of-a-web-scraping"><span>The true costs of a web scraping project</span></a><span>, in which I wanted to understand whether, when we need a scraper, it is worth buying one (by which I mean buying the bypass technique using a web unblocker) or creating it in-house.</span></p><p><span>Given that there are so many aspects to consider, such as your knowledge of web scraping techniques and experience in the field, I tried to put some numbers to that.</span></p><p><span>What I carved out was a general good practice: if you need something just once, buy it. If you need a feed that runs for years, build it yourself, since you can spread out the setup cost and keep the running costs low. This assumption was based on the fact that, at that time, the most important voice cost was a developer's hourly rate. </span></p><p>Three years later, AI and LLMs changed these assumptions. Once you&#8217;ve properly set up your coding environment with skills and best practices, the cost of creating and even maintaining a scraper is near 0. </p><p>This makes the idea of building everything in-house more attractive again, and in this article we&#8217;ll dig into some numbers to understand if this is really true or not.</p><div><hr></div><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p></blockquote><div><hr></div><h2>Buy versus build is three separate decisions</h2><p>The first problem is the question itself. &#8220;Do we build or buy our scraping?&#8221; contains three layers, each with a different answer.</p><p>There are the code production costs, given by who writes the scraper and who fixes it when the site changes. There are infrastructure costs, which include proxies, stealth browsers, anti-bot bypass, and captcha solving. And there are the execution costs: who runs the scrapers and who keeps them running.</p><p>Until 2023, the code layer was the first cost to consider, followed by the infrastructure ones. Depending on the size of the scraping project, the costs of building could lean towards the first or the second layer. The execution layer, instead, depends on the tool: do you need a browser for scraping? If so, you need way more CPU and memory capacity compared to a browserless scraper.</p><h3>The code layer in 2026</h3><p>It would be easy to say that now code is &#8220;free&#8221;, so this layer went down to zero. </p><p>The reality is that the cost is near zero (you still buy tokens and have a human in a seat, for much less time), just for experienced teams that spent weeks on building the harness for their scraping agents. </p><p>I can share my example: I&#8217;ve spent some time on this task, creating a skill for every open source tool I&#8217;m using and also for the ones I&#8217;m not, but they could be useful for building scrapers on the hardest targets. Today there are 32 of them, about 33000 words, covering Camoufox, Patchright, nodriver, rnet, curl_cffi, Scrapling, RayoBrowse, Kameleo, Ghidra, Frida, and many others. Each skill says what the tool does, which parameters matter, and when to avoid it (don&#8217;t shoot a fly with a bazooka; it&#8217;s the first rule for a successful scraping project). <br>My actual problem is that these skills are going to be stale soon, so the next step is to set up a monitor for each of these items and check the newest versions on GitHub, so skills can be updated automatically. </p><p>That&#8217;s, in my opinion, the best way to leverage LLMs to create and maintain in-house scraping projects. </p><p>If you&#8217;re starting today and you&#8217;re not interested in learning about scraping, since you have just a bunch of random requests, then scraping APIs are the tool for you. You just set them up and get the data, usually with no hassle even from medium-protected websites. <br>You save money and time, unless the projects requires a huge amount of results to be scraped. The breaking point between buy and sell here depends strictly on your expertise and the size of the project.</p><div><hr></div><blockquote><p><strong><span>Oxylabs Web API &#8212; built for agentic search</span></strong></p><p><em><span>AI agents hallucinate, fresh data doesn&#8217;t. Our new Web API delivers fresh, real-time web data so your agents stay accurate, relevant, and ready to scale.Become an early user, try our new Web API, and share feedback so we can build a solution that better fits your needs.</span></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://oxylabs.io/web-api-early-access?utm_source=banner&amp;utm_medium=affiliate&amp;utm_campaign=web_api&amp;utm_content=web_scraping_club&amp;groupid=17887662540330" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G7GI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png 424w, https://substackcdn.com/image/fetch/$s_!G7GI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png 848w, https://substackcdn.com/image/fetch/$s_!G7GI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png 1272w, https://substackcdn.com/image/fetch/$s_!G7GI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G7GI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png" width="1456" height="485" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:485,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1242307,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://oxylabs.io/web-api-early-access?utm_source=banner&amp;utm_medium=affiliate&amp;utm_campaign=web_api&amp;utm_content=web_scraping_club&amp;groupid=17887662540330&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/216630936?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!G7GI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png 424w, https://substackcdn.com/image/fetch/$s_!G7GI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png 848w, https://substackcdn.com/image/fetch/$s_!G7GI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png 1272w, https://substackcdn.com/image/fetch/$s_!G7GI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F43bc34c2-e049-4c71-978d-aa4ba6d3c686_2400x800.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://oxylabs.io/web-api-early-access?utm_source=banner&amp;utm_medium=affiliate&amp;utm_campaign=web_api&amp;utm_content=web_scraping_club&amp;groupid=17887662540330&quot;,&quot;text&quot;:&quot;Request Early Access&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://oxylabs.io/web-api-early-access?utm_source=banner&amp;utm_medium=affiliate&amp;utm_campaign=web_api&amp;utm_content=web_scraping_club&amp;groupid=17887662540330"><span>Request Early Access</span></a></p></blockquote><div><hr></div><h3>The infrastructure layer</h3><p>Let&#8217;s say you decided to build your scraper in-house and wrote a working scraper using LLMs that returns a bunch of records. Now you have to launch a full run and maybe do it recurrently. That&#8217;s where things usually break, and the costs rise.</p><p>The buy vs. build on this layer in this case means: should we glue together in-house a stack of tools (proxies, TLS fingerprinting spoofing, browser), with the related running costs?  </p><p>Buying here means getting a proxy provider, a web unblocker, or a browser-as-a-service. You pay per gigabyte or per request, according to what you&#8217;re buying. A vendor sells you a success rate, and it is worth more the less you want to think about the target.</p><p>While for the code layer, a structured team-building approach seems the obvious choice, here the choice is not so easy. There are more factors to keep in mind, apart from costs and development time: how critical is this scraping project? How much should I pay for the peace of mind of delegating this project to a vendor? How do I keep up with which tools are now bypassing anti-bot X? (spoiler: an auto-updated knowledge base like <a href="https://github.com/TheWebScrapingClub/scraping-wiki">The Web Scraping Club Wiki</a>).</p><p>The interesting part compared to 2023 is that now that almost every big name in the proxy industry is moving towards browser scraping, which can be used both for tackling hard websites and for agentic automation, unblocker APIs are getting a bit overshadowed. I&#8217;ve found that their prices have lowered to 1-2 USD per 1k requests, which makes the costs comparable to a high-priced residential proxy in some cases (which are usually sold per GB). <br><br>This is another challenge in answering the question of buy vs. build. How do I know the total price of my scraping project? I should consider the bandwidth for the proxies, the total number of requests in case of an unblocker API or Scraping Browser.</p><p> We compared the pricing models in <a href="https://www.scraping.club/p/the-web-unblocker-cost-benchmark">The Web Unblocker Cost Benchmark</a> (data is a bit stale, updating it this week).</p><h2>The execution layer</h2><p>The execution layer, where your scraper actually runs, depends mainly on the tools you chose earlier. You can manage your own cloud setup, go serverless, or deploy the spider to a platform and forget the machine, sized properly. I went through the <span>trade-offs in&nbsp;</span><a href="https://www.scraping.club/p/optimizing-costs-for-web-scraping"><span>Optimizing costs for large-scale scraping operations</span></a><span>: serverless is cheap for short, sporadic jobs but</span> expensive when something runs all day. This is the layer that costs the least and, even with LLMs, can be managed more easily than before, so I won&#8217;t spend too much time on it. </p><h2>Running the numbers again</h2><p>Let me redo the 2023 exercise at the same $20 an hour, so the two can be compared. The hours in both columns are my estimates. For the model cost, I use Claude Opus 5 at its list price today: $5 per million input tokens and $25 per million output. A build session on an easy site burns something like 1M input and 100K output tokens once you count the retries, three times that on a medium site, fifteen times on a hard one. Batch requests cost half the list price, and cache reads cost a tenth of the input price, so the table shows the expensive version of the model's cost.</p><p>I added a traffic column to the calculation. When you buy an external tool, usually proxies are included, while when you build, the proxies are a separate invoice, and usually not a marginal one.</p><p>So I measured it. I took four ecommerce listing pages, on ikea.it, mediaworld.it, etsy.com and asos.com, and counted the bytes twice. A median to use in this calculation is 100 KB for an HTML fetch and 1.7 MB for a full render, with residential proxies at $4 per GB, a scraping browser at $8 per GB, and an unblocker at $1.50 per 1,000 requests with the proxies included.</p><p>I&#8217;ve made several assumptions for creating the following table, on top of the token calculated before:</p><ul><li><p>A structured web scraping team is working on it, so we&#8217;ve all our skills and guidelines in place</p></li><li><p>I decided to compare build costs with unblockers for websites with no or light anti-bot protection, since we assume the HTML parsing phase is done in-house. This favors the buy solution, since scraping APIs are generally more expensive, but it&#8217;s also true that HTML parsing incurs a marginal cost when building a scraper with LLMs.</p></li><li><p>I categorized websites between light anti-bot (don&#8217;t require a browser for being scraped) and hard anti-bot (requiring a browser in-house or a scraping browser to buy). </p></li><li><p>Infrastructure costs are not included, since they&#8217;re relevant only in the hard anti-bot scenario. </p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!RwcN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!RwcN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png 424w, https://substackcdn.com/image/fetch/$s_!RwcN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png 848w, https://substackcdn.com/image/fetch/$s_!RwcN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!RwcN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!RwcN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png" width="1456" height="819" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:819,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:190302,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/216630936?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!RwcN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png 424w, https://substackcdn.com/image/fetch/$s_!RwcN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png 848w, https://substackcdn.com/image/fetch/$s_!RwcN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png 1272w, https://substackcdn.com/image/fetch/$s_!RwcN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F91d03d2f-a044-4dee-b7ea-f82b7db109c6_2400x1350.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Considering the three oversimplified scenarios in the table, a website without bot protection is not worth buying, since the costs of writing and running a scraper are near 0. </p><p>The middle scenario is the most ambiguous: depending on your time constraints, your real-world tool pricing, and LLM plans, it can be more convenient to buy or build. </p><p>On the hardest tier, both sides have to run a browser and carry the same 1.7 MB, so proxy and execution costs are way higher than in previous scenarios, and building should be convenient only after more than 100k requests are made.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><p>Generally speaking, the break-even fell everywhere: by about two-thirds on the easy sites, by more than half in the middle, and by barely a tenth at the top. The cheaper the code got, the less it helped on the targets where the code was never the expensive part.</p><p>Maintenance moves the same way. In 2023 I budgeted two hours a month per scraper. When the fix is a selector or a changed JSON path, an agent proposes the patch and I confirm it, so half an hour is closer to reality. On the hard tier, nothing improves, because there the work is usually understanding how to bypass the website again, not just a selector change.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h3>The five percent nobody sells</h3><p>The commercial tools cover most of the web, and they cover it well. Then there&#8217;s a top slice of sites, few of them and usually the ones the business cares about most. There, the problem is a virtual machine inside an obfuscated script, or a sensor reading properties straight from the browser engine. No vendor publishes a price list for a specific interpreter on a specific domain, with an SLA.</p><p>Chatting around at the latest Oxycon, despite the fall in code creation costs, the R&amp;D time spent on certain websites (especially Chinese ecommerces with custom-built solutions) makes them non-lucrative for companies selling scraping data.</p><h2>Other considerations</h2><p>Building now is cheap to start now and expensive to leave. It may take an afternoon to build fifty scrapers, but managing and checking their results require a small, dedicated team.  The per-scraper cost fell, and the number of scrapers went up, so the total can easily be higher than before.</p><p>And there is the failure mode described in <a href="https://www.scraping.club/p/stuck-with-web-scraping">Stuck? More of the Same Won&#8217;t Do</a>, published here in 2025: teams that build keep building well past the point where it pays. Agents make that easier, because progress feels continuous even when you&#8217;re stuck. Decide in advance how many weeks you give an internal attempt before you go and buy.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Final considerations</h2><p>Build the code because that cost has collapsed, and what you get is yours. Buy the infrastructure, if you don&#8217;t want scraping to be your main business. The execution layer follows whatever ops capacity you already have.</p><p>The time you save goes into checking that the data is right. No model does that part for you yet.</p><div><hr></div><p><em>Did you like this article? Share it with someone who might find it useful and get a discount on paid plans.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/build-or-buy-scrapers-in-llm-era?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/build-or-buy-scrapers-in-llm-era?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Testing webclaw: A Firecrawl Alternative for Web Extraction in AI Agents]]></title><description><![CDATA[A hands-on look at webclaw&#8217;s CLI and APIs]]></description><link>https://www.scraping.club/p/webclaw-a-firecrawl-alternative-api</link><guid isPermaLink="false">https://www.scraping.club/p/webclaw-a-firecrawl-alternative-api</guid><dc:creator><![CDATA[Antonello Zanini]]></dc:creator><pubDate>Tue, 15 Sep 2026 03:01:44 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/02760fe0-8352-4640-b405-a38b97c8d182_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>webclaw is a modern alternative to traditional web scrapers. Written in Rust and available as open source or a managed cloud service, it makes it easier to feed live web data into AI applications without reinventing the scraping stack every time.</p><p>In this hands-on post, I&#8217;ll put webclaw to the test and share my final take!</p><h2>webclaw Explained: What It Is and What It Offers</h2><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ylSv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ylSv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png 424w, https://substackcdn.com/image/fetch/$s_!ylSv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png 848w, https://substackcdn.com/image/fetch/$s_!ylSv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png 1272w, https://substackcdn.com/image/fetch/$s_!ylSv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ylSv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png" width="1456" height="754" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:754,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ylSv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png 424w, https://substackcdn.com/image/fetch/$s_!ylSv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png 848w, https://substackcdn.com/image/fetch/$s_!ylSv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png 1272w, https://substackcdn.com/image/fetch/$s_!ylSv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F044ecf4c-b608-437f-85dc-164ef063e609_3028x1568.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">webclaw&#8217;s official website</figcaption></figure></div><p><a href="https://webclaw.io/">webclaw</a> is a web data extraction toolkit built in Rust that acts as a drop-in Firecrawl alternative. Its core mission is straightforward: turn any URL into clean, LLM-ready content. What sets it apart is that it&#8217;s designed specifically for AI agents and LLM pipelines.</p><p>The <a href="https://github.com/0xMassi/webclaw">GitHub repository of the project boasts over 2.3k stars</a>. You can either self-host it or use it via the API through the cloud version.</p><h3>Main Features</h3><p>The core capabilities exposed by WebClaw include:</p><ul><li><p><strong>10+ REST endpoints</strong>: Scrape, crawl, extract, search, map, batch, summarize, research, brand, diff, and lead enrichment endpoints + Firecrawl-compatible endpoints available through the same API interface.</p></li><li><p><strong>Multiple output formats</strong>: Get web pages as Markdown, JSON, plain text, or an LLM-optimized format with links and other metadata.</p></li><li><p><strong>JavaScript rendering</strong>: The CLI version can access pages that require JavaScript rendering.</p></li><li><p><strong>Document parsing</strong>: Extract text from PDFs, DOCX, XLSX, and CSV files.</p></li><li><p><strong>Content change tracking (diff)</strong>: Compare current snapshots with previous extractions to detect what has changed.</p></li><li><p><strong>Proxy rotation support</strong>: Automatically loads <span>proxies.txt</span> from your working directory for <a href="https://www.scraping.club/p/use-ipv6-scraping-nyxproxy">automated proxy rotation</a>.</p></li><li><p><strong>Browser actions</strong>: Click, type, scroll, wait, take screenshots, press keys, and execute custom JavaScript before extraction.</p></li><li><p><strong>Direct integration with AI agents and harnesses</strong>: Exposes 10+ tools over stdio for Claude, Cursor, Windsurf, Claude Code, Codex, and Antigravity.</p></li></ul><p>Learn more in the <a href="https://webclaw.io/docs">official docs</a>.</p><h2>Architecture and Products</h2><p>webclaw&#8217;s architecture is straightforward, with the same underlying extraction engine for:</p><ul><li><p><code>webclaw</code>: A CLI for extracting, crawling, summarizing, and tracking changes from the terminal.</p></li><li><p><code>webclaw-server</code>: A REST API server that provides access to webclaw through JSON endpoints.</p></li><li><p><code>SDKs</code>: Libraries for Python, TypeScript, and Go that simplify integration with the webclaw REST API.</p></li><li><p><code>webclaw-mcp</code>: An MCP server that exposes 10+ tools for use with any MCP-compatible AI client.</p></li></ul><p>As a result, whether you&#8217;re pulling web data through the CLI, REST API, an SDK, or the MCP server, the same core code runs under the hood. This unified architecture means you get consistent, predictable behavior whether you scrape from the terminal, call the REST API directly, integrate webclaw into your scripts, or use it via an AI agent.</p><p>Let me introduce you to the three webclaw interfaces!</p><h3>CLI</h3><p>The webclaw command-line tool is available through the <span>webclaw</span> command. It provides a range of options for extracting, crawling, and processing web content directly from the terminal.</p><p>Common commands include:</p><ul><li><p><code>webclaw &lt;url&gt;</code>: Extract a single URL to Markdown</p></li><li><p><code>webclaw https://docs.example.com --crawl --depth 2 --max-pages 100</code>: Crawl a website with depth and page limits</p></li><li><p><code>webclaw https://example.com --map</code>: Discover URLs from a website&#8217;s <a href="https://www.scraping.club/p/understanding-robotstxt-and-its-implications"><span>sitemap.xml</span> and <span>robots.txt</span></a>.</p></li><li><p><code>webclaw https://example.com --extract-json @schema.json</code>: Extract structured JSON based on a schema using the configured LLM provider (Ollama, OpenAI, or Anthropic).</p></li><li><p><code>webclaw https://example.com --diff-with snapshot.json</code>: Detect changes since a previous snapshot.</p></li><li><p><code>webclaw https://example.com --include "article" --exclude "nav,footer"</code>: Control which page elements are extracted using CSS selectors.</p></li><li><p><code>webclaw vertical amazon https://amazon.com/...</code> : Use a <a href="https://webclaw.io/docs/api/vertical">site-specific vertical extractor</a>, returning typed JSON instead of generic Markdown.</p></li><li><p><code>webclaw https://example.com --cloud</code>: Route extraction through the webclaw cloud</p></li></ul><p>For the complete list of commands and options, <a href="https://webclaw.io/docs/cli">see the webclaw CLI documentation</a>.</p><p>Common use cases include terminal-based web data collection, automation workflows, and one-off scraping tasks. One of the CLI&#8217;s main advantages is that you can pipe commands together. For example, you can pipe a JSON response through <span>jq</span> to extract only the fields you need.</p><h3>REST API</h3><p>webclaw comes with an <a href="https://docs.rs/axum/latest/axum/"><span>axum</span>-based HTTP server</a> that handles authentication, CORS, gzip compression, and asynchronous job management. The <a href="https://webclaw.io/docs/api">main endpoints</a> include:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!j9ta!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!j9ta!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png 424w, https://substackcdn.com/image/fetch/$s_!j9ta!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png 848w, https://substackcdn.com/image/fetch/$s_!j9ta!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png 1272w, https://substackcdn.com/image/fetch/$s_!j9ta!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!j9ta!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png" width="1456" height="1354" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1354,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;webclaw.io&#8217;s endpoints&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="webclaw.io&#8217;s endpoints" title="webclaw.io&#8217;s endpoints" srcset="https://substackcdn.com/image/fetch/$s_!j9ta!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png 424w, https://substackcdn.com/image/fetch/$s_!j9ta!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png 848w, https://substackcdn.com/image/fetch/$s_!j9ta!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png 1272w, https://substackcdn.com/image/fetch/$s_!j9ta!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6c388a80-bf32-4a43-b775-cda641c0a09a_1491x1387.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">webclaw.io&#8217;s endpoints</figcaption></figure></div><p>The workflow is simple: send a POST request with a URL and your desired options, and webclaw returns the extracted data in the requested format.</p><p>For users who prefer a managed solution, the cloud version of the <a href="https://webclaw.io/products/api">APIs is available at <span>api.webclaw.io</span></a>. This is managed directly by webclaw and offers automatic scaling, proxy rotation, and other premium features out of the box.</p><h3>SDKs</h3><p>webclaw provides official SDKs for Python, TypeScript, and Go. They simplify integration with the cloud REST API, while offering typed clients, built-in error handling, and crawl polling. All SDKs support the full API surface and authenticate using a webclaw API key.</p><p>In detail, the Python SDK (available as the <code>webclaw</code><a href="https://pypi.org/project/webclaw/"> PyPI package</a>) works like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python"># pip install webclaw
from webclaw import Webclaw

with Webclaw("YOUR_WEBCLAW_API_KEY") as client:
    # Scrape the "https://example.com" page via webclaw's cloud APIs
    result = client.scrape(
        "https://example.com",
        formats=["markdown"]
    )
    
    # Print the returned Markdown version of the page
    print(result.markdown)</code></pre></div><p>The TypeScript and Go SDKs provide equivalent functionality for their respective ecosystems.</p><h3>MCP Server</h3><p>The MCP server exposes 14 tools <a href="https://modelcontextprotocol.io/specification/2026-07-28/basic/transports/stdio">over STDIO</a>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!E6wE!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!E6wE!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png 424w, https://substackcdn.com/image/fetch/$s_!E6wE!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png 848w, https://substackcdn.com/image/fetch/$s_!E6wE!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png 1272w, https://substackcdn.com/image/fetch/$s_!E6wE!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!E6wE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png" width="1456" height="1274" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1274,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;webclaw MCP tools&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="webclaw MCP tools" title="webclaw MCP tools" srcset="https://substackcdn.com/image/fetch/$s_!E6wE!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png 424w, https://substackcdn.com/image/fetch/$s_!E6wE!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png 848w, https://substackcdn.com/image/fetch/$s_!E6wE!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png 1272w, https://substackcdn.com/image/fetch/$s_!E6wE!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F966a8db8-feb6-4994-9d14-489de4afd01e_1490x1304.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">webclaw MCP tools</figcaption></figure></div><p>The easiest way to set up webclaw with Claude Code, Claude Desktop, Cursor, Windsurf, OpenCode, Codex CLI, or another MCP-compatible client is to run:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">npx create-webclaw</code></pre></div><p>Alternatively, you can configure individual clients manually. For Claude Code, launch:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">claude mcp add webclaw -- npx -y @webclaw/mcp</code></pre></div><p>For Claude Desktop, add the following to your <code>claude_desktop_config.json</code> configuration:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;json&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-json">{
  "mcpServers": {
    "webclaw": {
      "command": "npx",
      "args": ["-y", "@webclaw/mcp"],
      "env": {
        "WEBCLAW_API_KEY": "&lt;YOUR_WEBCLAW_API_KEY&gt;"
      }
    }
  }
}</code></pre></div><p>The MCP server uses a local-first architecture. When webclaw detects a bot-protected or JavaScript-heavy page, it automatically falls back to the webclaw cloud API if a <code>WEBCLAW_API_KEY</code> is configured.</p><h2>Deployment Options</h2><p>webclaw comes with two deployment models:</p><ul><li><p><strong><a href="https://webclaw.io/docs/self-hosting">Self-hosting</a></strong>: A single open-source Rust binary that exposes the extraction engine through a local HTTP server.</p></li><li><p><strong><a href="https://webclaw.io/docs/cloud">Cloud API</a></strong>: A fully managed service, where you sign up, create an API key, and start extracting data by calling webclaw&#8217;s remote APIs.</p></li></ul><p>Explore the pros and cons of each option!</p><h3>Self-Hosting</h3><p>webclaw&#8217;s full Rust stack is available under the <a href="https://opensource.org/license/agpl-3-0">AGPL-3.0 license </a>and can be self-hosted using Cargo installs or via Docker images. The self-hosted version also supports Ollama, allowing you to run the LLM-powered <span>extract</span> and <span>summarize</span> operations entirely on your own hardware.</p><p><strong>&#127919; Best for</strong>:</p><ul><li><p>Users who want unlimited local usage without a credit system.</p></li><li><p>Sites that don&#8217;t require JavaScript rendering and don&#8217;t involve bot protection.</p></li><li><p>Users who need full control over your data and infrastructure.</p></li></ul><p><strong>&#11015;&#65039; Drawbacks</strong>:</p><ul><li><p>You&#8217;re responsible for infrastructure, monitoring, maintenance, and scaling.</p></li><li><p>Synchronous crawls are limited to 500 pages.</p></li><li><p>You don&#8217;t get built-in bot-protection handling, JavaScript rendering, or proxy rotation.</p></li></ul><h3>Cloud API</h3><p>The webclaw Cloud API is a fully managed service, so there are no servers to run or infrastructure to maintain. Compared to the self-hosting option, it&#8217;s suitable for more demanding scraping workloads.</p><p><strong>&#127919; Best for</strong>:</p><ul><li><p>Sites that require JavaScript rendering.</p></li><li><p>Users who need scalable web data collection and don&#8217;t want to manage the infrastructure themselves.</p></li><li><p>Teams that want usage tracking, billing, and predictable monthly quotas.</p></li></ul><p><strong>&#11015;&#65039; Drawbacks</strong>:</p><ul><li><p>Usage is subject to monthly page quotas based on your plan.</p></li><li><p>Your data is processed through the webclaw cloud infrastructure.</p></li><li><p>Monthly rate limits based on your plan.</p></li></ul><h2>webclaw in Action: Getting Started</h2><p>In this section, I&#8217;ll walk through practical examples of using webclaw through its CLI and REST API. Keep in mind that you can achieve the same results through the SDKs or directly from AI agents using MCP integration.</p><p><strong>Disclaimer</strong>: webclaw provided me with a <em>Scale</em> plan with 1,000,000 credits to thoroughly test the product.</p><h3>Installation and Setup</h3><p>On a system with a working Rust toolchain, run this command to install the webclaw CLI:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">cargo install --git https://github.com/0xMassi/webclaw.git webclaw-cli</code></pre></div><p>Once the installation is complete, verify it by running:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">webclaw --version</code></pre></div><p>Alternatively, for a simpler setup, you can run webclaw directly with Docker:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">docker run --rm ghcr.io/0xmassi/webclaw "&lt;TARGET_URL&gt;"</code></pre></div><p>To check that the Docker setup is working, run:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">docker run --rm ghcr.io/0xmassi/webclaw --version</code></pre></div><p>In both cases, the command should return:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!fCT8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!fCT8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png 424w, https://substackcdn.com/image/fetch/$s_!fCT8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png 848w, https://substackcdn.com/image/fetch/$s_!fCT8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png 1272w, https://substackcdn.com/image/fetch/$s_!fCT8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!fCT8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png" width="1320" height="36" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:36,&quot;width&quot;:1320,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The result of the &#8220;--version&#8221; command&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The result of the &#8220;--version&#8221; command" title="The result of the &#8220;--version&#8221; command" srcset="https://substackcdn.com/image/fetch/$s_!fCT8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png 424w, https://substackcdn.com/image/fetch/$s_!fCT8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png 848w, https://substackcdn.com/image/fetch/$s_!fCT8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png 1272w, https://substackcdn.com/image/fetch/$s_!fCT8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3fcb913a-1fe2-41a2-b083-2302c1e29313_1320x36.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The result of the &#8220;--version&#8221; command</figcaption></figure></div><p>For more guidance, refer to <a href="https://webclaw.io/docs/getting-started">the &#8220;Getting Started&#8221; guide</a>.</p><p>To use webclaw&#8217;s Cloud API features, <a href="https://webclaw.io/login">create an account</a>. On the &#8220;API Keys&#8221; page of the dashboard, you&#8217;ll find a default API key that was automatically created when your account was set up:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xf_a!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xf_a!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png 424w, https://substackcdn.com/image/fetch/$s_!Xf_a!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png 848w, https://substackcdn.com/image/fetch/$s_!Xf_a!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png 1272w, https://substackcdn.com/image/fetch/$s_!Xf_a!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xf_a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png" width="1456" height="769" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:769,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the deafult webclaw API key&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the deafult webclaw API key" title="Note the deafult webclaw API key" srcset="https://substackcdn.com/image/fetch/$s_!Xf_a!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png 424w, https://substackcdn.com/image/fetch/$s_!Xf_a!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png 848w, https://substackcdn.com/image/fetch/$s_!Xf_a!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png 1272w, https://substackcdn.com/image/fetch/$s_!Xf_a!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c2a755-5354-44fe-aa86-27d4985d7840_3072x1622.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note the deafult webclaw API key</figcaption></figure></div><p>Alternatively, click &#8220;Create key&#8221; and follow the setup wizard to generate a new webclaw API key.</p><h3>Example #1: Scrape a Web Page in Multiple Formats</h3><p>Suppose you want to scrape the &#8220;<em><a href="https://quotes.toscrape.com/">Quotes to Scrape</a></em>&#8221; website. Achieve that with the webclaw CLI as below:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">webclaw "https://quotes.toscrape.com/"</code></pre></div><p><strong>Note</strong>: If you&#8217;re a Docker user, remember to replace <span>webclaw</span> with <code>docker run --rm ghcr.io/0xmassi/webclaw</code>.</p><p>By default, webclaw will return Markdown content:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!KbLI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!KbLI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png 424w, https://substackcdn.com/image/fetch/$s_!KbLI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png 848w, https://substackcdn.com/image/fetch/$s_!KbLI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png 1272w, https://substackcdn.com/image/fetch/$s_!KbLI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!KbLI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png" width="1456" height="573" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:573,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the Markdown representation of &#8220;Quotes to Scrape&#8221; returned by the webclaw command&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the Markdown representation of &#8220;Quotes to Scrape&#8221; returned by the webclaw command" title="Note the Markdown representation of &#8220;Quotes to Scrape&#8221; returned by the webclaw command" srcset="https://substackcdn.com/image/fetch/$s_!KbLI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png 424w, https://substackcdn.com/image/fetch/$s_!KbLI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png 848w, https://substackcdn.com/image/fetch/$s_!KbLI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png 1272w, https://substackcdn.com/image/fetch/$s_!KbLI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbde1da17-f5d9-4037-8c9b-77b96fbdd7e9_2997x1179.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note the Markdown representation of &#8220;Quotes to Scrape&#8221; returned by the webclaw command</figcaption></figure></div><p>Now, assume you want to access the same page in JSON format. Specify the <code>--format "json"</code> option:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">webclaw "https://quotes.toscrape.com/" --format "json"</code></pre></div><p>This time, you will get a structured JSON response containing the web page in Markdown:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!o5A4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!o5A4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png 424w, https://substackcdn.com/image/fetch/$s_!o5A4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png 848w, https://substackcdn.com/image/fetch/$s_!o5A4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png 1272w, https://substackcdn.com/image/fetch/$s_!o5A4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!o5A4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png" width="1456" height="805" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:805,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The JSON response produced by webclaw&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The JSON response produced by webclaw" title="The JSON response produced by webclaw" srcset="https://substackcdn.com/image/fetch/$s_!o5A4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png 424w, https://substackcdn.com/image/fetch/$s_!o5A4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png 848w, https://substackcdn.com/image/fetch/$s_!o5A4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png 1272w, https://substackcdn.com/image/fetch/$s_!o5A4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5e43ec11-8d92-4de1-b8b0-6021409f0eb6_3034x1677.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The JSON response produced by webclaw</figcaption></figure></div><p>Notice how it also contains a <span>links</span> array with all the URLs on the page.</p><p>Finally, test the special LLM-ready output:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">webclaw "https://quotes.toscrape.com/" --format "llm"</code></pre></div><p>The result will look like this:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!6zFv!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!6zFv!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png 424w, https://substackcdn.com/image/fetch/$s_!6zFv!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png 848w, https://substackcdn.com/image/fetch/$s_!6zFv!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png 1272w, https://substackcdn.com/image/fetch/$s_!6zFv!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!6zFv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png" width="1456" height="738" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/caff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:738,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The LLM-optimized output produced by webclaw&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The LLM-optimized output produced by webclaw" title="The LLM-optimized output produced by webclaw" srcset="https://substackcdn.com/image/fetch/$s_!6zFv!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png 424w, https://substackcdn.com/image/fetch/$s_!6zFv!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png 848w, https://substackcdn.com/image/fetch/$s_!6zFv!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png 1272w, https://substackcdn.com/image/fetch/$s_!6zFv!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcaff8d41-f9dd-45bf-b5b8-d059054c9266_3055x1548.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The LLM-optimized output produced by webclaw</figcaption></figure></div><p>The produced data format combines the structured metadata of the JSON output with the readability of Markdown. It&#8217;s optimized for LLM consumption, removing unnecessary line breaks and whitespace to reduce token usage while keeping the content structured and easy for AI models to process.</p><p>Note that you can achieve the same result by calling the webclaw Cloud API like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">curl -X POST https://api.webclaw.io/v1/scrape \
  -H "Authorization: Bearer &lt;YOUR_WEBCLAW_API_KEY&gt;" \
  -H "Content-Type: application/json" \
 -d '{"url":"https://quotes.toscrape.com/","format":["markdown"]}'</code></pre></div><p>When you pass the output through a JSON beautifier/parser, the result will be:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Y8bS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Y8bS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png 424w, https://substackcdn.com/image/fetch/$s_!Y8bS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png 848w, https://substackcdn.com/image/fetch/$s_!Y8bS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png 1272w, https://substackcdn.com/image/fetch/$s_!Y8bS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Y8bS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png" width="1456" height="495" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:495,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The response produced by the Cloud API&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The response produced by the Cloud API" title="The response produced by the Cloud API" srcset="https://substackcdn.com/image/fetch/$s_!Y8bS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png 424w, https://substackcdn.com/image/fetch/$s_!Y8bS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png 848w, https://substackcdn.com/image/fetch/$s_!Y8bS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png 1272w, https://substackcdn.com/image/fetch/$s_!Y8bS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F69ac5d14-87e3-4372-bc91-43b0292947e9_3040x1034.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The response produced by the Cloud API</figcaption></figure></div><h3>Example #2: Access a Dynamic Web Page Requiring JavaScript Rendering</h3><p>Now, target a webpage that requires JavaScript rendering, such as the <a href="https://quotes.toscrape.com/js/">JavaScript version of &#8220;</a><em><a href="https://quotes.toscrape.com/js/">Quote to Scrape</a></em><a href="https://quotes.toscrape.com/js/">&#8221;</a>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">webclaw "https://quotes.toscrape.com/js/"</code></pre></div><p>The result will be:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NfeW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NfeW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png 424w, https://substackcdn.com/image/fetch/$s_!NfeW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png 848w, https://substackcdn.com/image/fetch/$s_!NfeW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png 1272w, https://substackcdn.com/image/fetch/$s_!NfeW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NfeW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png" width="1456" height="48" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:48,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the truncated response&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the truncated response" title="Note the truncated response" srcset="https://substackcdn.com/image/fetch/$s_!NfeW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png 424w, https://substackcdn.com/image/fetch/$s_!NfeW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png 848w, https://substackcdn.com/image/fetch/$s_!NfeW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png 1272w, https://substackcdn.com/image/fetch/$s_!NfeW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc9ea81e-7c84-46f8-bd6a-5601a13f6b87_3072x102.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Note the truncated response</figcaption></figure></div><p>Notice that the returned Markdown contains only the page&#8217;s static content. It doesn&#8217;t include the content dynamically added by JavaScript.</p><p>To scrape JavaScript-dependent pages, you must rely on the webclaw Cloud API:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">curl -X POST https://api.webclaw.io/v1/scrape \
  -H "Authorization: Bearer &lt;YOUR_WEBCLAW_API_KEY&gt;" \
  -H "Content-Type: application/json" \
 -d '{"url":"https://quotes.toscrape.com/js/"}'</code></pre></div><p>This time, the <span>markdown</span> field contains the complete page, including the content rendered dynamically by JavaScript:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bu9f!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bu9f!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png 424w, https://substackcdn.com/image/fetch/$s_!bu9f!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png 848w, https://substackcdn.com/image/fetch/$s_!bu9f!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png 1272w, https://substackcdn.com/image/fetch/$s_!bu9f!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bu9f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png" width="1456" height="786" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:786,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the full content of the JS-rendered page in the &#8220;markdown&#8221; field&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the full content of the JS-rendered page in the &#8220;markdown&#8221; field" title="Note the full content of the JS-rendered page in the &#8220;markdown&#8221; field" srcset="https://substackcdn.com/image/fetch/$s_!bu9f!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png 424w, https://substackcdn.com/image/fetch/$s_!bu9f!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png 848w, https://substackcdn.com/image/fetch/$s_!bu9f!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png 1272w, https://substackcdn.com/image/fetch/$s_!bu9f!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F201ea2e9-7470-4107-97b7-27b91ac6c647_3042x1642.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note the full content of the JS-rendered page in the &#8220;markdown&#8221; field</figcaption></figure></div><p><strong>Note</strong>: In my tests, the Cloud API wasn&#8217;t able to scrape any pages that the CLI couldn&#8217;t already scrape. At the time of testing, this suggests that the anti-bot bypass functionality may not be working as expected.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h3>Example #3: Scrape with CSS Selector Filtering</h3><p>Suppose you want to extract only a particular section of a webpage:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mm7P!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mm7P!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png 424w, https://substackcdn.com/image/fetch/$s_!mm7P!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png 848w, https://substackcdn.com/image/fetch/$s_!mm7P!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png 1272w, https://substackcdn.com/image/fetch/$s_!mm7P!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mm7P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png" width="1456" height="782" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:782,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the &#8220;#prodInfos&#8221; element with the main product data&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the &#8220;#prodInfos&#8221; element with the main product data" title="Note the &#8220;#prodInfos&#8221; element with the main product data" srcset="https://substackcdn.com/image/fetch/$s_!mm7P!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png 424w, https://substackcdn.com/image/fetch/$s_!mm7P!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png 848w, https://substackcdn.com/image/fetch/$s_!mm7P!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png 1272w, https://substackcdn.com/image/fetch/$s_!mm7P!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F68c21d97-b7aa-4cc7-86a1-22144e82e018_3032x1628.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note the &#8220;#prodInfos&#8221; element with the main product data</figcaption></figure></div><p>You can use the <code>--include</code> option to select specific elements (or <code>--exclude</code> to filter them out). Here, you only want to extract the <span>#prodInfos</span> element. So, write:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">webclaw "https://world.openfoodfacts.org/product/6111242100992/perly-jaouda" --include "#prodInfos"</code></pre></div><p>The result will contain only that specific section of the page:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!R45I!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!R45I!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png 424w, https://substackcdn.com/image/fetch/$s_!R45I!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png 848w, https://substackcdn.com/image/fetch/$s_!R45I!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!R45I!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!R45I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png" width="1456" height="650" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:650,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note that the output is limited to the selected page section&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note that the output is limited to the selected page section" title="Note that the output is limited to the selected page section" srcset="https://substackcdn.com/image/fetch/$s_!R45I!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png 424w, https://substackcdn.com/image/fetch/$s_!R45I!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png 848w, https://substackcdn.com/image/fetch/$s_!R45I!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png 1272w, https://substackcdn.com/image/fetch/$s_!R45I!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7e8f7742-523e-4104-ae00-78dc40153c0b_3032x1354.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note that the output is limited to the selected page section</figcaption></figure></div><p>You can achieve the same outcome with the Cloud API by using the <span>include_selectors</span> field in the request body:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">curl -X POST https://api.webclaw.io/v1/scrape \
  -H "Authorization: Bearer &lt;YOUR_WEBCLAW_API_KEY&gt;" \
  -H "Content-Type: application/json" \
 -d '{"url":"https://world.openfoodfacts.org/product/6111242100992/perly-jaouda","include_selectors":["#prodInfos"]}'</code></pre></div><p>Now, suppose you want to scrape a webpage with a header and footer, such as a blog post. In this case, you are generally interested only in the main body content. webclaw supports that use case via the <code>--only-main-content</code> option:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">webclaw "https://world.openfoodfacts.org/product/6111242100992/perly-jaouda" --only-main-content</code></pre></div><p>Similarly, you can use the <code>only_main_content</code> field with the Cloud API:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">curl -X POST https://api.webclaw.io/v1/scrape \
  -H "Authorization: Bearer &lt;YOUR_WEBCLAW_API_KEY&gt;" \
  -H "Content-Type: application/json" \
 -d '{"url":"https://world.openfoodfacts.org/product/6111242100992/perly-jaouda","only_main_content":true}'</code></pre></div><h3>Example #4: Crawl a Site</h3><p>webclaw supports <a href="https://www.codecademy.com/article/breadth-first-search-bfs-algorithm">Breadth-First Search (BFS)</a> crawling, allowing you to discover and scrape multiple pages starting from a single URL. For example, you can crawl up to <code>10</code> pages from Quote to Scrape with a maximum depth of <code>3</code>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">webclaw "https://quotes.toscrape.com/" --crawl --depth 3 --max-pages 10</code></pre></div><p>The command will return the discovered pages along with the Markdown content extracted from each one:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IARF!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IARF!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png 424w, https://substackcdn.com/image/fetch/$s_!IARF!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png 848w, https://substackcdn.com/image/fetch/$s_!IARF!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png 1272w, https://substackcdn.com/image/fetch/$s_!IARF!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IARF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png" width="1456" height="432" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:432,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The output of the &#8220;webclaw&#8221; command&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The output of the &#8220;webclaw&#8221; command" title="The output of the &#8220;webclaw&#8221; command" srcset="https://substackcdn.com/image/fetch/$s_!IARF!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png 424w, https://substackcdn.com/image/fetch/$s_!IARF!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png 848w, https://substackcdn.com/image/fetch/$s_!IARF!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png 1272w, https://substackcdn.com/image/fetch/$s_!IARF!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F66a7882e-87c6-4d7a-bc88-1fe87a93d547_3036x900.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The output of the &#8220;webclaw&#8221; command</figcaption></figure></div><p>You can perform the same crawl through the Cloud API:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">curl -X POST "https://api.webclaw.io/v1/crawl" \
  -H "Authorization: Bearer &lt;YOUR_WEBCLAW_API_KEY&gt;" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://quotes.toscrape.com/","max_depth": 3,"max_pages": 10}'</code></pre></div><p>Unlike the CLI command, the Cloud API processes the crawl asynchronously. The initial request returns an ID for the crawl task:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!PCxA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!PCxA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png 424w, https://substackcdn.com/image/fetch/$s_!PCxA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png 848w, https://substackcdn.com/image/fetch/$s_!PCxA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png 1272w, https://substackcdn.com/image/fetch/$s_!PCxA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!PCxA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png" width="1456" height="85" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:85,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The output of the &#8220;/v1/crawl&#8221; endpoint&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The output of the &#8220;/v1/crawl&#8221; endpoint" title="The output of the &#8220;/v1/crawl&#8221; endpoint" srcset="https://substackcdn.com/image/fetch/$s_!PCxA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png 424w, https://substackcdn.com/image/fetch/$s_!PCxA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png 848w, https://substackcdn.com/image/fetch/$s_!PCxA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png 1272w, https://substackcdn.com/image/fetch/$s_!PCxA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1e3af0f-ec81-40db-9320-bddd9fcca5fb_2668x156.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The output of the &#8220;/v1/crawl&#8221; endpoint</figcaption></figure></div><p>You can then use this ID to poll for the crawl status:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">curl "https://api.webclaw.io/v1/crawl/88e08765-f44a-4e26-a4d6-3552bef983cb" \
  -H "Authorization: Bearer &lt;YOUR_WEBCLAW_API_KEY&gt;" \
  -H "Content-Type: application/json"</code></pre></div><p>Once the crawl is complete, the response will look similar to this. The <span>pages</span> array contains the content extracted from all successfully scraped pages:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8_nJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8_nJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png 424w, https://substackcdn.com/image/fetch/$s_!8_nJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png 848w, https://substackcdn.com/image/fetch/$s_!8_nJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png 1272w, https://substackcdn.com/image/fetch/$s_!8_nJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8_nJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png" width="1456" height="336" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:336,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the &#8220;pages&#8221; array with the 10 scraped pages&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the &#8220;pages&#8221; array with the 10 scraped pages" title="Note the &#8220;pages&#8221; array with the 10 scraped pages" srcset="https://substackcdn.com/image/fetch/$s_!8_nJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png 424w, https://substackcdn.com/image/fetch/$s_!8_nJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png 848w, https://substackcdn.com/image/fetch/$s_!8_nJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png 1272w, https://substackcdn.com/image/fetch/$s_!8_nJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F41fb4980-f25b-47fc-a897-ebf50dee4a42_3030x700.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Note the &#8220;pages&#8221; array with the 10 scraped pages</figcaption></figure></div><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h3>Pricing Options and Plans</h3><p>As of this writing, webclaw&#8217;s pricing plans can be summarized as follows:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FTik!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FTik!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png 424w, https://substackcdn.com/image/fetch/$s_!FTik!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png 848w, https://substackcdn.com/image/fetch/$s_!FTik!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png 1272w, https://substackcdn.com/image/fetch/$s_!FTik!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FTik!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png" width="1456" height="324" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:324,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:62089,&quot;alt&quot;:&quot;webclaw&#8217;s pricing plans&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/215468272?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="webclaw&#8217;s pricing plans" title="webclaw&#8217;s pricing plans" srcset="https://substackcdn.com/image/fetch/$s_!FTik!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png 424w, https://substackcdn.com/image/fetch/$s_!FTik!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png 848w, https://substackcdn.com/image/fetch/$s_!FTik!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png 1272w, https://substackcdn.com/image/fetch/$s_!FTik!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F06b7ad29-3cf7-4613-958a-be9b557d8d66_1491x332.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">webclaw&#8217;s pricing plans</figcaption></figure></div><p>All cloud plans can be billed monthly or annually, with annual billing offering two months for free.</p><p><strong>Important notes</strong>:</p><ul><li><p>The credit pool is shared across all API endpoints.</p></li><li><p>A free tier with 3 runs per day is available indefinitely, with no credit card required.</p></li><li><p>The <em>Starter</em> plan includes a card-required 7-day free trial, giving you temporary access to the plan before you commit.</p></li><li><p>Self-hosting provides unlimited local usage with no credit system.</p></li></ul><div><hr></div><p>The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p><div><hr></div><h2>Final Thoughts on webclaw</h2><p>webclaw is definitely an interesting solution, and I personally found the CLI easy to use. The API interface is also quite intuitive, and its Firecrawl compatibility is definitely a plus.</p><p>The project is still young (the first commit was made in March 2026), and this shows in a few areas (e.g., unexpected behavior of input parameters or defaults). I also found some inconsistencies between the GitHub page and the official website and documentation. Still, that&#8217;s fairly common with fast-evolving projects, I have to say. (That&#8217;s why technical writers like me still have a job&#8230; for now, at least! &#128521;)</p><p>I especially appreciated the support from <a href="https://www.linkedin.com/in/valerio-massimiani/">Valerio Massimiani</a>, the founder of webclaw. He provided me with a Scale plan, remained available to answer my questions, took care of my FAQ requests, and was responsive throughout the process.</p><p>On the other hand, I found the self-hosting setup quite difficult, especially on Windows and when installing via Cargo. Docker, by comparison, was super easy.</p><p>I also found the overall anti-bot experience somewhat inconsistent. webclaw was able to bypass challenging sites such as L&#8217;Occitane, Temu, and Nike even from the CLI. However, when the CLI failed because of anti-bot protection (e.g., on Cloudflare-protected sites, Herm&#232;s, Canada Goose, and others), the cloud version failed as well. At least, in my tests&#8230;</p><p>That being said, the project has plenty of potential and is clearly moving forward quickly. I&#8217;ll definitely keep an eye on it and see how it develops, especially given how interesting the overall concept is and how easy it is to integrate webclaw with local AI agents.</p><div><hr></div><p><em>Did you like this article? Share it with someone who might find it useful and get a discount on paid plans.</em></p><h2>FAQ</h2><p><strong>Disclaimer</strong>: The following FAQ questions were answered by Valerio Massimiani, the founder of the project.</p><h3>How does webclaw differ from Firecrawl?</h3><p>webclaw is written in Rust and skips the browser for most pages, so it&#8217;s faster and cheaper to run. Output is LLM-shaped by default, and an MCP server lets agents call it directly. Firecrawl-compatible <code>/v2</code> endpoints mean existing Firecrawl code can point at it unchanged.</p><h3>Can I use webclaw with my existing web scraping code?</h3><p>Yes. There are REST endpoints plus official Python, TypeScript, and Go SDKs, so it drops into existing pipelines. If you already run Firecrawl, the <code>/v2</code> compatibility layer covers scrape, crawl, map, and search, so most code moves by changing the base URL and key.</p><h3>Does webclaw come with official agent skills?</h3><p>Yes. <code>npx skills add 0xMassi/webclaw-skill</code> installs two: a webclaw skill covering the MCP tools, and a lead-enrichment skill that runs discovery and enrichment over <code>/v1/extract</code>. Both work in Claude Code and any agent that reads the skills format.</p><h3>Does webclaw support proxy integration?</h3><p>Yes. Self-hosted, pass <code>--proxy</code> for a single upstream or <code>--proxy-file</code> to rotate a pool per request; both also read from environment variables. HTTP and SOCKS5 are supported. On the managed API, proxying is handled for you and needs no configuration.</p><h3>What&#8217;s the difference between the webclaw CLI and the REST API?</h3><p>Same extraction engine, different entry point. The CLI runs locally, needs no key for most sites, and suits one-off scrapes and scripts. The REST API adds authentication, async jobs for crawl and research, and managed handling of protected pages. The output is identical.</p><h3>How does the LLM optimization actually work?</h3><p>The <code>llm</code> format strips navigation, footers, scripts, and tracking markup, then flattens what remains into compact prose with headings and links preserved. The result is a fraction of the original token count. Schema-based extraction goes further and returns typed JSON you can validate.</p><h3>Is my data private with the webclaw Cloud API?</h3><p>Content is fetched per request and returned to you. Results may be cached briefly so repeat requests for the same URL are faster. Public pages aren&#8217;t private data, but don&#8217;t route credentials through the API. Self-host if you need full control of the pipeline.</p>]]></content:encoded></item><item><title><![CDATA[Deterministic Data: The Case for Web Scraping Over LLM Web Search Tools]]></title><description><![CDATA[Understanding the non-deterministic nature of AI web access, and why web scraping is the best retrieval layer]]></description><link>https://www.scraping.club/p/llm-scraping-web-search-tool</link><guid isPermaLink="false">https://www.scraping.club/p/llm-scraping-web-search-tool</guid><dc:creator><![CDATA[Federico Trotta]]></dc:creator><pubDate>Sun, 13 Sep 2026 18:53:20 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/68a2affd-c966-48a5-ac04-3e58c2c508fa_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>In &#8220;<a href="https://substack.thewebscraping.club/p/rag-pipeline-web-scraping">Why Your RAG Pipelines Are Only as Good as Your Data Acquisition Layer</a>&#8221;, I discussed that web search tools have some limitations and do not replace web scraping.</p><p>To help you understand that better, I decided to write a dedicated article on that matter. This article explains what tools are for LLMs, how tool calls work, and presents the limitations of web search tools. Also, it presents two practical sections where I test commonly used models and their web search tools. This will help you visually understand the whys behind the statements.</p><p>Let&#8217;s dive into it!</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p></blockquote><div><hr></div><h2>What are Tools in LLMs and How Does Tool Calling Work</h2><p>Large Language Models are stateless systems. This means that their knowledge is frozen at a training cutoff, so they have no familiarity with the world beyond them when training is completed. This architectural constraint is a deliberate design boundary that keeps inference deterministic and safe. However, it creates a profound usability gap: a model that cannot act on the &#8220;current version of the world&#8221; is only marginally useful. This is the exact gap that tools were built to close.</p><h3>Defining Tools: A Formal Perspective</h3><p>In the context of LLMs, a tool is a formally declared, schema-bound capability that the model can invoke. But pay attention here: LLMs can invoke tools, but cannot execute them. This distinction is essential because the model does not run code: it produces a structured intent, a precise, machine-readable declaration that it wishes a specific function to be called with specific arguments.</p><p>This means that execution authority remains entirely with the host application or orchestration layer. For this reason, a tool can be best defined as a typed contract between the model and its runtime environment: it specifies a function name, a set of typed input parameters, and a natural-language description that the model uses to reason about when and why to invoke it.</p><p>A canonical tool definition, as described in the <a href="https://developers.openai.com/api/docs/guides/function-calling#function-tool-example">OpenAI function-calling specification</a>, looks structurally like the following example:</p><pre><code><code>tools = [
    {
        "type": "function",
        "function": {
            "name": "get_current_weather",
            "description": "Retrieve the current weather for a given city. Use this when the user asks about live weather conditions.",
            "parameters": {
                "type": "object",
                "properties": {
                    "location": {
                        "type": "string",
                        "description": "The city and country, e.g. 'Rome, Italy'"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"]
                    }
                },
                "required": ["location"]
            }
        }
    }
]</code></code></pre><p>This schema is injected into the model&#8217;s context, typically as a structured system-level payload, before inference begins. So, the model does not &#8220;learn&#8221; tools: it reads them at runtime, the same way a human engineer reads an API specification before writing an integration.</p><div><hr></div><blockquote><p>AI can help you make sense of web data, but first you need to collect it. For teams building controlled, repeatable scraping workflows, <a href="https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_8&amp;utm_content=scraping_over_llm">anyIP provides the access layer with high-quality residential and mobile proxies worldwide</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_8&amp;utm_content=scraping_over_llm" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!F9kg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F9kg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F9kg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F9kg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!F9kg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg" width="1456" height="727" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:727,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1066101,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:&quot;https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_8&amp;utm_content=scraping_over_llm&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!F9kg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg 424w, https://substackcdn.com/image/fetch/$s_!F9kg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg 848w, https://substackcdn.com/image/fetch/$s_!F9kg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!F9kg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd367d5fa-4dc1-4a36-8f47-9ca483e1f5ff_5322x2658.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_8&amp;utm_content=scraping_over_llm&quot;,&quot;text&quot;:&quot;Power your data workflow with anyIP &#8594;&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_8&amp;utm_content=scraping_over_llm"><span>Power your data workflow with anyIP &#8594;</span></a></p></blockquote><div><hr></div><h3>The Tool Calling Lifecycle</h3><p>You can use LLMs via chat and via APIs, depending on your preference and needs. Regardless of the use, LLMs have the possibility to call tools. This paragraph presents the lifecycle of explicitly calling tools via APIs, from the first to the last step.</p><h5><strong>Step #1: Context Injection</strong></h5><p>The developer serializes all available tool definitions into the model&#8217;s context alongside the system prompt and conversation history. Modern APIs expose a dedicated <em>tools</em> parameter for this purpose, keeping tool schemas structurally separated from the natural-language turns&#8212;though under the hood, they are always rendered into the token stream the model attends to.</p><h5><strong>Step #2: Model Reasoning and Tool Selection</strong></h5><p>During inference, the model performs implicit reasoning over the user&#8217;s intent and the available tool schemas. But note that this works the same as the next-token prediction mechanism driving all LLM outputs. The only difference is that now it is conditioned on a richer context that includes typed function signatures.</p><p>At this point, the model must determine: &#8220;Is a tool call warranted here? If so, which tool? What arguments should be passed?&#8220;<em>.</em></p><p>This decision is governed entirely by the attention mechanism attending to both the user query and the tool descriptions. This is precisely why the <em>description</em> field in a tool schema is a signal that directly influences the model&#8217;s routing behavior.</p><h5><strong>Step #3: Structured Output Generation</strong></h5><p>When the model decides to invoke a tool, it does not generate a natural-language response. Instead, it emits a tool call object. This is a structured payload containing the resolved function name and a JSON-serialized argument map. In the OpenAI API format, this surfaces as a <em>tool_calls</em> array on the assistant message object, with <em>finish_reason</em> set to <em>&#8220;tool_calls&#8221;</em> rather than <em>&#8220;stop&#8221;</em>, signaling the host application that the turn is not complete:</p><pre><code><code>{
  "role": "assistant",
  "content": null,
  "tool_calls": [
    {
      "id": "call_abc123",
      "type": "function",
      "function": {
        "name": "get_current_weather",
        "arguments": "{\"location\": \"Rome, Italy\", \"unit\": \"celsius\"}"
      }
    }
  ]
}
</code></code></pre><p>Note that <em>arguments </em>is a <em>JSON-encoded string</em>, not a nested object. This is intentional because it decouples the model&#8217;s output format from the host&#8217;s parsing logic and makes partial streaming of arguments tractable.</p><h5><strong>Step #4: Host-side Execution</strong></h5><p>The orchestration layer intercepts the <em>tool_calls</em> payload, deserializes the arguments, validates them against the declared schema, and dispatches the call to the actual function implementation. This may be a REST API call, a database query, a local Python function, a subprocess, or any arbitrary computation, depending on the case. Note that the model has no visibility into this execution layer: it simply waits until the process is completed.</p><h5><strong>Step #5: Result Injection and Continuation</strong></h5><p>Once execution completes, the host appends the function result back into the conversation as a tool message, which is a distinct message role (<em>&#8220;role&#8221;: &#8220;tool&#8221;</em>) that carries the <em>tool_call_id</em> for correlation and the result payload as a string:</p><pre><code><code>{
  "role": "tool",
  "tool_call_id": "call_abc123",
  "content": "{\"temperature\": 28, \"condition\": \"Sunny\", \"humidity\": 45}"
}
</code></code></pre><p>The full conversation history is then fed back into the model for a continuation inference pass. Only at this point does the model generate the final response in natural language. This way, the response is grounded in that the model could not have accessed it from its weights alone.</p><div><hr></div><blockquote><p><strong>S<a href="https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE">tart your scraping journey with Byteful</a></strong>: 10GB New Customer Trial | Use TWSC for 15% OFF | $1.75/GB Residential Data | ISP Proxies in 15+ Countries</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://byteful.com/?promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EOo9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 424w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 848w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1272w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png" width="630" height="69.35779816513761" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:120,&quot;width&quot;:1090,&quot;resizeWidth&quot;:630,&quot;bytes&quot;:133037,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://byteful.com/?promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/194398731?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!EOo9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 424w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 848w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1272w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE&quot;,&quot;text&quot;:&quot;Claim your 10GB here&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE"><span>Claim your 10GB here</span></a></p></blockquote><div><hr></div><div><hr></div><h2>Web Search Tools Do Not Substitute Traditional Web Scraping: Here&#8217;s Why</h2><p>One of the most common tools surfaced to LLMs is the web search tool, and its use is understandable: it is an obvious remedy to the knowledge cutoff problem. However, practitioners often make a critical architectural assumption: they treat the web search tool as a general-purpose solution for web-based information retrieval.</p><p>This assumption is a huge mistake, because web search and web scraping are different mechanisms operating at different layers of the information stack. This section discusses the reasons behind the fact that conflating the two is wrong.</p><h3>What a Web Search Tool Actually Does</h3><p>As previously introduced, when a model invokes a tool, the orchestration layer dispatches the call to the actual function implementation. When it comes to web search tools, what typically happens is that the underlying LLM&#8217;s implementation delegates to a search engine API.</p><p>Now, depending on the usage (aka, you are using the LLM via chat or via API), and also depending on the actual type of web search tool integrated into the LLM, after accessing the web, the tool can return one or more of the following:</p><ul><li><p>Page titles</p></li><li><p>URLs</p></li><li><p>Short snippets/descriptions (often 160&#8211;3000+ chars depending on the provider)</p></li><li><p>Metadata (e.g., publication dates)</p></li><li><p>The entire page content or rich excerpts, pre-formatted for LLM consumption (but this only happens for specific web search tools)</p></li></ul><p>Now, the point that is interesting for scraping professionals is that the output of the web search tool feeds the LLM, and it responds to the user query using that output. This means that you can write a query to an LLM, and it can confidently hallucinate a wide response that is based only on the data retrieved in the URL and page title.</p><p>The point is that you actually have no clue about what has happened under the hood. For example, you may be using an external web search tool called via APIs, thinking you have more control over the process. But the tool may fail at fetching the whole page content because of anti-bots. So, it retrieves only metadata, page title, and URL, and the model hallucinates the response based on that.</p><p>Yes, this is very bad news&#8230;</p><h3>The Semantic Query Constraint of Web Search</h3><p>Another thing to consider is that web search tools operate in query space. This means that the model generates a natural-language or query string, the search API processes it, and the response is a ranked list of results (regardless of the actual access to the complete web content, which comes in a second step). This is basically a semantic approximation of the information that users need, mediated by the search engine&#8217;s interpretation of query intent. In other words: the result you obtain is basically a black box, because no one knows how search engines rank the results.</p><p>This has a direct consequence on information precision. When a model needs to answer a question that requires information from a specific document, a table on a specific page, a structured dataset at a known URL, or a real-time feed from a specific API, a search query is a lossy and unreliable retrieval mechanism. What happens in this case is that the model must express its information need as a query string, the search engine must interpret that string, rank the relevant URLs, and return snippets, and only then can the model reason over that output. At each step in this chain, there is information loss and potential for a mismatch between the actual information needed and what is returned.</p><p>Web scraping, in contrast, operates in URL space. The retrieval is deterministic given a target URL: the scraper issues a request to a specific resource and returns its content. End of the story.</p><p>This is the correct retrieval primitive for any workflow where the information source is known in advance or where the crawl path can be programmatically determined.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h3>Why Web Search Tools Cannot Serve as a RAG Retrieval Layer</h3><p>This is perhaps the most consequential architectural confusion in modern LLM system design, and it deserves specific treatment. It is also highly tied to the fact that web search tools operate in the query space.</p><p>Retrieval-Augmented Generation, in its canonical form, is a two-phase architecture:</p><ul><li><p>In the offline phase, a corpus of documents is chunked, embedded into a dense vector space using an embedding model, and stored in a vector database.</p></li><li><p>In the online phase, a query is embedded into the same vector space, a nearest-neighbor search retrieves the most semantically relevant chunks, and those chunks are injected into the model&#8217;s context window as grounding material.</p></li></ul><p>The key property of this architecture is that the retrieval operates over a controlled, pre-indexed, owned corpus, and the retrieved content is the full, raw text of the original document chunks, not a summary of them.</p><p>Web search tools, as discussed above, operate on an entirely different substrate. So, there is no owned corpus, no embedding model under your control, no vector store you can inspect, audit, or fine-tune.</p><h3>The HTML-to-Markdown Pipeline: The Correct Content Format for LLM Ingestion</h3><p>Even setting aside all the preceding architectural arguments, there is a final, purely pragmatic reason why web scraping provides a qualitatively superior content retrieval primitive for LLM-based systems. Web scraping ****gives you the raw document, which you can transform into any downstream representation you need.</p><p>A web scraper that issues a request to a target URL receives the full HTTP response body. This raw HTML is the ground truth of the page&#8217;s content. From it, you can <a href="https://substack.thewebscraping.club/p/scraping-with-llms-gpt-vision">extract structured data via DOM traversal</a> using libraries like <a href="https://beautiful-soup-4.readthedocs.io/en/latest/">BeautifulSoup</a> or <a href="https://lxml.de">lxml</a>, execute JavaScript to <a href="https://substack.thewebscraping.club/p/handling-infinite-scrolling-python-js">capture dynamically rendered content via headless browsers</a>, parse semantic HTML elements with full structural fidelity, and apply custom filtering to strip navigation chrome, cookie banners, and boilerplate that would otherwise pollute the model&#8217;s context.</p><p>Another important point to consider is that raw HTML can be converted to Markdown. <a href="https://substack.thewebscraping.club/p/why-scraping-return-markdown-llm-ai">Markdown is the optimal serialization format for LLM</a> context injection for a set of concrete reasons:</p><ul><li><p>It preserves document hierarchy.</p></li><li><p>It encodes list and table structure without the verbose tag overhead of HTML.</p></li><li><p>It represents code blocks with fenced syntax that models trained on large code corpora recognize and parse with high reliability.</p></li><li><p>It strips rendering-irrelevant attributes and style information that consume context tokens without contributing to informational density.</p></li><li><p>It is the format in which the vast majority of LLM training corpora are natively expressed.</p></li></ul><p>For such reasons, a model reasoning over a Markdown-serialized document is, in a certain way, reasoning in its native register.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h2>Testing Web Search Tools</h2><p>In this section, you will understand the whys behind what you read above. You will see the tests I performed and the results I obtained. Specifically, the tool calls will be performed via chat. This is because the (partial) results of what happens under the hood are easier to show, and these are useful for your understanding.</p><p>This section has two different testing sub-sections:</p><ul><li><p>In the first one, you&#8217;ll see what happens when prompting different LLMs, asking them to search for specific sources.</p></li><li><p>In the second one, you&#8217;ll see what happens when you specifically ask an LLM to open a specific URL.</p></li></ul><p>DISCLAIMER: Note that native tool calling (calling tools via the chat) is more probabilistic and less controllable than invoking them via APIs. This is because the exact internal mechanisms by which specific providers implement native tool invocation policies are not publicly documented. However, the examples still fit the needs of this article.</p><h3>Testing Examples Type #1: Asking LLMs to Search for Consolidating Trends</h3><p>Let&#8217;s see how different LLMs react when asked to search for specific sources.</p><h5><strong>Claude</strong></h5><p>Let&#8217;s start the tests by prompting Claude with the following:</p><pre><code><code>Tell me about recent analyst reports and news articles about consolidation trends in the AI industry.
</code></code></pre><p>Here&#8217;s the chat image:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yd4S!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yd4S!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png 424w, https://substackcdn.com/image/fetch/$s_!Yd4S!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png 848w, https://substackcdn.com/image/fetch/$s_!Yd4S!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png 1272w, https://substackcdn.com/image/fetch/$s_!Yd4S!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yd4S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png" width="1062" height="366" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:366,&quot;width&quot;:1062,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:49240,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Yd4S!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png 424w, https://substackcdn.com/image/fetch/$s_!Yd4S!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png 848w, https://substackcdn.com/image/fetch/$s_!Yd4S!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png 1272w, https://substackcdn.com/image/fetch/$s_!Yd4S!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ff69ee6-f554-4a69-92bb-0be1a5bacac9_1062x366.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Below is what happens:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aTLc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aTLc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png 424w, https://substackcdn.com/image/fetch/$s_!aTLc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png 848w, https://substackcdn.com/image/fetch/$s_!aTLc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png 1272w, https://substackcdn.com/image/fetch/$s_!aTLc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aTLc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png" width="916" height="717" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:717,&quot;width&quot;:916,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:135341,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aTLc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png 424w, https://substackcdn.com/image/fetch/$s_!aTLc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png 848w, https://substackcdn.com/image/fetch/$s_!aTLc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png 1272w, https://substackcdn.com/image/fetch/$s_!aTLc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51ba8b4d-d734-4fdd-85e7-f74aa1235758_916x717.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As you can see, Claude searches the web. And it does so with two different mechanisms, based on the prompt:</p><ul><li><p>The first one actually searches for AI industry consolidating trends. That is basically exactly what it has been prompted to do.</p></li><li><p>The second one searches for AI startup acquisitions in June&#8230;sure, startup acquisitions can describe trends. But how can June be taken as a representation of the whole 2026, until now? This is basically an assumption that the model made itself under the hood.</p></li></ul><p>Now, let&#8217;s try to slightly change the prompt like so:</p><pre><code><code>Find recent analyst reports and news articles about consolidation trends in the AI industry.</code></code></pre><p>Here&#8217;s what happens:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r0bC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r0bC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png 424w, https://substackcdn.com/image/fetch/$s_!r0bC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png 848w, https://substackcdn.com/image/fetch/$s_!r0bC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png 1272w, https://substackcdn.com/image/fetch/$s_!r0bC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r0bC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png" width="801" height="655" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:655,&quot;width&quot;:801,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:107914,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!r0bC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png 424w, https://substackcdn.com/image/fetch/$s_!r0bC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png 848w, https://substackcdn.com/image/fetch/$s_!r0bC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png 1272w, https://substackcdn.com/image/fetch/$s_!r0bC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F04584ddf-937d-4cbe-970b-957fafd88e0b_801x655.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now, the results about &#8220;AI industry consolidation trends&#8221; are the same, but the search and the results in the second box are completely different. And the prompt only changed from &#8220;tell me&#8221; to &#8220;find&#8221;&#8230;</p><p>So, as you can see, the model makes its own assumptions. And this influences the response, of course.</p><h5><strong>ChatGPT</strong></h5><p>ChatGPT will use different web sources, given the same prompts as the two above. Below is the result for the first prompt:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!q3-z!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!q3-z!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png 424w, https://substackcdn.com/image/fetch/$s_!q3-z!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png 848w, https://substackcdn.com/image/fetch/$s_!q3-z!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png 1272w, https://substackcdn.com/image/fetch/$s_!q3-z!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!q3-z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png" width="1456" height="634" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159573,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!q3-z!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png 424w, https://substackcdn.com/image/fetch/$s_!q3-z!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png 848w, https://substackcdn.com/image/fetch/$s_!q3-z!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png 1272w, https://substackcdn.com/image/fetch/$s_!q3-z!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8a8ddf5d-f7c5-4402-944a-ac2cf5fd4ba1_1592x693.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>And then for the second prompt:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VLVo!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VLVo!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png 424w, https://substackcdn.com/image/fetch/$s_!VLVo!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png 848w, https://substackcdn.com/image/fetch/$s_!VLVo!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png 1272w, https://substackcdn.com/image/fetch/$s_!VLVo!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VLVo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png" width="1456" height="634" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:634,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159573,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VLVo!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png 424w, https://substackcdn.com/image/fetch/$s_!VLVo!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png 848w, https://substackcdn.com/image/fetch/$s_!VLVo!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png 1272w, https://substackcdn.com/image/fetch/$s_!VLVo!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15b372c-bad3-4da2-80d7-aece8703bdc2_1592x693.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>This means that, if you want to make a benchmark between ChatGPT&#8217;s and Claude&#8217;s responses, you will have to account for the fact that they use different sources. This is exactly the point stated previously: using the research engine is a black box that users can not manage.</p><p>Also, as the image shows, the results are not based on two different web searches. Actually, the model does not show if it uses one or more searches.</p><h5><strong>Perplexity</strong></h5><p>Perplexity&#8217;s approach is a mix between the ones from Claude and ChatGPT:</p><ul><li><p>It uses different sources to ground the responses.</p></li><li><p>It uses different searches on the web. You can count 5 (the ones with the magnifying glass icons).</p></li></ul><p>Below is what happens under the hood with the first prompt:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bwRT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bwRT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png 424w, https://substackcdn.com/image/fetch/$s_!bwRT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png 848w, https://substackcdn.com/image/fetch/$s_!bwRT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png 1272w, https://substackcdn.com/image/fetch/$s_!bwRT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bwRT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png" width="602" height="603" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:603,&quot;width&quot;:602,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106974,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!bwRT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png 424w, https://substackcdn.com/image/fetch/$s_!bwRT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png 848w, https://substackcdn.com/image/fetch/$s_!bwRT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png 1272w, https://substackcdn.com/image/fetch/$s_!bwRT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc79a20c5-e4f0-4144-aaef-687cf9b6ae18_602x603.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The following image is about the second prompt:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!MUaS!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!MUaS!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png 424w, https://substackcdn.com/image/fetch/$s_!MUaS!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png 848w, https://substackcdn.com/image/fetch/$s_!MUaS!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png 1272w, https://substackcdn.com/image/fetch/$s_!MUaS!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!MUaS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png" width="560" height="685" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2646890c-e865-4cc1-985e-2953438cd6af_560x685.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:685,&quot;width&quot;:560,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:127120,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!MUaS!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png 424w, https://substackcdn.com/image/fetch/$s_!MUaS!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png 848w, https://substackcdn.com/image/fetch/$s_!MUaS!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png 1272w, https://substackcdn.com/image/fetch/$s_!MUaS!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2646890c-e865-4cc1-985e-2953438cd6af_560x685.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h3>Testing Examples Type #2: Forcing Search Tools to Read URLs</h3><p>Imagine a scenario where you insert a prompt, the search tool returns the list of URLs, and you want it to read them, but the model can not access it. This may happen for several reasons:</p><ul><li><p>The content is behind a paywall.</p></li><li><p>The web search tool was not able to go beyond the anti-bot wall.</p></li><li><p>There was an error during the request.</p></li></ul><p>These cases can happen more than you think. For the sake of this tutorial, let&#8217;s get a <a href="https://www.wsj.com/tech/the-inside-story-of-ibms-shocking-profit-warning-839ef4f2">target page beyond a paywall</a> so that the result is surely inaccessible:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!VDs-!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!VDs-!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png 424w, https://substackcdn.com/image/fetch/$s_!VDs-!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png 848w, https://substackcdn.com/image/fetch/$s_!VDs-!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png 1272w, https://substackcdn.com/image/fetch/$s_!VDs-!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!VDs-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png" width="373" height="777" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:777,&quot;width&quot;:373,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:197889,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!VDs-!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png 424w, https://substackcdn.com/image/fetch/$s_!VDs-!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png 848w, https://substackcdn.com/image/fetch/$s_!VDs-!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png 1272w, https://substackcdn.com/image/fetch/$s_!VDs-!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F870cdc7f-1a9b-4da1-b66f-3f6e8058dca0_373x777.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p></p><h5><strong>Claude</strong></h5><p>Let&#8217;s see what happens with Claude:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!CCNH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!CCNH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png 424w, https://substackcdn.com/image/fetch/$s_!CCNH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png 848w, https://substackcdn.com/image/fetch/$s_!CCNH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png 1272w, https://substackcdn.com/image/fetch/$s_!CCNH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!CCNH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png" width="911" height="280" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:280,&quot;width&quot;:911,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58619,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!CCNH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png 424w, https://substackcdn.com/image/fetch/$s_!CCNH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png 848w, https://substackcdn.com/image/fetch/$s_!CCNH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png 1272w, https://substackcdn.com/image/fetch/$s_!CCNH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbbd3a31c-8ff6-4e7f-b5f3-b90268fcbadf_911x280.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>As expected, the web search tool can not access content behind a paywall. However, as you can see, it did get a response because it says: &#8221;Based on other coverage of the same story, here&#8217;s what it&#8217;s about&#8221;.</p><p>Now the response it gave is not interesting, so I&#8217;m not showing it for brevity. What is interesting is trying to understand what it has done under the hood. Basically, it was able to understand from the URL that the article is about IBM and a profit warning. So it autonomously made a web search. Let&#8217;s unpack it:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!t2H_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!t2H_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png 424w, https://substackcdn.com/image/fetch/$s_!t2H_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png 848w, https://substackcdn.com/image/fetch/$s_!t2H_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png 1272w, https://substackcdn.com/image/fetch/$s_!t2H_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!t2H_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png" width="797" height="600" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:600,&quot;width&quot;:797,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:111479,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!t2H_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png 424w, https://substackcdn.com/image/fetch/$s_!t2H_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png 848w, https://substackcdn.com/image/fetch/$s_!t2H_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png 1272w, https://substackcdn.com/image/fetch/$s_!t2H_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0eba1b4-1895-47fd-9494-abd6bdedbb02_797x600.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The image shows exactly the kind of non-deterministic approach described previously. As you can see, the system:</p><ul><li><p>Tried to open the proposed URL, but failed at it.</p></li><li><p>Autonomously tried a different approach, searching on the web, based on the metadata extracted from the URL.</p></li><li><p>It gave the response based on the content it was able to &#8220;read&#8221; from the sources it got from the web search.</p></li></ul><p>So here is an interesting thing that happened: the system told you that it was not able to access the specific URL and that it used &#8220;other coverage of the same story&#8221;, but it did not tell you how. So, how do you think you can get deterministic results?</p><h5><strong>ChatGPT and Perplexity</strong></h5><p>What is worth considering is that ChatGPT and Perplexity use similar but different approaches between them, and with respect to Claude. Below is the result for ChatGPT:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XMSU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XMSU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png 424w, https://substackcdn.com/image/fetch/$s_!XMSU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png 848w, https://substackcdn.com/image/fetch/$s_!XMSU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png 1272w, https://substackcdn.com/image/fetch/$s_!XMSU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XMSU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png" width="1456" height="693" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:693,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:211826,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XMSU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png 424w, https://substackcdn.com/image/fetch/$s_!XMSU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png 848w, https://substackcdn.com/image/fetch/$s_!XMSU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png 1272w, https://substackcdn.com/image/fetch/$s_!XMSU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F219fd048-c275-44a4-bc3c-90b6e8962656_1588x756.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>As you can see, ChatGPT does not tell you that it cannot access the target URL, unlike Claude. Also, its search mode is different from Claude&#8217;s, because it searches (also) for other content from the WSJ that can refer to the target one.</p><p>Below is Perplexity&#8217;s result:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7E2A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7E2A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png 424w, https://substackcdn.com/image/fetch/$s_!7E2A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png 848w, https://substackcdn.com/image/fetch/$s_!7E2A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png 1272w, https://substackcdn.com/image/fetch/$s_!7E2A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7E2A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png" width="495" height="765" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8c778236-f2bb-4f27-9063-74564edb725b_495x765.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:765,&quot;width&quot;:495,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:122880,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7E2A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png 424w, https://substackcdn.com/image/fetch/$s_!7E2A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png 848w, https://substackcdn.com/image/fetch/$s_!7E2A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png 1272w, https://substackcdn.com/image/fetch/$s_!7E2A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8c778236-f2bb-4f27-9063-74564edb725b_495x765.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p></p><p>As you can see, Perplexity produces a result that is similar to ChatGPT&#8217;s:</p><ul><li><p>It doesn&#8217;t tell you it can access the target URL.</p></li><li><p>It searches for content (also) on other articles on the WSJ.</p></li></ul><p>Overall, this demonstrates that the result you get is non-deterministic and depends on the model you use.</p><h2>Architectural Guidance: When to Use Each Primitive</h2><p>At this point you may be asking: &#8221;So, when should I use web search tools?&#8221;. Or:&#8221; Should I use web search tools at all?&#8221;.</p><p>Good questions! The first answer is: &#8220;Yes, you should use them&#8221;. But let&#8217;s subdivide the case for the explanations on &#8220;when&#8221;.</p><h3>Using Web Search Tools via Chat</h3><p>I would argue that the use of web search tools via chat is &#8220;the canonical&#8221; one. This is basically because when you prompt a model, and it kind of understands that it should use the web search tool, it will. This is included in the &#8220;non-deterministic&#8221; things already presented.</p><p>However, you&#8217;ve also seen that there are cases when the web search fails. Regarding the reasons why this happens, a solution to improve web search via chat is using MCPs from scraping providers. Here at The Web Scraping Club, we already made the case with &#8220;<a href="https://substack.thewebscraping.club/p/claude-decodo-mcp-how-to">How to Give Claude Real-Time Web Access With the Decodo MCP</a>&#8221;.</p><h3>Using Web Search Tools via APIs</h3><p>Considering using web search tools via APIs, the correct engineering posture is to treat web search tools and web scrapers not as alternatives but as complementary primitives operating at different layers of a retrieval architecture:</p><ul><li><p><strong>Web search tools are appropriate at the discovery layer</strong>: When the model needs to identify which URLs are relevant to a user&#8217;s query, a search tool is an efficient mechanism for surfacing candidates from the indexed web.</p></li><li><p><strong>Web scrapers are appropriate at the retrieval layer</strong>: Once a target URL is known, either because a search surfaced it, because it is statically configured, or because a crawl traversal discovered it, a scraper is the correct instrument for extracting full, structured, high-fidelity content from that resource.</p></li></ul><p>Below is a schema that represents this complementarity:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!n7s2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!n7s2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png 424w, https://substackcdn.com/image/fetch/$s_!n7s2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png 848w, https://substackcdn.com/image/fetch/$s_!n7s2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png 1272w, https://substackcdn.com/image/fetch/$s_!n7s2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!n7s2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png" width="768" height="1376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1376,&quot;width&quot;:768,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:546680,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/209633580?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!n7s2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png 424w, https://substackcdn.com/image/fetch/$s_!n7s2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png 848w, https://substackcdn.com/image/fetch/$s_!n7s2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png 1272w, https://substackcdn.com/image/fetch/$s_!n7s2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F61a20eb8-7d7f-4e57-82e1-e7caf46115fc_768x1376.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>For example, a production-grade retrieval pipeline for a domain-specific RAG system that needs to retrieve fresh and up-to-date data every once in a while will typically combine both:</p><ul><li><p>A search tool for open-domain candidate discovery.</p></li><li><p>A scraper for full-document extraction from the identified URLs, a Markdown conversion step for context-optimal serialization, a chunking and embedding step for vector indexing, and a nearest-neighbor retrieval step for query-time grounding.</p></li></ul><p>In such cases, the web search tool and the web scraper are each necessary components of this pipeline. Neither is sufficient alone, and treating either as a drop-in substitute for the other is a mistake.</p><p>As a final consideration, note that it makes sense to use web search tools on the discovery layer because of how they work under the hood. As covered above, the web search tool is basically a trigger for APIs that retrieve content ranked from search engines. This is basically what every major scraping provider has to offer in terms of SERP/search APIs. In other words, if you are already a customer of one of the most common scraping providers, instead of using the web search tool that your favourite LLM has, you can directly use your scraping provider&#8217;s SERP/search API.</p><h2>Conclusion</h2><p>In this article, you learned how tools work in LLMs. You&#8217;ve also seen the limitations of web search tools and their best use cases, using them via chat or via API.</p><p>Overall, for a deterministic and scientific approach, web scraping remains the best data retrieval layer.</p><p>So, let us know in the comments: are you using web search tools or web scraping for ingesting LLMs with recent data?</p><div><hr></div><p><em>Did you like this article? Share it with someone who might find it useful and get a discount on paid plans.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/llm-scraping-web-search-tool?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/llm-scraping-web-search-tool?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[The LAB #115: Manus at Work - Datadome on Leboncoin.fr]]></title><description><![CDATA[What DataDome's tag really sends and collects, read line by line on leboncoin.fr.]]></description><link>https://www.scraping.club/p/datadome-on-leboncoin-scraping</link><guid isPermaLink="false">https://www.scraping.club/p/datadome-on-leboncoin-scraping</guid><dc:creator><![CDATA[Pierluigi Vinciguerra]]></dc:creator><pubDate>Thu, 10 Sep 2026 15:10:22 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/969efbe7-1501-4137-9796-1e8d57f38ed5_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Let&#8217;s continue the series of articles where we use Manus to better understand the surface of anti-bot solutions. <span>The last two times, it was for&nbsp;</span><a href="https://www.scraping.club/p/the-lab-108-how-llms-and-manus-ai"><span>THE LAB #108</span></a><span>&nbsp;for Akamai on Net-a-Porter, and in&nbsp;</span><a href="https://www.scraping.club/p/deobfuscating-kasada-with-manus-ai"><span>THE LAB #114</span></a><span>&nbsp;it was Kasada on nike.com.</span> </p><p>Everyone who scrapes a site protected by DataDome knows the basic theory. The tag reads the browser fingerprint, then  it watches how you use the page, and sends the result to a server that gives you a score. You can read about that online almost everywhere, even on this Substack. This time I wanted to go a bit deeper and read what the tag really does. I used Manus for the first analysis of the code, and then I checked every claim using Claude.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p></blockquote><p>In <a href="https://www.scraping.club/p/deobfuscating-kasada-with-manus-ai">THE LAB #114</a> I opened Kasada on nike.com and spent most of the article on its interpreter. Two custom virtual machines, 279 opcodes in total, and a decoder based on the clock, so the file stops working after fifteen hours.</p><p>DataDome is the other name you meet all the time, so I expected something similar. It&#8217;s different. The sensor is 124 KB of minified JavaScript, the method names are still readable, and the string table is plain base64. This difference is the most interesting thing I found, so at the end I put the two products side by side.</p><p>The target is leboncoin.fr, the French classifieds site. It runs DataDome JavaScript Tag 5.9.4.</p><h2>How DataDome is installed on leboncoin</h2><p>There are five different pieces, and when you say &#8220;DataDome blocked me&#8221; you should know which one you mean.</p><p>A remote component in front of the application answers a navigation with the real page or with a 403 that contains the challenge bootstrap. <code>dd.leboncoin.fr/tags.js</code> is the sensor. It&#8217;s hosted on S3 behind CloudFront, on a hostname that looks like part of leboncoin (the response headers say <code>server: AmazonS3</code> and <code>via: cloudfront.net</code>). <code>dd.leboncoin.fr/js/</code> receives the data the sensor collects. <code>ct.captcha-delivery.com</code> serves the two bootstraps, <code>i.js</code> for the device check and <code>c.js</code> for the CAPTCHA. <code>geo.captcha-delivery.com</code> serves the page the user sees.</p><p>The sensor is the piece I want to study, because it&#8217;s the only one where I can read the code. The server-side scoring is out of scope, for the simple reason that nobody outside DataDome can see it.</p><p>We wrote about DataDome many times, in <a href="https://www.scraping.club/p/scraping-datadome-api-hermes">THE LAB #2</a>, in the cookie work of <a href="https://www.scraping.club/p/the-lab-94-using-cookies-and-session">THE LAB #94</a> and in the agentic test of <a href="https://substack.thewebscraping.club/p/the-lab-103-bypassing-datadome-protected">THE LAB #103</a>. In <a href="https://www.scraping.club/p/is-camoufox-still-effective-scraping">THE LAB #106</a> we also saw which properties DataDome reads, from inside the browser engine, with camoufox-reverse. All those articles asked if we could pass, or what the browser layer shows, but this time the focus is on opening the tag file and seeing what&#8217;s inside.</p><div><hr></div><blockquote><p><em>When CAPTCHAs interrupt a workflow, reliable infrastructure matters. <a href="https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_7&amp;utm_content=banner_leboncoin_datadome">anyIP provides residential and mobile proxies with consistent sessions for smoother web-data collection</a>.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_7&amp;utm_content=banner_leboncoin_datadome" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ymWp!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png 424w, https://substackcdn.com/image/fetch/$s_!ymWp!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png 848w, https://substackcdn.com/image/fetch/$s_!ymWp!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png 1272w, https://substackcdn.com/image/fetch/$s_!ymWp!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ymWp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:913094,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_7&amp;utm_content=banner_leboncoin_datadome&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/214006843?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ymWp!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png 424w, https://substackcdn.com/image/fetch/$s_!ymWp!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png 848w, https://substackcdn.com/image/fetch/$s_!ymWp!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png 1272w, https://substackcdn.com/image/fetch/$s_!ymWp!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1ed5fbde-4633-4035-9558-9cd2f2d241e2_4585x2292.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_7&amp;utm_content=banner_leboncoin_datadome&quot;,&quot;text&quot;:&quot;Start Scraping with AnyIP&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://anyip.io/?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_7&amp;utm_content=banner_leboncoin_datadome"><span>Start Scraping with AnyIP</span></a></p></blockquote><div><hr></div><h2>Method</h2><p>I used two tools, Camoufox and Manus, and the article is the result of the two approaches. On one side, the runs and the report of Manus. On the other side, the check of every claim of that report, done by Claude on the bytes and on the wire.</p><p>I launched the first pass with Manus on Le Bon Coin, similarly to what I used for Kasada in #114. The challenge path and the fingerprint inventory in this article are its results, on several runs. I take these runs as they are. Manus worked with a stateful Chromium session, some direct curl requests and static analysis of the files served by the site. No external sources, no stealth tools.</p><p>Its outcome matrix has eleven samples. The home page loaded with a 200 and the tag loaded with it. A HEAD and a fetch GET to the same page, sent from that same session, both got a 403. Four curl requests to the home page and to the ad page, with and without a Chrome User-Agent, all got a 403 with a challenge bootstrap of 771 to 774 bytes. The User-Agent only changed the bootstrap type, <code>rt=c</code> or <code>rt=i</code>. The navigation to the ad page got a 403 and a device check. After the human check, the frame became a CAPTCHA, then &#8220;Access is temporarily restricted&#8221;, and the block followed the session back to the home page. The ad page never arrived.</p><p>Then Manus reviewed its own report, with three blind audits on separate parts of the evidence and one adversarial pass that tried to prove each claim false. When the evidence was not enough for a claim, it lowered the claim. The first one was if the CAPTCHA was ever accepted by the server. This is the material I started from. Camoufox was admitted where the Chromium of Manus was not, so the numbers from the wire below, the POST body, and the live <code>x-dd-b</code> header, come from my captures.</p><p>My collection was read-only. I didn&#8217;t replace native APIs, I didn&#8217;t modify requests, I didn&#8217;t replay tokens and I didn&#8217;t decrypt payloads. Three captures with the same profile and the same target, with cache busting between them, from a residential connection in Italy. The tag didn&#8217;t change between the Manus run and mine, so both of us read the same 123,989 bytes, SHA-256 <code>16a5a027...3151</code>.</p><p>Every claim has an evidence level, and there are only three:</p><ul><li><p>TABLE means the string is in the decoded string table and nothing more</p></li><li><p>SOURCE means the identifier is in a place where the code can execute it</p></li><li><p>WIRE means I saw it in a request or a response I captured</p></li></ul><p>A string in the table has not been read by anything. A property that is read has not necessarily been sent. Keeping these three levels separate is most of the work in this kind of analysis, and I lost track of it more than once while reading the string table.</p><p>The claim table that puts all of this together is <code>results/verification.md</code>, available in the same directory of <a href="https://github.com/TheWebScrapingClub/thelab">The Lab repository</a>, available for paying users.</p><div><hr></div><blockquote><p><strong>S<a href="https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE">tart your scraping journey with Byteful</a></strong>: 10GB New Customer Trial | Use TWSC for 15% OFF | $1.75/GB Residential Data | ISP Proxies in 15+ Countries</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://byteful.com/?promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EOo9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 424w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 848w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1272w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png" width="630" height="69.35779816513761" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:120,&quot;width&quot;:1090,&quot;resizeWidth&quot;:630,&quot;bytes&quot;:133037,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://byteful.com/?promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/194398731?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!EOo9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 424w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 848w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1272w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE&quot;,&quot;text&quot;:&quot;Claim your 10GB here&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE"><span>Claim your 10GB here</span></a></p></blockquote><div><hr></div><h2>What the tag sends</h2><p>The sensor sends one POST to <code>dd.leboncoin.fr/js/</code>, from the main frame, with no query string. I have two of these bodies, 5,069 and 4,996 bytes of form-urlencoded data, and both have the same nine fields in the same order. This is the second one, as recorded by <code>capture_hardblock_scope.py</code>. The opaque values are replaced by their length and a hash prefix:</p><pre><code><code>POST https://dd.leboncoin.fr/js/   frame: https://www.leboncoin.fr/   body: 4996 bytes
jspl           len 4698   sha256[:12] df708add1476
eventCounters  []
jsType         ch
cid            len 128    sha256[:12] db1e75da8bbc
ddk            len 30     sha256[:12] d1cd9afe92aa
Referer        https%3A%2F%2Fwww.leboncoin.fr%2F
request        %2F
responsePage   origin
ddv            5.9.4</code></code></pre><p>Four of these fields are worth a look. <code>ddv</code> is <code>5.9.4</code>, so the version is in the payload and not only in the file banner. <code>jsType</code> was <code>ch</code>, the challenge collection, while the initial one has a different value. <code>responsePage</code> was <code>origin</code>. <code>eventCounters</code> was <code>[]</code>, empty, because a headless run with no real interaction has no behaviour data to send. That empty array is what my client looked like from the other side.</p><p><code>jspl</code> is the real signal payload, 4,771 characters in one capture and 4,698 in the other, and it stays opaque. <code>cid</code> was 128 characters, the same length of the <code>datadome</code> cookie. The cookie is readable from JavaScript, with <code>Secure</code> and <code>SameSite=Lax</code>, on the domain <code>.leboncoin.fr</code>. <code>ddk</code> is 30 hex characters and it was identical in all captures, so it&#8217;s the client key of the site and it has nothing to do with the session.</p><p>There is also a diagnostic sample. When <code>Math.random() &lt;= .05</code> (line 2937 of the beautified tag), the tag serializes <code>window.ddoptions</code> in a field called <code>opts</code> and <code>window.ddCaptchaOptions</code> in <code>xhr_opts</code>. One request in twenty sends the DataDome configuration of the site back to DataDome.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h2>What the fingerprint is made of</h2><p><code>jspl</code> is opaque on the wire, but the code that builds it is only partly obfuscated, and this is where the Manus report is most useful. The report divides the collection in two classes, the environment fingerprint and the behaviour telemetry. For the fingerprint, it groups the probes in families. I keep the same grouping here, and I checked every name below in the decoded string table and in the beautified source with Claude. If I don&#8217;t say otherwise, these are TABLE level: the tag has the probe, but from the bytes I can&#8217;t show which branch runs it in a given session.</p>
      <p>
          <a href="https://www.scraping.club/p/datadome-on-leboncoin-scraping">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Crawl of Fame - September 2026]]></title><description><![CDATA[Never a boring month in the web scraping industry]]></description><link>https://www.scraping.club/p/crawl-of-fame-september-2026</link><guid isPermaLink="false">https://www.scraping.club/p/crawl-of-fame-september-2026</guid><dc:creator><![CDATA[Pierluigi Vinciguerra]]></dc:creator><pubDate>Tue, 08 Sep 2026 16:03:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/fac486dd-59b0-4056-bd85-22e842e77d6b_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>September starts, and so does the web scraping event season. </p><div><hr></div><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p></blockquote><div><hr></div><h2>Oxycon 2026</h2><p>The Oxycon 2026 starts in 8 days, and there&#8217;s a lot of beef on the plate. As in the past editions, <a href="https://oxylabs.io/oxycon">it&#8217;s free and it&#8217;s online</a>, and the recordings will be available only to registered attendees. <a href="https://oxylabs.io/oxycon/pierluigi-vinciguerra?utm_source=linkedin&amp;utm_medium=organic&amp;utm_campaign=oxycon2026&amp;utm_content=speaker_pierluigi&amp;groupid=17848128045062">If you don&#8217;t want to miss some great talks, you&#8217;d better register soon here</a>. </p><p>This year I&#8217;m on a panel instead of giving a talk. It&#8217;s titled &#8220;The Adaptive Web: Turning Industry Challenges into Competitive Advantage&#8221;, and I&#8217;ll share the stage with Andreea Stroe from Adobe, Hocine Amrane from NielsenIQ, and Andrey Gourine from Limy AI. Forty minutes with people who look at web data from very different seats than mine, so I expect to learn more than I speak.</p><p>The <a href="https://oxylabs.io/oxycon#agenda">full agenda</a> has 10 sessions and 18 speakers. A few I&#8217;m curious about:</p><ul><li><p>Etienne Ellie from ScrapingBee on &#8220;Web Hydration: Loading Dynamic Content Without a Browser&#8221;. Getting data without rendering the page is <a href="https://www.scraping.club/p/intercepting-a-website-api">a topic I keep coming back to</a> in The Lab.</p></li><li><p>&#8220;We Made Our Web Search Worse on Purpose&#8221; by Emilis Strimaitis from Hostinger, if only for the title.</p></li><li><p>The panel &#8220;Is the Web Closing? What It Could Mean for Businesses, Journalists, and Researchers&#8221; with Carl Miller, Paul Bradshaw and Krishna Sood. The pay-per-crawl discussion I return to below is the same question seen from the other side of the fence.</p></li><li><p>Tadas Gedgaudas from topYappers closing with &#8220;Best Open-Source Scraping Repositories of 2026&#8221;, which is only for live viewers.</p></li></ul><p>As I did with <a href="https://www.scraping.club/p/oxycon-2025-wrap-up">the 2025 edition</a>, I&#8217;ll publish a wrap-up right after the event.</p><h2>FuelTurin</h2><p>The second date is an event I&#8217;m organizing together with <a href="https://www.datafuel.dev/">DataFuel</a>, an Italian company that launched its brand and scraping API this year. On Wednesday, October 7, during the Wave by Vento week in Turin, we&#8217;re hosting a networking aperitivo for people who work with web data and AI.</p><p>Wave by Vento is the new name of Italian Tech Week. It runs from October 7 to 9, with great speakers (Jony Ive, Luca Ferrari, CEO of Bending Spoons, Nik Storonsky, CEO of Revolut, and others) on the main stage, and it brings many people from our industry to Turin on those days. A rooftop aperitivo felt like the simplest way to get around 40 of them in the same room: founders, web data experts, AI and agent builders.</p><p>The format is simple. You bring what you work on; we cover drinks and food. No pitches, no slides, no demos, no badge scanning. Registration is by approval, so tell us what you do when you sign up.</p><p><a href="https://luma.com/xjzqyec9">Register on Luma</a>. Otium Rooftop, Turin, 19:00.</p><h2>What the SERP API vendors did about Google&#8217;s goto links</h2><p>On August 30 I published <a href="https://www.scraping.club/p/google-removed-the-urls-serp">what I found about Google&#8217;s goto links</a>, the change that replaced every destination URL in the search results with a <code>google.com/goto?url=</code> token. Two findings are worth repeating here, because they explain the answers that came from the vendors.</p><p>The comments under that article added a detail I couldn&#8217;t reproduce on my side. BigBry gets the go-to links in a human-controlled incognito window, with no CDP involved, and in Firefox when logged out. Michael Vederman drove Chrome and Edge with three different stacks and wrote that &#8220;it all boiled down to using a signed-in profile or not&#8221;, although after a few more hits Firefox gave him the wrappers logged in or not. In my runs, a private window never showed a wrapper, so the observations don&#8217;t line up perfectly. My reading is that the signed-in state weighs more than my two windows suggested, and that the classifier looks at more than one signal. If you run your own test, check the account state before you check the flags.</p><p>Resolving the tokens is cheap. A plain GET with no cookies, no proxy and no TLS impersonation returns a 302 with the destination in the Location header. I ran 1,200 resolutions from one home IP at concurrency 20 and got 110 requests per second sustained, with zero 429s. Tokens captured one day still resolve the next morning. Two traps remain: HEAD answers 200 without a Location header, so it looks like a success and gives you nothing, and the same result gets a new token on every impression, so there is no lookup table to build.</p><p><a href="https://dataforseo.com/update/googles-goto-rollout-we-already-resolve-99-99-of-urls">DataForSEO published on August 27</a> that it resolves the organic goto URLs for 99.99% of returned SERPs, with the remaining cases concentrated in AI Overviews and local packs. <a href="https://serpapi.com/blog/googles-new-goto-redirect-urls-resolution-in-progress/">SerpApi announced on September 5</a> that direct URLs are back in its responses, and told <a href="https://ppc.land/serpapi-restores-direct-urls-after-google-goto-redirect-rollout/">PPC Land</a> that the change &#8220;required updates to how Google result links were decoded and normalized&#8221;, without saying whether that means following the redirects or how much it costs them. In the same article, Johannes Beus from SISTRIX described the goto links as &#8220;a change requiring an added-cost workaround&#8221;.</p><p>So everyone who sells Google&#8217;s index reacted quickly to this update, and the impact on the SERP scraping ecosystem was minimal. </p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p>For this month, that&#8217;s it; see you in October with the next edition of the Crawl of Fame.</p>]]></content:encoded></item><item><title><![CDATA[The Impact of Chrome's New CPU Performance API on Web Scraping Detection]]></title><description><![CDATA[Anti-bot solutions just got a new tool in their hardware fingerprinting toolbox]]></description><link>https://www.scraping.club/p/the-impact-of-chromes-new-cpu-performance-api</link><guid isPermaLink="false">https://www.scraping.club/p/the-impact-of-chromes-new-cpu-performance-api</guid><dc:creator><![CDATA[Antonello Zanini]]></dc:creator><pubDate>Sun, 06 Sep 2026 20:18:52 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/d73050fa-4448-4f03-a594-5796433baa9b_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Google Chrome 152 ships with the CPU Performance API, a new Web API that allows websites to estimate a device&#8217;s CPU computational capacity through a performance tier value.</p><p>While its primary goal is to help web applications adapt their behavior based on the user&#8217;s hardware, the API can also serve as a new hardware signal for hardware fingerprinting.</p><p>So, is Chrome&#8217;s new CPU Performance API a real challenge for bot detection, or is it just another <a href="https://substack.thewebscraping.club/p/the-latest-papers-about-browser-fingerpinting">trend in the browser fingerprinting puzzle</a>? In this post, I&#8217;ll cover everything you need to know about the API, how it works, and what it means for anti-scraping systems.</p><h2>An Overview of Chrome&#8217;s CPU Performance API</h2><p>Before diving into the implications of Chrome&#8217;s new CPU Performance API for automated bot detection, let me first present it to you.</p><h3>What Is Chrome&#8217;s CPU Performance API?</h3><p>Introduced in <a href="https://developer.chrome.com/blog/chrome-152-beta">Chrome 152</a>, the CPU Performance API is a new Web API that lets websites estimate how powerful a user&#8217;s CPU is without disclosing detailed hardware information.</p><p>The API assigns the device running Chrome to a performance tier. Websites can access that tier (represented as a small integer) through the <em>navigator.cpuPerformance</em> JavaScript property. For more information, refer to the <a href="https://github.com/WICG/cpu-performance">CPU Performance API Explainer</a>.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p><div><hr></div></blockquote><h3>How It Works</h3><p>Instead of revealing the processor model, clock speed, number of cores, or other <a href="https://substack.thewebscraping.club/p/understanding-browser-fingerprint">fingerprinting-sensitive details</a>, <em>navigator.cpuPerformance </em>returns a small integer representing the device&#8217;s CPU performance tier. As of now, the specification defines four possible tiers:</p><ul><li><p><em><strong>1</strong></em>: Low-performance devices.</p></li><li><p><em><strong>2</strong></em>: Entry-level to mid-range devices.</p></li><li><p><em><strong>3</strong></em>: High-performance devices.</p></li><li><p><em><strong>4</strong></em>: Top-tier devices.</p></li></ul><p>The higher the number, the more computationally capable the device is.</p><p><strong>Note</strong>: There&#8217;s also a special <em>0</em> tier, which indicates that Chrome couldn&#8217;t determine the device&#8217;s performance tier.</p><p>To test the CPU Performance API in your browser, run the following snippet in the Chrome DevTools Console:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">if ("cpuPerformance" in navigator) {
  console.log(navigator.cpuPerformance); // 0, 1, 2, 3, or 4
}</code></pre></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!szaz!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!szaz!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png 424w, https://substackcdn.com/image/fetch/$s_!szaz!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png 848w, https://substackcdn.com/image/fetch/$s_!szaz!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png 1272w, https://substackcdn.com/image/fetch/$s_!szaz!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!szaz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png" width="1436" height="357" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:357,&quot;width&quot;:1436,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Inspecting navigator.cpuPerformance in the Chrome DevTools Console&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Inspecting navigator.cpuPerformance in the Chrome DevTools Console" title="Inspecting navigator.cpuPerformance in the Chrome DevTools Console" srcset="https://substackcdn.com/image/fetch/$s_!szaz!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png 424w, https://substackcdn.com/image/fetch/$s_!szaz!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png 848w, https://substackcdn.com/image/fetch/$s_!szaz!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png 1272w, https://substackcdn.com/image/fetch/$s_!szaz!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27d0cf05-bee0-4a9e-8d13-fcea73dfbfdc_1436x357.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Inspecting navigator.cpuPerformance in the Chrome DevTools Console</figcaption></figure></div><p>The API is also designed to be future-proof. Rather than reclassifying existing devices, newer and more powerful hardware would be assigned new tiers (such as <em>5</em> or <em>6</em>), ensuring that today&#8217;s devices continue to receive the same classification over time.</p><p>One important aspect is that the reported tier is static. In other words, it represents the device&#8217;s hardware class rather than its current CPU utilization. A powerful machine remains a tier-4 device even if it&#8217;s temporarily under heavy load or running on low battery.</p><h3>Why Was It Introduced in the First Place?</h3><p>The main goal behind Chrome&#8217;s CPU Performance API is to give web devs a quick, static, and reliable way to understand a device&#8217;s capabilities.</p><p>Before this API, websites that needed to adapt their experience based on hardware performance often had to run custom JavaScript or <a href="https://wasmruntime.com/en/benchmarks">WebAssembly benchmarks</a>. These approaches consume CPU cycles and can produce inconsistent results depending on the device&#8217;s current workload.</p><p>With the CPU Performance API, Chrome handles the classification internally and exposes a consolidated performance tier through <em>navigator.cpuPerformance</em>.</p><p>This becomes particularly useful as modern web apps increasingly run tasks that require a lot of computing power. Knowing a device&#8217;s performance tier allows web applications to make smarter decisions before launching expensive workloads.</p><p>For example, imagine a browser-based photo editor that uses AI-powered image enhancement. On a high-performance device, it could run the AI model locally for faster results and better privacy. On a lower-tier device, it could switch to a lighter model or delegate the processing to the server instead.</p><p>If an application also needs to react to changing system conditions, Chrome recommends combining the CPU Performance API with the <a href="https://developer.chrome.com/docs/web-platform/compute-pressure">Compute Pressure API</a>, which enables you to observe the pressure of system resources (e.g., monitoring CPU usage).</p><p>The CPU Performance API answers the question, <em>&#8220;How powerful is this device?&#8221;</em>, while the Compute Pressure API answers, <em>&#8220;How busy is the CPU right now?&#8221;</em> Together, they allow applications to make both long-term and real-time performance decisions.</p><div><hr></div><blockquote><p>Only pay for data you actually get &#8212; one request, one credit, every time. No surcharge for JS rendering, no charge when a call gets blocked. <em><strong>Claim your free 10,000 requests with coupon code</strong></em> <strong>WEBSCR</strong></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sxTx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sxTx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sxTx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png" width="1456" height="764" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:764,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:403485,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/210089674?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sxTx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 424w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 848w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 1272w, https://substackcdn.com/image/fetch/$s_!sxTx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F942adb29-f668-42e1-ad1b-a13438b78669_2400x1260.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k&quot;,&quot;text&quot;:&quot;Grab the deal!&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k"><span>Grab the deal!</span></a></p></blockquote><div><hr></div><h2>Is the CPU Performance API Something New for Hardware Fingerprinting?</h2><p>No, the CPU Performance API isn&#8217;t a revolution in browser and <a href="https://substack.thewebscraping.club/p/what-is-device-fingerprint">device fingerprinting</a>. It&#8217;s merely a convenient API that offers an aggregated performance tier value.</p><p>In particular, there are already other APIs available for retrieving hardware-related information. Some are web standards, while others are Chromium-specific features that web developers (and, yes, also anti-bot solutions) can use to understand a device&#8217;s characteristics.</p><p>Explore these APIs!</p><h3>WorkerNavigator</h3><p>The <em><a href="https://developer.mozilla.org/en-US/docs/Web/API/WorkerNavigator">WorkerNavigator</a> </em>interface exposes multiple properties that can reveal information about the user&#8217;s hardware.</p><p>One example is <em><a href="https://developer.mozilla.org/en-US/docs/Web/API/Navigator/hardwareConcurrency">navigator.hardwareConcurrency</a></em>, a read-only JavaScript property that returns the number of logical processors available to run threads on the user&#8217;s device.</p><p>Web devs commonly employ this property to optimize resource usage. For example, a web app could create a pool of <em>Worker</em>s based on the number of available logical processors:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const cores = navigator.hardwareConcurrency;
console.log(`Detected ${cores} logical processors`);</code></pre></div><p>A possible output could be:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!r8xj!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!r8xj!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png 424w, https://substackcdn.com/image/fetch/$s_!r8xj!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png 848w, https://substackcdn.com/image/fetch/$s_!r8xj!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png 1272w, https://substackcdn.com/image/fetch/$s_!r8xj!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!r8xj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png" width="1436" height="328" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:328,&quot;width&quot;:1436,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;navigator.hardwareConcurrency detected 22 logical processors&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="navigator.hardwareConcurrency detected 22 logical processors" title="navigator.hardwareConcurrency detected 22 logical processors" srcset="https://substackcdn.com/image/fetch/$s_!r8xj!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png 424w, https://substackcdn.com/image/fetch/$s_!r8xj!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png 848w, https://substackcdn.com/image/fetch/$s_!r8xj!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png 1272w, https://substackcdn.com/image/fetch/$s_!r8xj!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F198b2b7a-a548-4040-9f45-928a953e1220_1436x328.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">navigator.hardwareConcurrency detected 22 logical processors</figcaption></figure></div><p>Clearly, the same information can also be useful for hardware fingerprinting. While the number of logical processors alone isn&#8217;t enough to uniquely identify a device, it provides a signal about the hardware capabilities of the user&#8217;s machine</p><p><strong>Note</strong>: Browsers may intentionally report a lower value than the actual number of logical processors. This helps reduce fingerprinting risks and provides a more realistic estimate of how many threads a web application can run efficiently in parallel.</p><h3>Device Memory API</h3><p>The <em><a href="https://developer.mozilla.org/en-US/docs/Web/API/Device_Memory_API">Device Memory API</a></em> is available through the aforementioned <em>WorkerNavigator</em> interface. Its <em>navigator.deviceMemory</em> property returns an approximate amount of RAM available on the user&#8217;s device:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const memory = navigator.deviceMemory;
console.log(`Approximate device memory: ${memory}GB`);</code></pre></div><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Yi3q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Yi3q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png 424w, https://substackcdn.com/image/fetch/$s_!Yi3q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png 848w, https://substackcdn.com/image/fetch/$s_!Yi3q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png 1272w, https://substackcdn.com/image/fetch/$s_!Yi3q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Yi3q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png" width="1431" height="323" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:323,&quot;width&quot;:1431,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the number of GBs of RAM estimated by navigator.deviceMemory&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the number of GBs of RAM estimated by navigator.deviceMemory" title="Note the number of GBs of RAM estimated by navigator.deviceMemory" srcset="https://substackcdn.com/image/fetch/$s_!Yi3q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png 424w, https://substackcdn.com/image/fetch/$s_!Yi3q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png 848w, https://substackcdn.com/image/fetch/$s_!Yi3q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png 1272w, https://substackcdn.com/image/fetch/$s_!Yi3q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F44c12dc7-9b97-4d6e-ba08-b4e2cf7044c4_1431x323.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Note the number of GBs of RAM estimated by navigator.deviceMemory</figcaption></figure></div><p>The Device Memory API intentionally reduces precision to limit fingerprinting risks. Rather than returning the exact amount of RAM, it reports a coarsened value based on powers of two and clamps it within browser-defined limits.</p><p>However, these limits have changed over time. Since Chrome 147, desktop Chrome can report 2, 4, 8, 16, or 32 GiB, while Chrome on Android reports 1, 2, 4, or 8 GiB. Consequently, a desktop with 12 GiB of RAM might report 8 or 16 GiB, depending on the browser&#8217;s approximation, whereas Android devices remain capped at 8 GiB in Chrome 147.</p><p>The reported value should therefore be treated as an approximate capability signal, not an exact measurement of physical RAM. For example, a desktop with a high logical-core count might report 16 or 32 GiB, but a lower value is not, by itself, evidence of spoofing.</p><h3>WebGPU API</h3><p>The <em><a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGPU_API">WebGPU API</a></em> gives web applications direct access to the user&#8217;s GPU for high-performance graphics and general-purpose computations.</p><p>It&#8217;s been developed as the successor to <a href="https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API">WebGL</a>. The WebGPU API enables more advanced use cases, such as complex 3D rendering, GPU-accelerated simulations, and running machine learning workloads directly in the browser.</p><p>From a hardware fingerprinting perspective, WebGPU can expose information about the user&#8217;s graphics hardware through properties such as the GPU adapter details:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const adapter = await navigator.gpu.requestAdapter();

if (adapter) {
  console.log(adapter.info);
}</code></pre></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UXF2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UXF2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png 424w, https://substackcdn.com/image/fetch/$s_!UXF2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png 848w, https://substackcdn.com/image/fetch/$s_!UXF2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png 1272w, https://substackcdn.com/image/fetch/$s_!UXF2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UXF2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png" width="1425" height="715" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:715,&quot;width&quot;:1425,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Retrieving information about the user&#8217;s GPU through the navigator.gpu.requestAdapter() async method&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Retrieving information about the user&#8217;s GPU through the navigator.gpu.requestAdapter() async method" title="Retrieving information about the user&#8217;s GPU through the navigator.gpu.requestAdapter() async method" srcset="https://substackcdn.com/image/fetch/$s_!UXF2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png 424w, https://substackcdn.com/image/fetch/$s_!UXF2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png 848w, https://substackcdn.com/image/fetch/$s_!UXF2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png 1272w, https://substackcdn.com/image/fetch/$s_!UXF2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F427d38f0-e53f-4ce0-ba9c-14750df0b72f_1425x715.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Retrieving information about the user&#8217;s GPU through the navigator.gpu.requestAdapter() async method</figcaption></figure></div><p>This type of information can become a valuable fingerprinting signal because GPU models and capabilities vary considerably across devices.</p><h3>Summarizer API</h3><p>The <em><a href="https://developer.mozilla.org/en-US/docs/Web/API/Summarizer_API">Summarizer API</a></em> is an experimental Chromium-based browser API that allows websites to generate text summaries using a built-in, on-device AI model.</p><p>Before using the API, websites can call <em><a href="https://developer.mozilla.org/en-US/docs/Web/API/Summarizer/availability_static">Summarizer.availability()</a></em> to determine whether the device can run the local AI model:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">const availability = await Summarizer.availability({
  expectedInputLanguages: ["en-US"],
  outputLanguage: "en-US",
});
console.log(availability);</code></pre></div><p>The possible outputs are:</p><ul><li><p><em><strong>downloadable</strong>: T</em>he browser supports the requested configuration, but it needs to download an AI model or additional fine-tuning data before it can run it.</p></li><li><p><em><strong>downloading</strong></em>:<em><strong> </strong></em>The browser supports the requested configuration, but an ongoing download must complete before the API becomes available.</p></li><li><p><em><strong>available</strong></em>: The browser already has everything required to run the requested configuration without any additional downloads.</p></li><li><p><em><strong>unavailable</strong>:</em> The browser or device doesn&#8217;t support the requested configuration.</p></li></ul><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HcVa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HcVa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png 424w, https://substackcdn.com/image/fetch/$s_!HcVa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png 848w, https://substackcdn.com/image/fetch/$s_!HcVa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png 1272w, https://substackcdn.com/image/fetch/$s_!HcVa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HcVa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png" width="1432" height="417" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:417,&quot;width&quot;:1432,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;A possible result from the Summarizer.availability() check&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A possible result from the Summarizer.availability() check" title="A possible result from the Summarizer.availability() check" srcset="https://substackcdn.com/image/fetch/$s_!HcVa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png 424w, https://substackcdn.com/image/fetch/$s_!HcVa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png 848w, https://substackcdn.com/image/fetch/$s_!HcVa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png 1272w, https://substackcdn.com/image/fetch/$s_!HcVa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9e0cf90e-1c1c-4ae8-829a-e8c4bf1466ab_1432x417.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A possible result from the Summarizer.availability() check</figcaption></figure></div><p>Behind the scenes, this classification depends on hardware requirements such as available RAM, VRAM, and CPU cores. For instance, devices with less than 16GB of RAM mightn&#8217;t support the API. As a result, the Summarizer API is also relevant from a hardware fingerprinting perspective.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h3>Is Chrome&#8217;s New CPU Performance Tier Fingerprinting an Issue for Web Scraping?</h3><p>No, not necessarily.</p><p>Since <em>navigator.cpuPerformance</em> is exposed to JavaScript, it can be spoofed by definition. A browser automation tool (used for web scraping or automation) can modify the property&#8217;s value to report any performance tier it wants.</p><p>In detail, there are two main approaches to spoofing <em>navigator.cpuPerformance.</em></p><p>The first is a JavaScript-level override. The idea is to let the automation framework inject a JS script before the page loads and redefine the property using <em><a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty">Object.defineProperty()</a></em>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">Object.defineProperty(navigator, "cpuPerformance", {
  get: () =&gt; 4
});</code></pre></div><p>Now, when the page&#8217;s fingerprinting scripts run, <em>navigator.cpuPerformance</em> will always return <em>4</em>. That is the case even if the scraper is running on a server with much weaker hardware.</p><p>The main limitation of this method is that sophisticated bot detection systems (e.g., advanced WAFs) can usually spot JavaScript-level spoofing. That&#8217;s possible as native browser properties have well-defined behaviors (e.g., they&#8217;re read-only), whereas properties overridden with <em>Object.defineProperty()</em> may expose inconsistencies.</p><p>The second approach is to patch Chromium itself, typically by modifying the underlying C++ implementation that exposes <em>navigator.cpuPerformance</em>. In this case, the spoofed value is generated by the browser engine itself, making it virtually impossible to distinguish from a genuine browser.</p><p>The problem is that, for most scraping users, maintaining a custom Chromium build isn&#8217;t practical. The solution is to rely on existing stealth browser solutions. These include:</p><ul><li><p><a href="https://substack.thewebscraping.club/p/open-source-browser-automation-stealth-benchmark?utm_source=publication-search">Open-source projects</a> such as Camoufox (and <a href="https://substack.thewebscraping.club/p/is-camoufox-still-effective-scraping">its forks</a>), Patchright, and <a href="https://substack.thewebscraping.club/p/bypassing-cloudflare-with-nodriver">nodriver</a>.</p></li><li><p>Docker-based solutions like <a href="https://substack.thewebscraping.club/p/kameleo-docker-exploring-the-docker">Kameleo Docker</a> and <a href="https://substack.thewebscraping.club/p/rayobrowse-browser-scraping">rayobrowse</a>.</p></li><li><p>Cloud, premium solutions like <a href="https://brightdata.com/products/scraping-browser">Bright Data&#8217;s Browser API</a>, <a href="https://www.browserbase.com/">Browserbase</a>, and <a href="https://oxylabs.io/products/headless-browser">Oxylab&#8217;s Headless Browser</a>.</p></li></ul><p>These tools already implement low-level fingerprinting protections, allowing you to launch stealth browser sessions.</p><p>So, why all the fuss? If spoofing the API is relatively straightforward, why dedicate an entire article to it? Because, as is generally the case in our industry, it&#8217;s more complex than that&#8230;</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h3>When the CPU Tier Becomes a Real Issue for Bot Detection</h3><p>By itself, <em>navigator.cpuPerformance</em> isn&#8217;t a particularly interesting fingerprinting signal. After all, you can just spoof its value.</p><p>What anti-bot systems actually care about is consistency. Modern fingerprinting (at any level, but especially at the browser and hardware levels) rarely relies on a single signal. Quite the opposite, detection systems correlate dozens of hardware, browser, and behavioral signals to determine whether they describe the same device.</p><p>The CPU Performance API is another piece of that puzzle. For example, a browser claiming to be running on a high-end Tier 4 machine should probably also expose a reasonable number of logical CPU cores through <em>navigator.hardwareConcurrency</em>, enough RAM via <em>navigator.deviceMemory</em>, and a GPU consistent with a modern desktop. <em>(That&#8217;s also why I decided to cover other APIs that contribute to hardware fingerprinting when writing this article.)</em></p><p>If those values don&#8217;t line up (e.g., a Tier 4 CPU paired with only two logical cores and 2GB of RAM), that inconsistency immediately becomes suspicious. Considering that most production-ready scrapers run on servers while spoofing multiple signals to appear as regular user sessions, missing even a single fingerprinting property, such as <em>navigator.cpuPerformance</em>, can be enough to trigger bot detection.</p><p>Ultimately, the CPU Performance API isn&#8217;t the real challenge. As is the case with <a href="https://substack.thewebscraping.club/p/browser-fingerprinting-deep-dive">browser fingerprinting</a>, the hard part is making sure every exposed hardware signal tells the same believable story.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Conclusion</h2><p>In this blog post, I walked you through what Chrome&#8217;s CPU Performance API is, why Chrome introduced it, how it works, and why <em>navigator.cpuPerformance</em> matters in the context of hardware fingerprinting for automated bot detection.</p><p>I hope you enjoyed the article and learned something new along the way. If you have any questions or want to share your thoughts, feel free to leave a comment below. Until next time!</p><h2>FAQ</h2><h3>Which versions of Chrome support the CPU Performance API?</h3><p>The CPU Performance API was introduced in Chrome 152. It&#8217;s expected to become available with the Chrome 152 stable release. Other Chromium-based browsers may adopt it in future versions.</p><h3>Does the new Chrome CPU Performance API introduce privacy issues?</h3><p>As <a href="https://github.com/WICG/cpu-performance#accessibility-privacy-and-security-considerations">covered in the official specification</a>, Chrome&#8217;s <em>navigator.cpuPerformance</em> property intentionally returns only broad performance tiers instead of detailed CPU information in order to reduce potential privacy implications.</p><h3>Can I avoid <em>navigator.cpuPerformance</em> detection by automating Firefox instead of Chrome?</h3><p>As of this writing, yes. The CPU Performance API is a Chromium-specific feature and isn&#8217;t available in Firefox. However, Gecko-based browsers could implement something similar in the future.</p><div><hr></div><p><em>Did you like this article? Share it with someone who might find it useful and get a discount on paid plans.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/the-impact-of-chromes-new-cpu-performance-api?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/the-impact-of-chromes-new-cpu-performance-api?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p><h2></h2>]]></content:encoded></item><item><title><![CDATA[AntsData Review: A Deep Dive into its SERP and Web Search APIs ]]></title><description><![CDATA[A technical walkthrough on integrating the AntsData services into your web scraping workflow.]]></description><link>https://www.scraping.club/p/antsdata-review-serp-web-search</link><guid isPermaLink="false">https://www.scraping.club/p/antsdata-review-serp-web-search</guid><dc:creator><![CDATA[Federico Trotta]]></dc:creator><pubDate>Tue, 01 Sep 2026 15:04:15 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/3b2d3d67-36c4-4dce-9892-f849ac2d77cc_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Welcome to this new episode of &#8220;The tool of the week&#8221;! In this article, you&#8217;ll discover a data provider that you may not know: AntsData.</p><p>Their core offer includes pre-compiled datasets, SERP APIs, Web Search APIs, and a Web Unlocker API (which is coming soon).</p><p>Let me introduce you to the company and show you how easy it is to use the services they offer with a couple of hands-on tutorials.</p><p>Let&#8217;s go for it!</p><h2><strong>What is AntsData?</strong></h2><p><a href="https://antsdata.com/en/">AntsData</a> is a platform that collects, cleans, and delivers data from across the internet. Thanks to its infrastructure, it delivers data ready for AI workflows and analytics:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WfJM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WfJM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png 424w, https://substackcdn.com/image/fetch/$s_!WfJM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png 848w, https://substackcdn.com/image/fetch/$s_!WfJM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png 1272w, https://substackcdn.com/image/fetch/$s_!WfJM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WfJM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png" width="1242" height="798" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:798,&quot;width&quot;:1242,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AntsData website by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AntsData website by Federico Trotta" title="AntsData website by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!WfJM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png 424w, https://substackcdn.com/image/fetch/$s_!WfJM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png 848w, https://substackcdn.com/image/fetch/$s_!WfJM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png 1272w, https://substackcdn.com/image/fetch/$s_!WfJM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c156143-cd1b-40ef-b53b-7a0de1cb909a_1242x798.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AntsData website</figcaption></figure></div><p>Its solutions include:</p><ul><li><p><strong>Google SERP extraction at scale</strong>: <a href="https://antsdata.com/en/serp-scraping-api/google-search-scrapers/">AntsData SERP API</a> allows you to retrieve structured search results from Google without managing proxies, solving CAPTCHAs, or building your custom scraping infrastructure. Use Python, curl, JavaScript, or even their playground and get the data without infrastructure overhead. By using this API, you can extract all major SERP features, including organic results, paid ads, featured snippets, knowledge panels, and more.</p></li><li><p><strong>Web Scraper APIs</strong>: Get clean data in JSON from <a href="https://antsdata.com/en/web-scraper-api/youtube-scraper/">YouTube</a>, <a href="https://antsdata.com/en/web-scraper-api/x-twitter-scraper/">X</a>, <a href="https://antsdata.com/en/web-scraper-api/amazon-scraper/">Amazon</a>, and more websites. These are the best solutions if you are doing sentiment analysis from social media posts, price tracking, <a href="https://www.scraping.club/p/data-scraping-market-research">market research scraping</a>, or if you are <a href="https://www.scraping.club/p/rag-pipeline-web-scraping">building RAG systems</a>.</p></li><li><p><strong>AI-ready datasets</strong>: For data enrichment cases, or if you don&#8217;t have the right coding skills, <a href="https://antsdata.com/en/datasets/app-store-google-play-datasets/">AntsData provides ready-to-use datasets</a>.</p></li><li><p><strong>Custom datasets</strong>: If the analytics-ready datasets are not enough for you, you can ask <a href="https://antsdata.com/en/web-scraping-solutions/">AntsData to create custom datasets for you</a>. By defining the scraping scenario that fits your needs, the company assists you in delivering the right data for your specific case.</p></li></ul><p>On the side of pricing, the company offers a pretty wide range of options, where the interesting one is probably the pay-as-you-go plan with no minimum commitment:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zT7N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zT7N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png 424w, https://substackcdn.com/image/fetch/$s_!zT7N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png 848w, https://substackcdn.com/image/fetch/$s_!zT7N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png 1272w, https://substackcdn.com/image/fetch/$s_!zT7N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zT7N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png" width="1195" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1195,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AntsData pricing offer by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AntsData pricing offer by Federico Trotta" title="AntsData pricing offer by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!zT7N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png 424w, https://substackcdn.com/image/fetch/$s_!zT7N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png 848w, https://substackcdn.com/image/fetch/$s_!zT7N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png 1272w, https://substackcdn.com/image/fetch/$s_!zT7N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7f114230-dee7-46e3-aee2-82a489b192b6_1195x813.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AntsData pricing offer</figcaption></figure></div><h2>How to Use AntsData to Retrieve Web Data From Google SERP</h2><p>Let&#8217;s start by retrieving web data using AntsData Google SERP API.</p><h3>Introduction to the SERP API</h3><p>AntsData SERP endpoints are the kind of resources you use for &#8220;ask and get an answer&#8221; search. In other words, you submit a search query, the server blocks until done, and returns the results. This is a synchronous mechanism, which is different from the async model that works like this: &#8220;submit &#8594; poll &#8594; fetch&#8221;. What&#8217;s particularly important to remember is that:</p><ul><li><p>The synchronous search is the ideal solution for small jobs.</p></li><li><p>Large jobs that exceed the sync window, instead, are more suitable for pollable, asynchronous runs.</p></li></ul><p>Here&#8217;s a schema that summarizes these two different approaches:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oota!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oota!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oota!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oota!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oota!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oota!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg" width="1408" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1408,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The sync VS async mechanism by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The sync VS async mechanism by Federico Trotta" title="The sync VS async mechanism by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!oota!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg 424w, https://substackcdn.com/image/fetch/$s_!oota!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg 848w, https://substackcdn.com/image/fetch/$s_!oota!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!oota!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F86effa37-7148-421c-b242-2868f565e2de_1408x768.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The sync VS async mechanism</figcaption></figure></div><p>This sync API supports the following endpoints, allowing you to retrieve different kinds of results from Google searches:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!nZ6l!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!nZ6l!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png 424w, https://substackcdn.com/image/fetch/$s_!nZ6l!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png 848w, https://substackcdn.com/image/fetch/$s_!nZ6l!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png 1272w, https://substackcdn.com/image/fetch/$s_!nZ6l!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!nZ6l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png" width="1056" height="497" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:497,&quot;width&quot;:1056,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The SEARCH API endpoints by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The SEARCH API endpoints by Federico Trotta" title="The SEARCH API endpoints by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!nZ6l!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png 424w, https://substackcdn.com/image/fetch/$s_!nZ6l!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png 848w, https://substackcdn.com/image/fetch/$s_!nZ6l!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png 1272w, https://substackcdn.com/image/fetch/$s_!nZ6l!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F824eaedc-0fb8-4289-91da-ec14a7729dce_1056x497.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The SERP API endpoints</figcaption></figure></div><p>In this tutorial, I&#8217;ll use the search endpoint. Below are its parameters:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!03KC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!03KC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png 424w, https://substackcdn.com/image/fetch/$s_!03KC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png 848w, https://substackcdn.com/image/fetch/$s_!03KC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png 1272w, https://substackcdn.com/image/fetch/$s_!03KC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!03KC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png" width="1136" height="690" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/dd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:690,&quot;width&quot;:1136,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The Search API parameters by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The Search API parameters by Federico Trotta" title="The Search API parameters by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!03KC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png 424w, https://substackcdn.com/image/fetch/$s_!03KC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png 848w, https://substackcdn.com/image/fetch/$s_!03KC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png 1272w, https://substackcdn.com/image/fetch/$s_!03KC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fdd5504da-ecdc-4689-93f7-cdfb99fad45a_1136x690.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The SERP API parameters</figcaption></figure></div><p>Let&#8217;s get into the actual tutorial!</p><h3><strong>Prerequisites</strong></h3><p>To reproduce this tutorial, you need the following:</p><ol><li><p>A valid <a href="https://console.antsdata.com/en/register">AntsData account</a>.</p></li><li><p><a href="https://www.python.org/downloads/">Python 3.10</a>+ installed on your machine.</p></li></ol><p>Below is the dashboard you&#8217;ll see after creating your account:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!iYQ6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!iYQ6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png 424w, https://substackcdn.com/image/fetch/$s_!iYQ6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png 848w, https://substackcdn.com/image/fetch/$s_!iYQ6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png 1272w, https://substackcdn.com/image/fetch/$s_!iYQ6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!iYQ6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png" width="1456" height="653" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:653,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;AntsData dashboard image by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="AntsData dashboard image by Federico Trotta" title="AntsData dashboard image by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!iYQ6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png 424w, https://substackcdn.com/image/fetch/$s_!iYQ6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png 848w, https://substackcdn.com/image/fetch/$s_!iYQ6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png 1272w, https://substackcdn.com/image/fetch/$s_!iYQ6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fc3bb1d-6338-4af2-b008-e13172a0a5cd_1868x838.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">AntsData dashboard</figcaption></figure></div><p>Note that the company provides you with a free trial option, offering 5$ in credits after registration.</p><h3>Use the SERP API Via the Playground</h3><p>To use the Google SERP API, navigate to the <strong>Web Access</strong> section and click on <strong>Playground</strong>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GsU_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GsU_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png 424w, https://substackcdn.com/image/fetch/$s_!GsU_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png 848w, https://substackcdn.com/image/fetch/$s_!GsU_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png 1272w, https://substackcdn.com/image/fetch/$s_!GsU_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GsU_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png" width="1456" height="561" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:561,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;SERP API&#8217;s playground by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="SERP API&#8217;s playground by Federico Trotta" title="SERP API&#8217;s playground by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!GsU_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png 424w, https://substackcdn.com/image/fetch/$s_!GsU_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png 848w, https://substackcdn.com/image/fetch/$s_!GsU_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png 1272w, https://substackcdn.com/image/fetch/$s_!GsU_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb0e564c0-1278-48df-8f92-3680b1f479fe_1848x712.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">SERP API&#8217;s playground</figcaption></figure></div><p>Set up your request parameters directly in the playground:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GyEa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GyEa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png 424w, https://substackcdn.com/image/fetch/$s_!GyEa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png 848w, https://substackcdn.com/image/fetch/$s_!GyEa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png 1272w, https://substackcdn.com/image/fetch/$s_!GyEa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GyEa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png" width="1456" height="639" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:639,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Set up the parameters in the SERP API by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Set up the parameters in the SERP API by Federico Trotta" title="Set up the parameters in the SERP API by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!GyEa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png 424w, https://substackcdn.com/image/fetch/$s_!GyEa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png 848w, https://substackcdn.com/image/fetch/$s_!GyEa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png 1272w, https://substackcdn.com/image/fetch/$s_!GyEa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2b7dac5c-d4fe-4b75-bb16-27cfbe048da1_1876x823.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Set up the parameters in the SERP API</figcaption></figure></div><p>For this tutorial, the parameters I set up are the following:</p><ul><li><p><strong>Results type</strong>: web results. This makes the platform return only web data from Google results.</p></li><li><p><strong>Research query</strong>: best running shoes. This is the query for the search engine.</p></li><li><p><strong>Search location</strong>: United States.</p></li><li><p><strong>Language</strong>: ****en</p></li><li><p><strong>Google domain</strong>: <a href="http://google.com/">google.com</a></p></li><li><p><strong>Page</strong>: 2</p></li><li><p><strong>Result limits</strong>: 10</p></li></ul><p><strong>NOTE</strong>: To learn more about all the parameters and how to set up their values, read <a href="https://antsdata.com/en/scraping-academy/serp-api-guide/google-serp-api-synchronous-search/">AntsData developers&#8217; technical documentation</a>.</p><p>When ready, click on <strong>Run request</strong>, and you&#8217;ll see the results directly in the dashboard:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4ces!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4ces!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png 424w, https://substackcdn.com/image/fetch/$s_!4ces!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png 848w, https://substackcdn.com/image/fetch/$s_!4ces!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png 1272w, https://substackcdn.com/image/fetch/$s_!4ces!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4ces!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png" width="1456" height="681" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/684b340a-0363-4471-a274-fed942f68a59_1877x878.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:681,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The results section by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The results section by Federico Trotta" title="The results section by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!4ces!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png 424w, https://substackcdn.com/image/fetch/$s_!4ces!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png 848w, https://substackcdn.com/image/fetch/$s_!4ces!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png 1272w, https://substackcdn.com/image/fetch/$s_!4ces!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F684b340a-0363-4471-a274-fed942f68a59_1877x878.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The results section</figcaption></figure></div><p>Below is a partial JSON from the retrieved data:</p><pre><code><code>[
  {
    "organicResults": {
      "url": "https://www.google.com/search?q=best+running+shoes\u0026uule=w+CAIQICINVW5pdGVkIFN0YXRlcw\u0026gl=us\u0026start=10\u0026pws=0\u0026hl=en",
      "organic": [
        {
          "pos": 2,
          "pos_overall": 2,
          "title": "Top Rated Running Shoes | REI Co-op",
          "favicon_text": "REI",
          "url_shown": "https://www.rei.com &#8250; top-rated-running-shoes",
          "url": "https://www.rei.com/s/top-rated-running-shoes",
          "desc": "Shop for Top Rated Running Shoes at REI - Browse our extensive selection of trusted outdoor brands and high-quality recreation gear."
        },
        {
          "pos": 3,
          "pos_overall": 3,
          "title": "Best Running Shoes For Men | On United States",
          "favicon_text": "on.com",
          "url_shown": "https://www.on.com &#8250; Shop",
          "url": "https://www.on.com/en-us/shop/o/best-running-shoes-for-men?srsltid=AfmBOoqlJHi39Rz0hqhbsQbcn-zIx1pvDbxx8lL7pqB3Qenwkr84hnFc",
          "desc": "Best sellers &#183; Cloudswift 4 Road Running Shoe in Wolf/Sand &#183; Cloudrunner 2 Waterproof Road Running Shoe in Sand/Dew &#183; Cloudsurfer Max Wide Road Running Shoe in ...Read more"
        },

...&lt; Omitted for brevity&gt;...

  }
]</code></code></pre><p>In the <strong>Overview</strong> tab, you can download the JSON file with the complete response data:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Jvda!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Jvda!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png 424w, https://substackcdn.com/image/fetch/$s_!Jvda!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png 848w, https://substackcdn.com/image/fetch/$s_!Jvda!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png 1272w, https://substackcdn.com/image/fetch/$s_!Jvda!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Jvda!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png" width="1456" height="561" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:561,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Download results as a JSON file by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Download results as a JSON file by Federico Trotta" title="Download results as a JSON file by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!Jvda!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png 424w, https://substackcdn.com/image/fetch/$s_!Jvda!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png 848w, https://substackcdn.com/image/fetch/$s_!Jvda!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png 1272w, https://substackcdn.com/image/fetch/$s_!Jvda!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff15a9e42-8fb0-4546-9be3-4931b3550392_1860x717.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Download results as a JSON file</figcaption></figure></div><p>At this point, you may want to know how much this call cost. To discover it, go to <strong>Billing</strong>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WSO2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WSO2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png 424w, https://substackcdn.com/image/fetch/$s_!WSO2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png 848w, https://substackcdn.com/image/fetch/$s_!WSO2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png 1272w, https://substackcdn.com/image/fetch/$s_!WSO2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WSO2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png" width="1456" height="540" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:540,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The billing section by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The billing section by Federico Trotta" title="The billing section by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!WSO2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png 424w, https://substackcdn.com/image/fetch/$s_!WSO2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png 848w, https://substackcdn.com/image/fetch/$s_!WSO2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png 1272w, https://substackcdn.com/image/fetch/$s_!WSO2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0a378250-18fc-44e5-aae5-7c847170ebab_1877x696.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The billing section</figcaption></figure></div><p>To talk numbers, I spent 0.002$ for 8 results.</p><h3>Use the SERP API in Python</h3><p>If you want to <a href="https://www.scraping.club/p/kadoa-review-ai-powered-scraping">incorporate the data into an AI workflow</a>, you can call the endpoints in Python, curl, and Node.js. The playground provides you with code you can directly use in your local scripts, after setting up the parameters.</p><p>If you want to use a Python script, change the autogenerated code from the playground so that the script can save the results in a JSON file.</p><p>Before changing the code, first create a folder on your local machine:</p><pre><code><code>mkdir shoes-scraping</code></code></pre><p>Navigate into it:</p><pre><code><code>cd shoes-scraping</code></code></pre><p>Create a virtual environment:</p><pre><code><code>python -m venv venv</code></code></pre><p>Activate the <a href="https://docs.python.org/3/library/venv.html">virtual environment</a>:</p><pre><code><code>source venv/bin/activate # On Windows: ./venv/scripts/activate</code></code></pre><p>In the activated virtual environment, install the <a href="https://requests.readthedocs.io/en/latest/">requests library</a>:</p><pre><code><code>pip install requests</code></code></pre><p>Create a Python file called <code>shoes-scraping.py</code> and write the following code in it:</p><pre><code><code>import requests
import json

url = "https://api.antsdata.com/v1/serp/google/search"
headers = {
    "Authorization": "Bearer &lt;YOUR-API-TOKEN&gt;",
    "Content-Type": "application/json",
}
payload = {
  "recordLimit": 10,
  "dataFormat": "json",
  "searchType": "web",
  "query": "best running shoes",
  "geo_location": "United States",
  "host_language": "en",
  "domain": "com",
  "page": 2
}

resp = requests.request("POST", url, json=payload, headers=headers)

# Parse the response text
data = resp.json()

# Save results as a JSON file
with open("running-shoes.json", "w", encoding="utf-8") as f:
    json.dump(data, f, indent=4)

print("Results saved to running-shoes.json")</code></code></pre><p>And, of course, you will obtain the same result as before.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h2>How to Use AntsData to Retrieve Data from Amazon</h2><p>In this section, you&#8217;ll discover how to use the Amazon Web Search API. But before going directly into a hands-on tutorial, let&#8217;s introduce this API.</p><h3>Introduction to the Web Search APIs</h3><p>All AntsData Web Search APIs use an asynchronous mechanism when retrieving data from the web. Specifically speaking, the Amazon Web Search API supports two endpoints:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_mbd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_mbd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png 424w, https://substackcdn.com/image/fetch/$s_!_mbd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png 848w, https://substackcdn.com/image/fetch/$s_!_mbd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png 1272w, https://substackcdn.com/image/fetch/$s_!_mbd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_mbd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png" width="1201" height="347" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:347,&quot;width&quot;:1201,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Amazon Web Search endpoints by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Amazon Web Search endpoints by Federico Trotta" title="Amazon Web Search endpoints by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!_mbd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png 424w, https://substackcdn.com/image/fetch/$s_!_mbd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png 848w, https://substackcdn.com/image/fetch/$s_!_mbd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png 1272w, https://substackcdn.com/image/fetch/$s_!_mbd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed1f15f6-cb98-49b8-8f09-ea2d3a2ab664_1201x347.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Amazon Web Search endpoints</figcaption></figure></div><p>In the upcoming tutorial section, you&#8217;ll discover how to use the sellers endpoint.</p><h3>Use the Amazon Web Search API Via the Playground</h3><p>First of all, navigate to the Amazon Web Scraper API in the AntsData dashboard:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!htAI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!htAI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png 424w, https://substackcdn.com/image/fetch/$s_!htAI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png 848w, https://substackcdn.com/image/fetch/$s_!htAI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png 1272w, https://substackcdn.com/image/fetch/$s_!htAI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!htAI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png" width="1456" height="433" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:433,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Select the Amazon Web Scraper API into AntsData dashboard by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Select the Amazon Web Scraper API into AntsData dashboard by Federico Trotta" title="Select the Amazon Web Scraper API into AntsData dashboard by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!htAI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png 424w, https://substackcdn.com/image/fetch/$s_!htAI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png 848w, https://substackcdn.com/image/fetch/$s_!htAI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png 1272w, https://substackcdn.com/image/fetch/$s_!htAI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febb40275-dcde-4647-83b4-87d74e9bc9d3_1876x558.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Select the Amazon Web Scraper API in the AntsData dashboard</figcaption></figure></div><p>In the platform, you can insert multiple target URLs. For this tutorial, I defined a couple. One from <a href="https://www.amazon.com/Best-Sellers-Electronics-Camera-Photo-Accessories/zgbs/electronics/172435/ref=zg_bs_nav_electronics_2_281407">Amazon best sellers like electronic accessories</a> for cameras and photos:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!yOax!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!yOax!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png 424w, https://substackcdn.com/image/fetch/$s_!yOax!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png 848w, https://substackcdn.com/image/fetch/$s_!yOax!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png 1272w, https://substackcdn.com/image/fetch/$s_!yOax!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!yOax!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png" width="1456" height="669" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:669,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Amazon&#8217;s bestsellers target URL by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Amazon&#8217;s bestsellers target URL by Federico Trotta" title="Amazon&#8217;s bestsellers target URL by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!yOax!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png 424w, https://substackcdn.com/image/fetch/$s_!yOax!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png 848w, https://substackcdn.com/image/fetch/$s_!yOax!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png 1272w, https://substackcdn.com/image/fetch/$s_!yOax!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfda61eb-727e-411c-b55e-6a6a555a8cc9_1895x871.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Amazon&#8217;s bestsellers target URL</figcaption></figure></div><p>The other from <a href="https://www.amazon.com/Best-Sellers-Electronics-Camera-Photo-Cables-Cords/zgbs/electronics/14015081/ref=zg_bs_nav_electronics_3_172435">Amazon bestsellers electronics cables</a> for cameras and photo products:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tOV4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tOV4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png 424w, https://substackcdn.com/image/fetch/$s_!tOV4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png 848w, https://substackcdn.com/image/fetch/$s_!tOV4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png 1272w, https://substackcdn.com/image/fetch/$s_!tOV4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tOV4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png" width="1456" height="650" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:650,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Amazon&#8217;s bestsellers target URL by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Amazon&#8217;s bestsellers target URL by Federico Trotta" title="Amazon&#8217;s bestsellers target URL by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!tOV4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png 424w, https://substackcdn.com/image/fetch/$s_!tOV4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png 848w, https://substackcdn.com/image/fetch/$s_!tOV4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png 1272w, https://substackcdn.com/image/fetch/$s_!tOV4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fed075f56-d881-4ce8-b79c-fd87ac196f39_1820x812.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Amazon&#8217;s bestsellers target URL</figcaption></figure></div><p>Set up the environment directly in the playground. Select <strong>Discover by category URLs</strong> in <strong>Amazon Best Sellers</strong> and attach the target URLs in the <strong>Inputs</strong> section:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!G4OZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!G4OZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png 424w, https://substackcdn.com/image/fetch/$s_!G4OZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png 848w, https://substackcdn.com/image/fetch/$s_!G4OZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png 1272w, https://substackcdn.com/image/fetch/$s_!G4OZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!G4OZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png" width="1456" height="640" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:640,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Setting up the Amazon scraper by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Setting up the Amazon scraper by Federico Trotta" title="Setting up the Amazon scraper by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!G4OZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png 424w, https://substackcdn.com/image/fetch/$s_!G4OZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png 848w, https://substackcdn.com/image/fetch/$s_!G4OZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png 1272w, https://substackcdn.com/image/fetch/$s_!G4OZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6ffaaea5-289f-47d3-a38c-65b3d558c5d4_1864x819.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Setting up the Amazon scraper</figcaption></figure></div><p>Then click on <strong>Run manually</strong>. You will automatically be redirected to the <strong>Run</strong> section, where you&#8217;ll see that your job is queued:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!SKvm!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!SKvm!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png 424w, https://substackcdn.com/image/fetch/$s_!SKvm!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png 848w, https://substackcdn.com/image/fetch/$s_!SKvm!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png 1272w, https://substackcdn.com/image/fetch/$s_!SKvm!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!SKvm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png" width="1456" height="462" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:462,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Running the Amazon scraper by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Running the Amazon scraper by Federico Trotta" title="Running the Amazon scraper by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!SKvm!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png 424w, https://substackcdn.com/image/fetch/$s_!SKvm!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png 848w, https://substackcdn.com/image/fetch/$s_!SKvm!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png 1272w, https://substackcdn.com/image/fetch/$s_!SKvm!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fef3c4629-0814-428a-ab6d-30aec6d067a9_1900x603.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Running the Amazon scraper</figcaption></figure></div><p>When the process is complete, you can download the JSON file and see how much it costed:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!AGgT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!AGgT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png 424w, https://substackcdn.com/image/fetch/$s_!AGgT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png 848w, https://substackcdn.com/image/fetch/$s_!AGgT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png 1272w, https://substackcdn.com/image/fetch/$s_!AGgT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!AGgT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png" width="1456" height="468" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:468,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Downloading the JSON file by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Downloading the JSON file by Federico Trotta" title="Downloading the JSON file by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!AGgT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png 424w, https://substackcdn.com/image/fetch/$s_!AGgT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png 848w, https://substackcdn.com/image/fetch/$s_!AGgT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png 1272w, https://substackcdn.com/image/fetch/$s_!AGgT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F30fa4021-4e67-4e3e-9f42-da0574b4123f_1672x537.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Downloading the JSON file</figcaption></figure></div><p>Below is a partial result from the JSON:</p><pre><code><code>[
  {
    "url": "https://www.amazon.com/Best-Sellers-Electronics-Camera-Photo-Accessories/zgbs/electronics/172435/ref=zg_bs_nav_electronics_2_281407",
    "depth": 0,
    "name": "Best Sellers in Camera \u0026 Photo Accessories"
  },
  {
    "url": "https://www.amazon.com/gp/bestsellers/electronics/502394",
    "depth": 1,
    "name": "Best Sellers in Camera \u0026 Photo Products"
  },
  {
    "url": "https://www.amazon.com/gp/bestsellers/electronics/14015081",
    "depth": 1,
    "name": "Best Sellers in Camera \u0026 Photo Cables \u0026 Cords"
  },
  {
    "url": "https://www.amazon.com/gp/bestsellers/electronics/505106",
    "depth": 1,
    "name": "Best Sellers in Camcorder Accessories"
  },

&lt;...OMITTED FOR BREVITY&gt;

  {
    "url": "https://www.amazon.com/gp/bestsellers/electronics/2243862011",
    "depth": 4,
    "name": "Best Sellers in Laptop Cooling Pads \u0026 External Fans"
  }
]
</code></code></pre><p>Note that AntsData charges 0.55$ per 1000 results with its Web Scraper APIs. In this case, I spent 0.55$ for a total of 82 entries retrieved.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h2>AntsData Pros and Cons</h2><p>Overall, here&#8217;s a summary of the pros and cons from my tests.</p><p>&#128077; <strong>Pros</strong>:</p><ul><li><p>The APIs have good and comprehensive documentation. The parameters are well defined, and responses are clearly explained, even in the case when the server doesn&#8217;t return a 200.</p></li><li><p>The platform is intuitive to use and to navigate, even for junior engineers.</p></li><li><p>The playground works well and reports code that can actually be incorporated into your workflows as is or with just minor adjustments.</p></li></ul><p>&#128078; <strong>Cons</strong>:</p><ul><li><p>The company claims that developers can use their MCP with the Web Scraper APIs. I tested it and, unfortunately, it doesn&#8217;t work. Specifically, the target URL returns a 404. Of course, that could be a temporary error; however, that was the result at the time I tested it.</p></li><li><p>The offer is limited in terms of datasets and available Web Scraper APIs, compared to similarly sized competitors.</p></li></ul><h2>Conclusion</h2><p>AntsData positions itself as a middle-ground provider in the crowded web scraping market, focusing on a friction point for engineers: speed to delivery. For teams building RAG pipelines or training LLMs, the &#8220;AI-ready&#8221; nature of their JSON output significantly reduces the time spent in the data-cleaning purgatory.</p><p>However, it isn&#8217;t without its growing opportunities. The limited library of specialized APIs and the current instability of their MCP integration suggest that AntsData is still in its scaling phase.</p><p>So, let&#8217;s discuss in the comments: did you already know AntsData? What&#8217;s your experience with them?</p>]]></content:encoded></item><item><title><![CDATA[Google removed the URLs. Only for the people who resell them.]]></title><description><![CDATA[The goto wrapper is not a rollout. It is what Google sends the clients it has already classified.]]></description><link>https://www.scraping.club/p/google-removed-the-urls-serp</link><guid isPermaLink="false">https://www.scraping.club/p/google-removed-the-urls-serp</guid><dc:creator><![CDATA[Pierluigi Vinciguerra]]></dc:creator><pubDate>Sun, 30 Aug 2026 13:51:42 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/811416b6-8a54-4d09-8657-21c8970e3e40_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>On August 26, 2026, <a href="https://ppc.land/google-forces-rank-trackers-into-500-to-1-000-requests-per-query/">PPC Land reported</a> a Google change that most people probably missed unless they work with rank tracking. Now, when you look at search results, the links no longer show the real site address. Instead, they all point to <code>google.com/goto?url=</code> with an encoded string. When you click, Google redirects you to the real page on their server side.</p><p>In the same article, Derek Perkins at Nozzle measured what this means in practice. If you want to resolve all the links for a five-page ranking, you need between 500 and 1,000 requests. You can&#8217;t decode these links yourself, and HEAD requests won&#8217;t give you the answer. The only way to know where each result points is to ask Google for every single link.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p><div><hr></div></blockquote><p>Most people talked about this as if it were a typical rollout, something Google would turn on for everyone over time. That&#8217;s why Barry Schwartz checked for it on his own machine and didn&#8217;t see anything, while Nozzle saw it almost everywhere.</p><p>Both were right in their own way since this isn&#8217;t a standard rollout. It&#8217;s Google responding to something.</p><p>If you see it this way, the cost story isn&#8217;t as dramatic as it sounds. I&#8217;ll show you the numbers, but to sum up: those 500 to 1,000 requests are real, they&#8217;re cheap, and honestly, they&#8217;re not the real problem.</p><h2>Two windows, one variable</h2><p>Here&#8217;s an experiment you can try yourself. It only takes about four minutes.</p><p>Start by opening Chrome with a fresh profile and search for something commercial (I used &#8220;best running shoes&#8221;). In the console, count how many result links go directly to the destination and how many use the goto wrapper, using this script.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;javascript&quot;,&quot;nodeId&quot;:&quot;f1c8098d-666a-4d9e-a962-542cac29ab97&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-javascript">(()=&gt;{const f=()=&gt;{const a=[...document.querySelectorAll('#rso a[href], #search a[href]')];const h=x=&gt;x.getAttribute('href')||'';return `goto=${a.filter(x=&gt;h(x).includes('/goto?')).length} direct=${a.filter(x=&gt;/^https?:\/\//.test(h(x))&amp;&amp;!/google\.|gstatic/.test(h(x))).length} total=${a.length}`};console.log('t0',f());setTimeout(()=&gt;console.log('t+5s',f()),5000);setTimeout(()=&gt;console.log('t+20s',f()),20000);})()</code></pre></div><p>Then, open a second Chrome window, again with a fresh profile and the same connection, but this time add the <code>--remote-debugging-port</code> flag. Don&#8217;t attach anything to that port and don&#8217;t automate anything. Just type the same query by hand.</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:&quot;f6bdfc8f-71eb-4107-9920-3ef27f08179d&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">window                                  goto  direct  total
fresh profile, no debug port               0     213    215
fresh profile, --remote-debugging-port    96       0    106
fresh profile, --remote-debugging-port    83       0     93</code></pre></div><div><hr></div><blockquote><p><em>HTTP/3 and QUIC run on UDP, so the proxy layer has to carry it too. <a href="https://anyip.io/proxies/udp-proxy?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_1&amp;utm_content=banner_udp">anyIP</a> gives compatible clients production-ready SOCKS5 UDP ASSOCIATE across its residential and mobile network for your SERP scraping.</em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://anyip.io/proxies/udp-proxy?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_1&amp;utm_content=banner_udp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kVO3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp 424w, https://substackcdn.com/image/fetch/$s_!kVO3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp 848w, https://substackcdn.com/image/fetch/$s_!kVO3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp 1272w, https://substackcdn.com/image/fetch/$s_!kVO3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kVO3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp" width="1456" height="728" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:54418,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/webp&quot;,&quot;href&quot;:&quot;https://anyip.io/proxies/udp-proxy?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_1&amp;utm_content=banner_udp&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/213397484?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kVO3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp 424w, https://substackcdn.com/image/fetch/$s_!kVO3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp 848w, https://substackcdn.com/image/fetch/$s_!kVO3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp 1272w, https://substackcdn.com/image/fetch/$s_!kVO3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbf146cd3-51ce-4ea9-a736-99b288ae5f79_1456x728.webp 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://anyip.io/proxies/udp-proxy?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_1&amp;utm_content=banner_udp&quot;,&quot;text&quot;:&quot;Explore anyIP UDP Proxies &#8594;&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://anyip.io/proxies/udp-proxy?utm_source=thewebscrapingclub&amp;utm_medium=newsletter&amp;utm_campaign=gold_2026_1&amp;utm_content=banner_udp"><span>Explore anyIP UDP Proxies &#8594;</span></a></p></blockquote><div><hr></div><p>Everything else stays the same: same machine, same home connection, same query, just a few minutes apart. Without the flag, you see 213 destination URLs in the HTML, just like before. With the flag, you get zero direct URLs and 96 wrapped links instead.</p><p>Both results are stable. I checked each page at load, after five seconds, and after twenty seconds, and the counts never changed. So it&#8217;s not JavaScript changing the page later. The difference comes from what Google sends you right from the start.</p><p>I ran nine more tests using a stealth browser with full automation, and every time I got zero direct URLs, always wrapped. But when I browse normally, logged in or in a private window, I never see any wrappers at all.</p><p>So, from my little experiment, it seems that Google detects when I&#8217;m using an automated solution and serves me different results. The key factor for showing URLs or not is whether Google thinks it&#8217;s talking to a human or a script.</p><h2>What this actually means</h2><p>If you look at the reports with this in mind, it all makes sense. Schwartz didn&#8217;t see the behavior because he was just using his browser. Nozzle saw it everywhere because they&#8217;re a rank tracker, and Google had already classified their traffic. What people called a &#8216;bucketed rollout&#8217; was really just two different groups seeing two different things.</p><p>This also changes what those 500 to 1,000 requests really mean. That&#8217;s not the new baseline cost for scraping Google. It&#8217;s what you pay after Google has recognized you. If you haven&#8217;t been flagged, the addresses are still in the markup, ready to grab for free.</p><p>For me, this is more interesting than just a link format change. Blocking is obvious: you&#8217;re either in or out, and you know it. </p><p>Here, Google still gives you results, the page loads, your parser can still find titles, positions, and snippets. Everything works. The only thing missing is that one field, and now you have to pay a network round trip for each row to get it.</p><p>There&#8217;s no warning when this happens. A pipeline that worked fine in June still returns HTTP 200 and well-formed HTML today, but the data quality quietly drops in the meantime.</p><h2>What the wrapped page contains</h2><p>Ten captures on the treatment side, across two queries, nine from a stealth browser and one read over CDP from a page a person opened by hand:</p><pre><code><code>in-result anchors : 408
goto wrappers     : 339
direct URLs       :   0
old /url? wrappers:   0</code></code></pre><p>In every capture, I found zero direct destinations. The old <code>/url?q=</code> wrapper, which at least left the address in plain text, is gone too. Now, every organic link, every video timestamp, and every &#8216;translate this page&#8217; link is wrapped. They all have a <code>ping</code> attribute.</p><p>The difference between the number of anchors and wrappers comes from Google&#8217;s own navigation. For example, on the CRM software pricing page, 18 out of 38 in-result anchors are related searches, and three are ad links. All 17 external destinations are wrapped.</p><h2>The token is protobuf, and that doesn&#8217;t help you</h2><p>One question I had was: can the token be reverted to the URL? Of course, not.</p><p>Every token starts with <code>CAES</code>. Base64 decoded, that&#8217;s 08 01 12: protobuf field 1 as a varint set to 1, then field 2 as a length-delimited blob. A field walk over the decoded bytes confirms it.</p><pre><code><code>field 1, wire 0, value 1
field 2, wire 2, len 99..119</code></code></pre><p>The blob inside field 2 is where the destination should be, and it isn&#8217;t there. Every one of the 183 distinct tokens we collected opens with the same five bytes, 01 EB 3B 30 15, and everything after is high entropy noise. We measured 6.27 to 6.44 bits per byte over roughly a hundred bytes, which is what you get on random or encrypted data. Base64, base64url, percent decoding first, gzip and zlib on the result, none of them produce a single printable URL fragment.</p><p>What you see here is a constant header followed by an opaque payload, just like you&#8217;d expect from a key identifier and ciphertext. You can&#8217;t decode this yourself because you don&#8217;t have the key. Reversing an encoding is one thing, but getting a key from Google is a whole different story. So, the only way to get the destination is to let Google look it up for you, one request at a time.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h2>HEAD is not refused, which is worse</h2><p>Another idea could be to use HEAD requests, so that in cases of redirects, the Location header contains the final URL. This could be a faster way to check which URL the token corresponds to.</p><p>What we measured from our test is annoying instead. Across 50 wrapped links resolved from the home line with <code>curl_cffi</code> and redirects disabled:</p><pre><code><code>HEAD  -&gt;  200 on all 50, Location header present on 0
GET   -&gt;  302 on all 50, Location header present on 50
median GET latency  : 59 ms
mean bytes per GET  : 1068 B (headers plus body, redirect not followed)</code></code></pre><p>HEAD requests aren&#8217;t blocked. You get a 200 response, but no redirect. If you just log the requests, you&#8217;ll see fifty successes but get nothing useful, and you&#8217;ll have to figure out why. The usual HTTP cache path doesn&#8217;t fail with an error. It just looks like it worked, which can waste a lot of time before you realize what&#8217;s going on.</p><p>GET requests work as expected: one per link, you get a 302 with a Location header, and you have the destination. I tried fifty of these from a home IP and didn&#8217;t hit any rate limits, so the throttle is set higher than that.</p><h2>The mapping is not stable, so there is no lookup table</h2><p>The last mitigation idea I had was to create a lookup table between tokens and final URLs. We compared the token attached to each result title across all captures. That covers three reloads inside one accepted session and several entirely separate browser sessions, hours apart, which is a harder test than reloading. Forty-six results appeared in more than one capture.</p><pre><code><code>results seen in more than one capture : 46
token identical                       : 0
token changed                         : 46</code></code></pre><p>None of the tokens are stable. The same link to the same page on the same query gets a new token every time. The <code>CAES</code> and <code>01 EB 3B 30 15</code> prefix stays the same, but the rest changes completely. In one case, I saw a result with 24 different tokens across my tests.</p><p>This answers a question that came up in the original discussion. You can&#8217;t build a lookup table and reuse it, because there&#8217;s nothing stable to key it on. The payload is tied to the impression, not the destination, so you pay the full resolution cost every time. I tried to find a caching trick here, but there isn&#8217;t one.</p><p>Those reloads showed me something else. They were automated navigations using a script over CDP, but the session was started by a human. Google allowed all of them. Once Google accepts a session, it keeps working even if you automate it. The real check happens when you submit the query, not after.</p><h3>Where the destination leaks anyway</h3><p>In three out of ten captures, I actually got some destinations in the clear, and I doubt that&#8217;s intentional.</p><p>When Google offers to translate a result, the &#8220;translate this page&#8221; link is usually a wrapper, but sometimes it&#8217;s a plain <code>translate.google.com/translate?u=</code> with the target sitting in the clear:</p><pre><code><code>https://www.salesforce.com/eu/crm/pricing/
https://www.zoho.com/en-us/crm/zohocrm-pricing.html
https://www.creatio.com/glossary/crm-pricing</code></code></pre><p>I checked if those were the same destinations you&#8217;d otherwise have to resolve. Looking at the first eight wrapped links and resolving them, six were already available for free in a translate link. The other two were Italian results, which Google didn&#8217;t offer to translate.</p><p>This happened in three out of ten captures, using the same queries and the same browser. I couldn&#8217;t figure out what triggers it. I think of it as a discount that sometimes shows up, so always check for it before you spend a request.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h3>What&#8217;s the cost of this modification?</h3><p>On a wrapped page, I saw between 59 and 113 wrapper anchors, depending on how many results there were. After deduplication, that&#8217;s 59 unique tokens on my reference page. For a five-page ranking, that&#8217;s 565 requests if you resolve every anchor, or 295 after deduplication. The 500-1,000 range makes sense if you just resolve everything, which is probably what most people do.</p><p>The good news is that solving these tokens actually takes almost nothing. I tried resolving the same links four different ways: using <code>curl_cffi</code> with full Chrome TLS impersonation, and with plain requests, both with and without a Referer header. No cookies, no session, no proxy involved.</p><pre><code><code>requests, no referer      12/12 resolved, 302 + Location, median 124 ms, 1269 B
requests, with referer    12/12 resolved, 302 + Location, median 137 ms, 1268 B
curl_cffi, no referer     12/12 resolved, 302 + Location, median 115 ms, 1479 B
curl_cffi, with referer   12/12 resolved, 302 + Location, median 123 ms, 1479 B</code></code></pre><p>Plain requests work just fine. The stealth setup you needed to get the page isn&#8217;t needed to resolve the links. You don&#8217;t need a residential proxy, cookies, or even a referer, at least at this small scale.</p><p>Tokens also stay valid. I captured links one day and resolved all 12 of them the next morning, so you don&#8217;t have to resolve them right away. You can collect now and resolve later, even in bulk.</p><p>Now, about throughput. This is where people expected to hit a wall. I ran 1,200 resolutions from a regular IP using a plain client, increasing concurrency as I went:</p><pre><code><code>concurrency  1:  60/60 resolved,  7.8 req/s
concurrency  5:  60/60 resolved, 35.1 req/s
concurrency 10:  60/60 resolved, 56.9 req/s
concurrency 20: 200/200 per chunk, six chunks, 110 req/s sustained</code></code></pre><p>A tenth of a second, maybe two. In a multi-second answer, that&#8217;s real but manageable. </p><p>So, if the costs for solving these tokens are minimal, why did Google bother to put this feature in place?</p><p>The answer is that Google is now a synchronous dependency inside a competitor&#8217;s live product. Every user question that reaches Google&#8217;s index now needs a set of real-time callbacks to google.com before the answering system can read a single page.</p><p>That gives Google three things it didn&#8217;t have before. </p><p>First, a throttle it controls, where the visible symptom is someone else&#8217;s product getting slow. </p><p>Second, a live view of how many results each consumer dereferences and when, which is a decent proxy for their query volume. </p><p>Third, the machinery to apply both selectively, since the classifier that decides who gets wrapped markup is the same one that could decide who gets rate-limited.</p><p>This means more Google control over a certain type of third-party services, but not its direct competitors in the LLM space.</p><p>Claude&#8217;s web search appears to run on Brave Search. Anthropic has never said so publicly, but Brave Search has been on its <a href="https://simonwillison.net/2025/Mar/21/anthropic-use-brave/">published subprocessor list since March 2025</a> and is <a href="https://xponent21.com/insights/claude-web-search-brave-turbopuffer/">still there in July 2026</a>, the search function carries a <code>BraveSearchParams</code> parameter, and the citations match what Brave returns for the same query. ChatGPT is more mixed. It <a href="https://searchengineland.com/chatgpt-retrieval-stack-index-cache-pages-485036">launched on Bing</a>, then built its own crawler and index, and now runs a blended stack with Bing still contributing alongside third-party providers.</p><p>Neither of them reads a Google results page, so they&#8217;re not touched by this deploy.</p><p>That narrows the target a lot. The companies with real exposure are the ones whose whole product is Google&#8217;s index resold with low latency, the SERP API vendors that sit between Google and everyone building on top of search. They can&#8217;t route around this like an assistant with its own index, because Google&#8217;s index is what they sell. Their customers want results in a second or two, which puts the resolution stage inside a latency budget set by someone else.</p><p>The most prominent vendor in the reachable group is the one Google currently has in court.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p><a href="https://www.seroundtable.com/google-search-goto-tracking-41957.html">As a Google spokesperson said to Seroundtable.com</a>: &#8220;We have a long history of deploying technical measures against evolving forms of abuse, and we regularly take steps to protect our services and users.&#8221; No target, no timetable, no documentation, and no acknowledgment that two clients asking the same question get different pages.</p><p>None of this is a rule anyone has to enforce, and that&#8217;s what makes it durable. A block can be litigated, and Google already lost once, on the grounds that reading a page counts as circumvention. Serving valid HTML with one field removed to clients you have classified isn&#8217;t a refusal of service, and there&#8217;s nothing to appeal against.</p><p>The cost for this particular field is actually small, and that&#8217;s important to keep in mind. What matters isn&#8217;t the 295 requests. It&#8217;s that Google can now separate the two groups well enough to send them different markup, quietly, with no announcement and no error in your logs. The field it removed this time is cheap to buy back with a GET. Nothing about the mechanism says the next one will be.<br></p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/google-removed-the-urls-serp?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Web Scraping Club! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/google-removed-the-urls-serp?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/google-removed-the-urls-serp?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div><hr></div><p> </p>]]></content:encoded></item><item><title><![CDATA[The LAB #114: Manus at Work - Kasada on Nike.com]]></title><description><![CDATA[Using Manus AI to study the Kasada anti-bot protection]]></description><link>https://www.scraping.club/p/deobfuscating-kasada-with-manus-ai</link><guid isPermaLink="false">https://www.scraping.club/p/deobfuscating-kasada-with-manus-ai</guid><dc:creator><![CDATA[Pierluigi Vinciguerra]]></dc:creator><pubDate>Wed, 26 Aug 2026 22:13:59 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/8e9aebcc-16f7-4a1a-8ae2-17f9060ba40a_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I&#8217;ve been looking at Kasada for a while now, and every time I tried to approach it in a simple way. If you send the right token, you get the page and move on. That&#8217;s exactly what I did in THE LAB #76, and also <a href="https://www.scraping.club/p/scraping-a-kasada-website"><span>the first time I ran into it back in 2022</span></a>, when getting a 429 on a parka page was the main issue. This method works, but it doesn&#8217;t really tell you anything about how the system decides if you&#8217;re a real user.</p><p>That program has gotten harder to look at. Kasada doesn&#8217;t ship obfuscated JavaScript anymore, at least not in the sense that a beautifier helps you. It ships a custom virtual machine and a blob of bytecode for it. You can pretty-print the file all day, and you&#8217;ll still be reading an interpreter loop, not logic. So I stopped asking how to get past it. I wanted to know what it costs to open one of these things and what you&#8217;re allowed to claim once you have one.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p></blockquote><p>To find out, I pointed an autonomous agent at Kasada on nike.com. What I wanted out of it, mostly, was the list. Which values does this thing actually reach for when it builds your fingerprint? Not a bypass, not a token generator, just the inventory of what it reads off your browser and how solid the evidence is for each entry.</p><p>That list came back at 412 entries, and it lives in the code rather than in this article. You&#8217;ll find it in <span>fingerprint_inventory.csv</span>, with the category, the reference count, and the byte positions for every one.</p><p>Pasting a 412-row CSV into a newsletter helps nobody, so what I&#8217;ll do here is walk the shape of it and spend most of the time on how you get to a list like that without fooling yourself. As always, all the code and the results will be available <a href="https://github.com/TheWebScrapingClub/thelab">on our GitHub repository, available to paid readers under the folder 114.KASADA-NIKE</a>.</p><p>Everything below is the client side of <span>j-1.2.726</span> as observed on August 26, 2026, plus the parts I re-ran myself, because I wasn&#8217;t going to publish somebody else&#8217;s numbers on trust. </p><h2>The tools</h2><p><a href="https://manus.im/invitation/BIAZJTF5YY3S?utm_source=invitation&amp;utm_medium=social&amp;utm_campaign=copy_link"><span>Manus AI</span></a> did the collection and the first pass of analysis. It&#8217;s an agent that pairs a language model with a sandboxed Linux VM and a Chromium browser, so it can fetch assets, run Node and Python, drive a page, and iterate on its own output inside the sandbox. We used it the same way in <a href="https://www.scraping.club/p/the-lab-108-how-llms-and-manus-ai"><span>THE LAB #108</span></a> against Akamai on Net-a-Porter. The reason it gets this class of work rather than a chat assistant is the guardrail gap. Ask a heavily guarded model to deobfuscate a production anti-bot sensor and enumerate the signals it scores, and you hit a wall. </p><p>Node 22 performs deobfuscation, and the important point is that it never executes anything Kasada served. We reimplemented the decoders from the beautified source and ran them over the captured bytes, so nothing from <span>nike.com</span> was ever evaluated.</p><p>The Chrome DevTools Protocol side is deliberately boring. It reads browser APIs, resource timing, and deterministic canvas, WebGL and audio probes, and that&#8217;s all it does. No hooks, no replaced natives, no Proxies over DOM APIs. Python 3.11 from our shared venv runs the comparison afterward.</p><h2>How Kasada is laid out on nike.com</h2><p>Everything comes off one UUID path:</p><pre><code><code>/149e9513-01fa-4fb0-aad4-566afd725d1b/2d206a39-8ed7-437e-a3be-862e0f06eea3/</code></code></pre><p>The page loads <code>p.js</code>. That script fires an <code>mfc</code> request and creates two iframe navigations to an <code>fp</code> endpoint. </p><div><hr></div><blockquote><p><em><strong>The new anti-bot solution</strong> - Toughest walls, lowest price. Claim your free 10 000 requests with coupon code <strong>WSCLUB</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0jGM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 424w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 848w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0jGM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png" width="612" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/baf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:612,&quot;bytes&quot;:493234,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/208113514?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0jGM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 424w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 848w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k&quot;,&quot;text&quot;:&quot;Claim your credits&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k"><span>Claim your credits</span></a></p></blockquote><div><hr></div><p>That script fires an <code>mfc</code> request and creates two iframe navigations to an <code>fp</code> endpoint. The <code>fp</code> response is a tiny HTML document that bootstraps the real work, and here it is as captured, with session values stripped:</p><pre><code><code>&lt;!DOCTYPE html&gt;&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;
&lt;script&gt;
window.KPSDK={};
KPSDK.now=typeof performance!=='undefined'&amp;&amp;performance.now
  ? performance.now.bind(performance)
  : Date.now.bind(Date);
KPSDK.start=KPSDK.now();
window.parent.postMessage('KPSDK:MC:&lt;redacted&gt;', '*');
&lt;/script&gt;
&lt;script src="/149e9513-.../2d206a39-.../ips.js?KP_UIDz=&lt;redacted&gt;&amp;x-kpsdk-v=j-1.2.726&amp;x-kpsdk-im=&lt;redacted&gt;"&gt;&lt;/script&gt;
&lt;/body&gt;&lt;/html&gt;</code></code></pre><p>Four things are worth pulling out of those nine lines. <span>window.KPSDK</span> gets created here, not in <span>p.js</span>. The clock is pinned to <span>performance.now</span> bound to <span>performance</span>, with <span>Date.now</span> as fallback, and <span>KPSDK.start</span> is stamped immediately, so everything downstream measures against that origin. The iframe communicates with the parent via <span>postMessage</span> using a <span>KPSDK:MC:</span> prefix. And <span>ips.js</span> gets loaded with three query parameters, one of which is the SDK version in cleartext.</p><p>So there are four layers here, and I should say which one I&#8217;m after. The loader and its integrity checks live in <span>p.js</span>. The fingerprinting program lives in <span>ips.js</span>. Then there&#8217;s whatever transport carries the result back, and behind that the server-side decision.</p><p><span>ips.js</span> is the one I care about, because that&#8217;s where the browser values get read. <span>p.js</span> comes along for the ride, since you can&#8217;t reach <span>ips.js</span> without going through it. The transport we&#8217;ll get to, and the answer is unsatisfying. The server-side scoring is out of scope for the boring reason that nobody outside Kasada can see it, and I&#8217;d rather say that than dress a guess up as a finding.</p><h2>The rules we set before collecting anything</h2><p>This part is boring and it&#8217;s the reason the rest is usable.</p><p>The collection was read-only by construction. No native API replacement, no getters or Proxies added, no scripts or requests modified, no payload decryption, no token reuse. Five loads of <span>https://www.nike.com/men</span>, same profile, same session, cache-busting on each, with the same snapshot script every time. Arrays and keys that may return in arbitrary order are sorted before hashing. API errors are recorded as errors rather than being replaced with an invented value. Raw tokens never make it into the artifacts, only length, alphabet class and SHA-256.</p><p>More important, every claim carries an evidence level:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Xb3C!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Xb3C!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png 424w, https://substackcdn.com/image/fetch/$s_!Xb3C!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png 848w, https://substackcdn.com/image/fetch/$s_!Xb3C!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png 1272w, https://substackcdn.com/image/fetch/$s_!Xb3C!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Xb3C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png" width="809" height="376" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00ce21b4-a931-4244-a358-812a89d6272e_809x376.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:376,&quot;width&quot;:809,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:51998,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/211284105?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Xb3C!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png 424w, https://substackcdn.com/image/fetch/$s_!Xb3C!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png 848w, https://substackcdn.com/image/fetch/$s_!Xb3C!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png 1272w, https://substackcdn.com/image/fetch/$s_!Xb3C!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00ce21b4-a931-4244-a358-812a89d6272e_809x376.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>The census below lives at B and D. Level E was never reached, and level F was never attempted against the live service. If you&#8217;ve read anti-bot writeups that announce &#8220;83 signals collected and transmitted&#8221;, the number almost always comes from level A. A string sitting in a table hasn&#8217;t been read by anything, and a property that does get read hasn&#8217;t necessarily been sent anywhere.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h2>Two decoders, and one of them watches the clock</h2><p>Both assets hide their actual content in a string blob that is converted into an integer array. The blobs are large. <span>p.js</span> was 163,120 bytes with a main blob of 136,736 characters; <span>ips.js</span> was 655,603 bytes with a main blob of 603,415.</p><p>The <span>p.js</span> decoder is a variable-radix varint and nothing else. Alphabet of 72 characters, radix 48, no seed, no checksum. It produces 74,029 integers.</p><p><span>ips.js</span> keeps the same varint base and wraps it in a time lock. Alphabet of 71, radix 46, and a correction seed derived from the wall clock:</p><pre><code>Math.round(Date.now() / 18000081) * 11</code></pre><p>Each decoded integer has a decimal digit of that seed subtracted from it, cycling through the digits and starting at an index equal to the sum of those digits. After 14 values, the decoder checks the running result against the constant <span>1611118298</span>. If the checksum misses, that seed was wrong. Three candidates get tried: the current window and the two neighbors, and during the capture, the seed that worked was 1,092,509. With the right seed, you get 305,595 integers.</p><p>I re-ran both decodes on my own machine, out of the archived assets, and they came back identical:</p><pre><code>p.js    74,029 integers   string table 6,145 chars   sha256 6ad4ec90...   86 opcodes
ips.js 305,595 integers   string table 38,946 chars  sha256 c47829...    193 opcodes</code></pre><p>Now, 18000081 milliseconds is five hours. Three candidate windows mean that a captured <span>ips.js</span> only decodes within a 15-hour band; after that, it&#8217;s a permanent blob. That&#8217;s the kind of claim that&#8217;s easy to assert and annoying to prove, because the obvious way to test it is to wait. So instead of waiting, we walked a synthetic clock past the decoder and watched where it broke:</p><pre><code><code>clock -10h  window seed 1092498  decoded 305595 integers with seed 1092509
clock  -5h  window seed 1092509  decoded 305595 integers with seed 1092509
clock +  0h  window seed 1092520  decoded 305595 integers with seed 1092509
clock +  5h  window seed 1092531  DECODE FAILED (checksum mismatch on all 3 candidates)
clock + 10h  window seed 1092542  DECODE FAILED
clock + 24h  window seed 1092575  DECODE FAILED
clock + 72h  window seed 1092685  DECODE FAILED

asset seed        1092509 (window 99319)
band opens        2026-08-26T05:44:04.717Z
band closes       2026-08-26T20:44:04.960Z
band width        15.00 hours
fetched at        2026-08-26T15:30:09.000Z
already spent     9.77 hours of the band
usable after that 5.23 hours</code></code></pre><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><p>I ran that at 20:16 UTC on the day of the capture, with about half an hour to spare. Here&#8217;s the part that took me a second to appreciate. The validity band is exactly fifteen hours wide, three windows of five hours, and it&#8217;s anchored to the window the asset was minted in. It is not anchored to when you fetched it.</p><p>Nike handed us that <span>ips.js</span> at 15:30 UTC, which was 9 hours and 46 minutes into its own band. So we didn&#8217;t get fifteen hours to work with; we got five hours and fourteen minutes. Fetch the same file an hour and a quarter later in its cycle, and you&#8217;d be down to four. Fetch it near the end of the band and you&#8217;d get minutes.</p><p>You have no way to know in advance where in that band your download lands, because the asset doesn&#8217;t tell you when it was minted. You find out by decoding it and reading which of the three candidate seeds came back valid. That&#8217;s what the <span>seed</span> field in the decoder output is for, and it&#8217;s the first thing I&#8217;d log in any tooling.</p><p>After 20:44 that file is bytes. No amount of cleverness gets the bytecode back out of it, because the key was the clock and the clock moved on. So if you&#8217;re building anything that involves reading <span>ips.js</span>, the reading must occur in the same session as the fetch. Archiving the assets to analyze at your leisure doesn&#8217;t work, and I&#8217;d rather you learn that here than from a folder of files that no longer open. The script is at <span>seed_window.js</span>.</p><h2>The string table, and why substring search lies</h2><p>Both files pull a string table out of the integer array. The index comes from the last decoded integer XORed with the array length plus four, the slice gets removed, and the value decoder reads the whole thing back as one long string. <code>p.js</code> yields 6,145 characters, <code>ips.js</code> yields 38,946, and 99.87% of the latter is printable ASCII.</p><p>Here&#8217;s the first 600 characters of the <code>ips.js</code> table, verbatim:</p><pre><code><code>guaap&#948;onmouseentervoiceURIsteptracker2khq_globalProxyscreenToptwqflro_md&#959;namejxrkgvdthtsubtlescaleeoremoveWin64local-network-accessdylibVersionw1(async()=&gt;{try{innerText7SsUqMprototypevtgetComputedStylexouterHeightroundiwawaMediaRecorderMediameallgpd&#128299;&#953;bbvsfMUjziJmhaxcanvaappendMimeTypeArrayeventListenerscchannels[object Object]ypkjpkWIN64if_pn_pcounterarcsr-rsqtdmatchkhazh-hkuuxskkenaudio/webm;codecs=opusavkdppxgetPrototypeOfGestureEventsololveecanvaeditormakmsorientationaltyvjxktluKidoPizzeriastorage-accessdevice-aspect-ratiorndangela2stytivperiodic-background-syncsab(async()=&gt;{try{cons</code></code></pre><p>There are no delimiters. <code>onmouseenter</code>, <code>voiceURI</code>, <code>_globalProxy</code>, <code>screenTop</code>, <code>getComputedStyle</code>, <code>outerHeight</code>, <code>MediaRecorder</code> and <code>audio/webm;codecs=opus</code> are all in there, and so are <code>khq</code>, <code>jxrkgvdtht</code>, <code>KidoPizzeria</code>, <code>angela2</code> and a revolver emoji. Substring-matching a property name against that soup will find things that aren&#8217;t there. <code>canva</code> appears twice, and it isn&#8217;t the design tool.</p><p>The way to get a defensible answer is to stop searching for substrings and reconstruct structural references instead. The value decoder encodes a string as a triple of a tag, a length and an offset into the table. Scan the integer stream for well-formed triples and you get values the bytecode can genuinely address, not characters that happen to sit next to each other. That scan found 14,734 references resolving to 3,789 distinct values.</p><p>Level A says the letters w-e-b-d-r-i-v-e-r appear somewhere in that soup. Level B says the interpreter holds a reference it can resolve to <code>webdriver</code>. Only the second one is worth writing down.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Two VMs, 86 opcodes and 193</h2><p>The two files run different machines, and this surprised me.</p><p><code>p.js</code> is the straightforward one. It carries a literal array of 86 opcode functions wrapped in a <code>Proxy</code>, and the handler adds a layer of indirection so the opcode number in the bytecode doesn&#8217;t map directly to a slot in the array. The instruction reader is three tokens long:</p>
      <p>
          <a href="https://www.scraping.club/p/deobfuscating-kasada-with-manus-ai">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Scraping Hermès Without a Browser: Hitting the JSON API Behind DataDome]]></title><description><![CDATA[We scraped the entire US Herm&#232;s catalog straight off its JSON API, behind DataDome, with zero browsers: 7,690 products at 37 KB each, for a few euros.]]></description><link>https://www.scraping.club/p/scraping-hermes-without-a-browser</link><guid isPermaLink="false">https://www.scraping.club/p/scraping-hermes-without-a-browser</guid><dc:creator><![CDATA[Patrick van den Bosch]]></dc:creator><pubDate>Tue, 25 Aug 2026 09:33:04 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qLVD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>This is a guest post written by the Hyper Solution team. For an independent benchmark of proxy prices, <a href="https://proxyprice.thewebscraping.club/">visit our Proxy Pricing Benchmark tool</a>.</em></p><div><hr></div><p>We came up in the sneakerbotting world. When you are racing thousands of other bots for a pair of shoes that sells out in four seconds, you do not open a browser. A browser is too slow, too heavy, and gives away too much. You send raw HTTP requests, and you win or lose on a very short list of signals: does your TLS handshake look like Chrome, are your headers in the exact order Chrome sends them, and do you carry a valid antibot token.</p><p>That is the whole game. And it turns out the same three signals are all you need to pull one of the hardest DataDome targets on the web, hermes.com, straight off its own JSON API.</p><p>This post is a showcase of a request-based Herm&#232;s scraper we built and are open-sourcing. No browser, no headless Chrome, no page rendering. We warm one session through DataDome, then hit the <code>bck.hermes.com</code> API directly and get back clean structured JSON. We will walk the flow, share the real numbers from scraping the entire US catalog, and show what it costs versus buying the dataset. Every number here is reproducible with a <a href="https://hypersolutions.co/keys?utm_source=thewebscrapingclub&amp;utm_medium=guest-post&amp;utm_campaign=hermes-scraper">free Hyper Solutions key</a>.</p><blockquote><p>Everything below runs with zero browsers in the loop. The cost scales with kilobytes, not with a browser farm.</p></blockquote><h2>The three signals that actually matter</h2><p>Strip away the folklore and a request-based bot against a modern antibot lives or dies on three things:</p><ol><li><p><strong>TLS fingerprint.</strong> Your ClientHello has to look like a real Chrome, JA3/JA4 and all. We use <code>[bogdanfinn/tls-client](https://github.com/bogdanfinn/tls-client)</code> with a Chrome profile and randomized extension order.</p></li><li><p><strong>Header order.</strong> Not just which headers you send, but the order you send them in, including the HTTP/2 pseudo-header order. Get this wrong and you are flagged before the server reads a single value.</p></li><li><p><strong>A valid antibot token.</strong> For DataDome that means a <code>datadome</code> cookie minted from real sensor data. This is the part you cannot fake by copying headers, and it is exactly what the Hyper Solutions API generates.</p></li></ol><p>We have written before about why <a href="https://docs.hypersolutions.co/request-based-basics/header-order?utm_source=thewebscrapingclub&amp;utm_medium=guest-post&amp;utm_campaign=hermes-scraper">header order is not enough on its own</a> and why <a href="https://docs.hypersolutions.co/request-based-basics/tls-fingerprinting?utm_source=thewebscrapingclub&amp;utm_medium=guest-post&amp;utm_campaign=hermes-scraper">TLS fingerprinting</a> matters. Herm&#232;s is the case study that puts all three together, down to details like the API calls sending each header lowercase over HTTP/2, while DataDome&#8217;s own <code>geo.captcha-delivery.com</code> endpoints run HTTP/1.1 and want Chrome&#8217;s Title-Case names. We matched every request against a real browser capture to get those right.</p><p>Here is the header block for a <code>bck.hermes.com</code> API call, straight from the scraper. The order is declared explicitly, not left to the map:</p><pre><code><code>header := http.Header{
    "sec-ch-ua-platform": {`"Windows"`},
    "x-xsrf-token":       {xsrf}, // minted by /sync-form, see below
    "user-agent":         {UserAgent},
    "accept":             {"application/json, text/plain, */*"},
    "sec-ch-ua":          {ClientHints},
    "origin":             {"https://www.hermes.com"},
    // ... sec-fetch-*, referer, accept-* ...
    http.HeaderOrderKey: {
        "sec-ch-ua-platform", "x-xsrf-token", "user-agent", "accept",
        "sec-ch-ua", /* ... exact Chrome order ... */, "cookie", "priority",
    },
    http.PHeaderOrderKey: {":method", ":authority", ":scheme", ":path"},
}</code></code></pre><h2>Why no browser, and why the API</h2><p>The obvious question from the web scraping side is: why go to this trouble instead of driving a headless browser that handles DataDome for you?</p><p>Bandwidth. A browser loads the whole product page every time (HTML, JavaScript, CSS, fonts, images, and every XHR the page fires), which is megabytes per product, and you pay residential proxy rates on all of it. But here is the thing: that page is just a wrapper around a JSON API. Herm&#232;s&#8217; own frontend fetches product data from <code>bck.hermes.com</code>, and once you hold a warmed session you can call that endpoint directly:</p><pre><code><code>GET https://bck.hermes.com/product?productsku=H100044FPG2&amp;locale=us_en

{ "sku": "H100044FPG2", "title": "Habascule single earring", "price": 445,
  "variants": { "colors": [...], "finishes": [...] },
  "categories_breadcrumbs": [...], "stock": {...}, ... }</code></code></pre><p>That response <strong>is</strong> the structured product object: price, every color and finish variant, breadcrumbs, stock, dimensions, material. No HTML to parse, no rendering, no XHR replay. One small request in, clean JSON out. It weighs about <strong>37 KB</strong>. The equivalent full page render is on the order of a hundred times heavier.</p><h2>Warming the session through DataDome</h2><p>Herm&#232;s puts DataDome in front of everything, so the one thing you cannot skip is the bootstrap. We warm a fresh session once, then reuse it for dozens of API calls:</p><ol><li><p><strong>Load the homepage.</strong> If DataDome challenges it (a <code>403</code> with an inline <code>dd</code> object, or an XHR challenge carrying a <code>geo.captcha-delivery.com</code> device link), we solve it, either <strong>interstitial</strong> or <strong>slider</strong>, through the Hyper Solutions API.</p></li><li><p><strong>Post the tags.</strong> DataDome&#8217;s client tag fires <code>ch</code> then <code>le</code> on a real page load; we do the same to raise the session&#8217;s trust score.</p></li><li><p><strong>Call </strong><code>/sync-form</code><strong>.</strong> This is what mints the <code>x-xsrf-token</code> cookie (and the rest of the ecom session cookies) that every subsequent API call echoes back as a header.</p></li><li><p><strong>Hit the API.</strong> With the session warm, <code>bck.hermes.com/products</code> (category listings) and <code>bck.hermes.com/product</code> (full detail) return JSON directly. The session rotates after a set number of calls so no single <code>datadome</code> cookie is stretched too far.</p></li></ol><p>Session bootstrap and API flow.</p><p>The DataDome solves and the tags posts are the <strong>only</strong> places we hit the Hyper Solutions API. Everything else is plain HTTP. That distinction is the whole cost model: sensor calls are the metered part, and we amortize them across every product a warm session pulls.</p><h2>Finding every product</h2><p>You do not need a sitemap. Herm&#232;s exposes its full category tree at <code>bck.hermes.com/menu</code>, and each category is a paginated listing endpoint:</p><pre><code><code>GET https://bck.hermes.com/products?category=WOMEN&amp;sort=relevance&amp;pagesize=144&amp;locale=us_en</code></code></pre><p>Walk the menu, page through each top-level category, and collect the SKUs. A useful quirk we verified against the live data: <strong>a top-level category already aggregates its entire sub-tree</strong>. Pulling <code>WOMEN</code> returns all 2,785 women&#8217;s products, and every subcategory beneath it adds essentially nothing new. So the whole US catalog is a handful of listing crawls.</p><p>That catalog is <strong>7,690 unique products</strong> for the US. Worth noting, because the products sitemap makes the catalog look like it has on the order of a million URLs, but most of those are not live, purchasable products. The API listing is the real catalog, and it is far smaller than the sitemap suggests.</p><h2>The numbers</h2><p>We scraped the entire US catalog end to end (discover every SKU, then fetch full detail for each) on a modest 8 concurrent sessions. Here is the product-detail run, measured end to end:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qLVD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qLVD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png 424w, https://substackcdn.com/image/fetch/$s_!qLVD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png 848w, https://substackcdn.com/image/fetch/$s_!qLVD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png 1272w, https://substackcdn.com/image/fetch/$s_!qLVD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qLVD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png" width="807" height="303" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:303,&quot;width&quot;:807,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:31560,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://www.scraping.club/i/212056600?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qLVD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png 424w, https://substackcdn.com/image/fetch/$s_!qLVD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png 848w, https://substackcdn.com/image/fetch/$s_!qLVD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png 1272w, https://substackcdn.com/image/fetch/$s_!qLVD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F36c65450-5dac-49c6-ab96-4470fe3fb105_807x303.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Scraping metrics for Hermes USA</figcaption></figure></div><p>Discovering every SKU first (walking the menu and paginating each category) adds only about another minute, ~10 MB, and ~56 sensor calls on top. The scraper prints the derived ratios at the end of the run:</p><ul><li><p><strong>~26,000 products per GB of bandwidth</strong> (37 KB per product).</p></li><li><p><strong>~4,500 products per 1,000 DataDome sensor calls</strong> (0.22 sensor calls per product).</p></li></ul><p>Scrape summary and blog metrics for the US catalog run.</p><p>The sensor calls are dominated by session bootstrapping plus the occasional mid-run challenge; give each session more calls before it rotates, or cleaner proxies, and that ratio improves further.</p><h2>Buy versus build</h2><p>Two inputs set the cost: bandwidth on residential proxies (we quote Bright Data&#8217;s $3.50/GB, though cheaper proxies bring it down) and DataDome sensor data (Hyper Solutions pay-as-you-go at &#8364;3 per 1,000 calls).</p><p><strong>The whole US catalog costs a few euros to scrape.</strong> The ~0.29 GB of bandwidth is about <strong>$1</strong> of proxy, and the ~1,765 sensor calls are about <strong>&#8364;5</strong>. That is the entire purchasable US catalog, refreshed in about twenty minutes on a modest 8 concurrent sessions (~400 SKUs a minute, ~50 per thread per minute).</p><p>Scaled to all of Herm&#232;s&#8217; markets, it grows but stays cheap. Per-market catalogs vary (across 18 markets we measured, Canada was the largest at ~10,000 SKUs, Brazil the smallest at ~3,000, averaging ~7,150), so across the 39 markets the country selector lists that is on the order of <strong>~280,000 records</strong>. Held to the same measured ratios, that is roughly <strong>11 GB of bandwidth (~$37 of proxy)</strong> and <strong>~63,000 sensor calls (~&#8364;190)</strong>.</p><p>Buying the data ready-made is a perfectly reasonable alternative, and for plenty of teams the right one: you are paying for convenience and for someone else maintaining the pipeline. As a reference point, Bright Data&#8217;s self-serve dataset estimator starts at <strong>$500 for up to 200,000 records</strong> ($2.50 per 1,000), with the per-record rate dropping only at much larger volumes.</p><p>The thing to notice is scale. A catalog like Herm&#232;s is small (7,690 US records, a few hundred thousand across every market), so it sits right at the entry of that pricing, well inside the smallest tier. If you already run request-based scrapers, producing the data yourself costs a fraction of the purchase price and gives you a dataset you can re-pull whenever prices or stock move, rather than a one-time snapshot. If you don&#8217;t, buying it may be worth the premium. For a target this size, though, the maths lean toward building.</p><p>One more advantage of going straight to the API is completeness. The <code>/product</code> response hands back the full structured object in a single call: price, every color and finish variant, dimensions, material, stock, breadcrumbs. A page-rendering pipeline has to reconstruct all of that from the DOM, and often misses the parts that never appear as plain text on the page. The scraper writes it verbatim, one raw product per line of JSONL, so nothing is normalized away. Here you get the whole record for free, at a fraction of the bandwidth.</p><p><em>(US figures are measured on a single run; multi-market totals are projected across the 39 markets from those ratios and the per-market catalog sizes we measured across 18 markets, and are illustrative.)</em></p><h2>Try it yourself</h2><p>The scraper is written in Go, uses <code>bogdanfinn/tls-client</code> for the fingerprint and <code>fhttp</code> for header ordering, and calls the Hyper Solutions API only for the DataDome sensor data. It is open source:</p><p><strong><a href="https://github.com/Hyper-Solutions/hermes-scraper">github.com/Hyper-Solutions/hermes-scraper</a></strong></p><p>Two commands: one discovers every category and collects SKUs, the other fetches full product detail and prints the metrics above.</p><pre><code><code>go run ./cmd/skus     -locale us_en -out skus.json
go run ./cmd/products -in skus.json -out products.jsonl</code></code></pre><p>You need two things: a Hyper Solutions API key for the DataDome sensor data (free to start, no credit card), and a sticky residential proxy (request-based scraping still runs on residential IPs). <a href="https://hypersolutions.co/keys?utm_source=thewebscrapingclub&amp;utm_medium=guest-post&amp;utm_campaign=hermes-scraper">Grab a key</a> and point it at any locale.</p><p>Same idea we keep coming back to: figure out the antibot flow once, then run plain requests forever. Herm&#232;s and DataDome are a hard target, but the sneakerbot playbook (real fingerprint, real header order, real token) ports over cleanly. And it does it at a fraction of the bandwidth a browser would burn.</p><p><strong>Want the numbers in your own terminal?</strong> Spin up a <a href="https://hypersolutions.co/keys?utm_source=thewebscrapingclub&amp;utm_medium=guest-post&amp;utm_campaign=hermes-scraper">free Hyper Solutions trial</a>, no credit card, clone <a href="https://github.com/Hyper-Solutions/hermes-scraper">the repo</a>, and run the two commands above against any Herm&#232;s locale. The same API mints the sensor data for <a href="https://hypersolutions.co/products/datadome?utm_source=thewebscrapingclub&amp;utm_medium=guest-post&amp;utm_campaign=hermes-scraper">DataDome</a>, Akamai, Incapsula, and Kasada, so it carries over to whatever request-based target you hit next.</p><div><hr></div><p><em>This showcase uses publicly available product data and is provided for educational purposes only. Figures are from measured runs and multi-market projections, and are illustrative.</em></p>]]></content:encoded></item><item><title><![CDATA[Exploring GoScrapy: A Go Alternative to Python's Scrapy]]></title><description><![CDATA[Scrapy... but for Go? That's exactly what GoScrapy aims to deliver!]]></description><link>https://www.scraping.club/p/goscrapy-go-alternative-scrapy</link><guid isPermaLink="false">https://www.scraping.club/p/goscrapy-go-alternative-scrapy</guid><dc:creator><![CDATA[Antonello Zanini]]></dc:creator><pubDate>Sun, 23 Aug 2026 20:52:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/715f949a-2a92-4e84-a292-e72bdcd1dba9_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There&#8217;s no doubt that Scrapy is one of the most widely used libraries for web scraping. What made it so successful is its unique architecture and structured approach to building web spiders.</p><p>GoScrapy tries to replicate the same philosophy in Go, taking advantage of the language&#8217;s benefits, such as performance, concurrency, and simple deployment.</p><p>In this post, you&#8217;ll learn what GoScrapy is, what it offers, how it works, and how to use it through a complete end-to-end example. Let me present what this Go-based scraping framework brings to the table!</p><h2>What Is GoScrapy?</h2><p><a href="https://github.com/tech-engine/goscrapy">GoScrapy</a> is an open-source web scraping framework for Go inspired by <a href="https://substack.thewebscraping.club/p/create-scrapy-spider-part-1">Python&#8217;s Scrapy architecture</a>.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!eJvH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!eJvH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp 424w, https://substackcdn.com/image/fetch/$s_!eJvH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp 848w, https://substackcdn.com/image/fetch/$s_!eJvH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp 1272w, https://substackcdn.com/image/fetch/$s_!eJvH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!eJvH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp" width="800" height="200" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:200,&quot;width&quot;:800,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;GoScrapy&#8217;s logo&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="GoScrapy&#8217;s logo" title="GoScrapy&#8217;s logo" srcset="https://substackcdn.com/image/fetch/$s_!eJvH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp 424w, https://substackcdn.com/image/fetch/$s_!eJvH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp 848w, https://substackcdn.com/image/fetch/$s_!eJvH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp 1272w, https://substackcdn.com/image/fetch/$s_!eJvH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd4790878-e099-46ed-8658-0c728ea9fcd9_800x200.webp 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><figcaption class="image-caption">GoScrapy&#8217;s logo</figcaption></figure></div><p>The library adopts a batteries-included approach, providing a complete scraping engine with spiders, middlewares, pipelines, automatic retries, cookie management, CSS/XPath selectors, and concurrent request processing.</p><p>At the time of writing, the project has over 350 GitHub stars. It also recently underwent a major architectural revamp focused on improving performance and maintainability, <a href="https://www.reddit.com/r/golang/comments/1smf9a6/goscrapy_revamped_much_more_powerful_than_ever/">as announced by the author on Reddit</a>.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p><div><hr></div></blockquote><h2>Digging into the GoScrapy Scraping Library</h2><p>Let me introduce you to the world of GoScrapy.</p><h3>Why Use GoScrapy for Web Scraping in Go?</h3><p>At first, you might wonder why you would use GoScrapy instead of Scrapy or Playwright, Puppeteer, Axios + Cheerio, or Requests + Beautiful Soup. After all, those are all excellent options, <a href="https://substack.thewebscraping.club/p/which-web-scraping-tool-is-best">if not the industry standard</a>.</p><p>However, there are many situations where Go is a better fit. Go offers excellent performance, lightweight concurrency through goroutines, fast startup times, and simple deployment as a single compiled binary. Similar advantages can also be found when <a href="https://substack.thewebscraping.club/p/how-to-build-a-web-scraper-rust">building web scrapers in Rust</a>.</p><p>Plus, if you&#8217;re already developing in Go, introducing a Python or JavaScript scraping stack means maintaining another language, runtime, and dependency ecosystem.</p><h3>Main Features</h3><p>Some of GoScrapy&#8217;s most notable features include:</p><ul><li><p><strong>Scrapy-inspired architecture</strong>: Brings Python Scrapy&#8217;s proven design to Go, organizing spiders, callbacks, middlewares, and pipelines into a structured, maintainable scraping workflow.</p></li><li><p><strong>High-performance concurrency</strong>: Leverages <a href="https://go.dev/tour/concurrency">Go&#8217;s goroutines and worker pools</a> to process many requests in parallel, enabling fast, scalable web scraping with minimal overhead.</p></li><li><p><strong>CSS and XPath selectors</strong>: Supports chainable CSS and XPath selectors, making it easy to locate elements and extract both text and attribute values.</p></li><li><p><strong>Automatic project scaffolding</strong>: Comes with <em>goscrapy startproject</em> to generate a new project structure with a single CLI command.</p></li><li><p><strong>Built-in middlewares</strong>: Includes retry logic, cookie management, duplicate request filtering, and other middleware components to handle common scraping challenges.</p></li><li><p><strong>Flexible export pipelines</strong>: Export scraped data to CSV, JSON, MongoDB, Google Sheets, Firebase, or custom destinations by configuring reusable pipelines.</p></li><li><p><strong>Signal-driven architecture</strong>: Exposes strongly typed lifecycle events, allowing you to monitor engine activity and hook custom logic.</p></li><li><p><strong>Auto-discovery of spider methods</strong>: Autonomously detects lifecycle methods such as <em>Open()</em>, <em>Close()</em>, and <em>Idle()</em>, reducing boilerplate and simplifying spider implementation.</p></li><li><p><strong>Extensible core</strong>: Lets you replace or customize core components to fit advanced scraping requirements.</p></li></ul><div><hr></div><blockquote><p><strong>S<a href="https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE">tart your scraping journey with Byteful</a></strong>: 10GB New Customer Trial | Use TWSC for 15% OFF | $1.75/GB Residential Data | ISP Proxies in 15+ Countries</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://byteful.com/?promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EOo9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 424w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 848w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1272w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png" width="630" height="69.35779816513761" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:120,&quot;width&quot;:1090,&quot;resizeWidth&quot;:630,&quot;bytes&quot;:133037,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://byteful.com/?promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/194398731?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!EOo9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 424w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 848w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1272w, https://substackcdn.com/image/fetch/$s_!EOo9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2905ffa2-e3cd-4be3-ab69-02cceb4073a9_1090x120.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE&quot;,&quot;text&quot;:&quot;Claim your 10GB here&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://byteful.com?utm_source=twsc&amp;utm_medium=new_banner&amp;utm_id=twsc&amp;promotion_public_id=10GB_TWSC_TRIAL&amp;promotion_code=NJKLBIOCWYENIPFE"><span>Claim your 10GB here</span></a></p></blockquote><div><hr></div><h3>Architecture</h3><p>GoScrapy provides a complete scraping engine with spiders, middlewares, pipelines, retries, cookie management, and concurrent request processing, following the architecture that made Scrapy popular in Python.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!BC0K!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!BC0K!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png 424w, https://substackcdn.com/image/fetch/$s_!BC0K!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png 848w, https://substackcdn.com/image/fetch/$s_!BC0K!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png 1272w, https://substackcdn.com/image/fetch/$s_!BC0K!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!BC0K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png" width="1456" height="352" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:352,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;GoScrapy&#8217;s architecture&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="GoScrapy&#8217;s architecture" title="GoScrapy&#8217;s architecture" srcset="https://substackcdn.com/image/fetch/$s_!BC0K!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png 424w, https://substackcdn.com/image/fetch/$s_!BC0K!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png 848w, https://substackcdn.com/image/fetch/$s_!BC0K!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png 1272w, https://substackcdn.com/image/fetch/$s_!BC0K!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F75e05e51-32c8-48b9-9e8b-9671f2f825fe_2535x612.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">GoScrapy&#8217;s architecture</figcaption></figure></div><p>Under the hood, GoScrapy uses a modular, event-driven design where components communicate through a central signal bus. This decouples the engine from individual components, enabling you to monitor activity or add custom logic at different stages of the scraping lifecycle.</p><p>Signals are triggered for important events, such as engine startup and shutdown, spider lifecycle changes, request scheduling, response handling, and item processing. <a href="https://github.com/tech-engine/goscrapy#signals">Discover all available signals</a>.</p><h3>Declarative Mapping via Gosm</h3><p>One of GoScrapy&#8217;s most interesting aspects is <em><a href="https://github.com/tech-engine/goscrapy#declarative-mapping-gosm">Gosm</a></em>, a declarative mapping engine that eliminates much of the repetitive extraction code usually required in web scraping.</p><p>Gosm lets you describe both your data model and extraction logic directly in Go structs through tags, removing the need to manually handle selectors and value assignments. In particular, it supports CSS selectors, XPath, JSON paths, and attribute extraction.</p><p>Once the model is defined, GoScrapy exposes the <em>gosm.Map()</em> utility to automatically populate the struct of the custom type with the extracted data.</p><p>For example, you could define a model for a book like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;go&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-go">type Book struct {
    Title  string `gos_css:".title"`
    Author string `gos_css:".author"`
    Cover  string `gos_css:"img@src"`
    URL    string `gos_css:".book-link@href"`
}</code></pre></div><p>Note how, thanks to Gosm, each struct field is mapped to a specific element on the target page. For example, <em>Title</em> extracts the text inside the <em>.title</em> element, while <em>Cover</em> and <em>URL</em> retrieve values from the <em>src</em> and <em>href</em> attributes using the <em>@attribute</em> syntax.</p><p>Inside your spider parsing logic, you can then map the response into the struct with a couple of lines:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;go&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-go">func (s *Spider) parse(ctx context.Context, resp core.IResponseReader) {
    // Gosm automatically fills the struct using the selectors defined in the tags
    var book Book
    gosm.Map(resp, &amp;book)

    s.Yield(&amp;book)
}</code></pre></div><p>By separating the data model from the scraping workflow, Gosm keeps spiders cleaner.</p><h3>GoScrapy in Action: A Complete Example</h3><p>In this step-by-step section, I&#8217;ll guide you through scraping <em><a href="https://www.scrapingcourse.com/ecommerce/">ScrapingCourse.com&#8217;s E-commerce page</a></em> with GoScrapy:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!YOde!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!YOde!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png 424w, https://substackcdn.com/image/fetch/$s_!YOde!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png 848w, https://substackcdn.com/image/fetch/$s_!YOde!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png 1272w, https://substackcdn.com/image/fetch/$s_!YOde!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!YOde!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png" width="1456" height="784" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ebf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:784,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The target site&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The target site" title="The target site" srcset="https://substackcdn.com/image/fetch/$s_!YOde!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png 424w, https://substackcdn.com/image/fetch/$s_!YOde!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png 848w, https://substackcdn.com/image/fetch/$s_!YOde!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png 1272w, https://substackcdn.com/image/fetch/$s_!YOde!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Febf6dcae-d12f-4dd5-8007-eb61059fe87e_3020x1626.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The target site</figcaption></figure></div><p>The goal is to build a GoScrapy script that extracts all product data from the target site&#8217;s product listings, navigating through all pagination pages.</p><h3>Prerequisites</h3><p>For simplicity, I&#8217;ll assume you have <a href="https://go.dev/doc/install">Go 1.26 or later installed locally</a>.</p><h3>Step #1: Install GoScrapy and Set Up Your Project</h3><p>Start by installing the GoScrapy CLI:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">go install github.com/tech-engine/goscrapy/cmd/...@latest</code></pre></div><p>Verify that the installation completed successfully:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">goscrapy -v</code></pre></div><p>You should see output similar to:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">goscrapy version 0.15.4</code></pre></div><p>Next, navigate to your project&#8217;s root directory and create a new GoScrapy project:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">goscrapy startproject ecommerce_scraper</code></pre></div><p>This command initializes a new Go module and generates all the required project files. It&#8217;ll also prompt you to install the project&#8217;s dependencies (<em>go mod tidy</em>). Type &#8220;Y&#8221; and press Enter to continue:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!3qPc!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!3qPc!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png 424w, https://substackcdn.com/image/fetch/$s_!3qPc!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png 848w, https://substackcdn.com/image/fetch/$s_!3qPc!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png 1272w, https://substackcdn.com/image/fetch/$s_!3qPc!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!3qPc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png" width="1456" height="407" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:407,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The output of the GoScrapy project generation command&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The output of the GoScrapy project generation command" title="The output of the GoScrapy project generation command" srcset="https://substackcdn.com/image/fetch/$s_!3qPc!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png 424w, https://substackcdn.com/image/fetch/$s_!3qPc!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png 848w, https://substackcdn.com/image/fetch/$s_!3qPc!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png 1272w, https://substackcdn.com/image/fetch/$s_!3qPc!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb1b291c6-d486-4e58-b524-09f437972f7e_2024x566.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The output of the GoScrapy project generation command</figcaption></figure></div><p>For manual dependency installation, run:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">go mod tidy</code></pre></div><p>Your project directory should now look like this:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">your-goscrapy-project-folder/
&#9500;&#9472;&#9472; go.mod
&#9500;&#9472;&#9472; go.sum
&#9500;&#9472;&#9472; main.go
&#9492;&#9472;&#9472; ecommerce_scraper/
    &#9500;&#9472;&#9472; pipelines/
    &#9500;&#9472;&#9472; base.go
    &#9500;&#9472;&#9472; constants.go
    &#9500;&#9472;&#9472; errors.go
    &#9500;&#9472;&#9472; job.go
    &#9500;&#9472;&#9472; record.go
    &#9500;&#9472;&#9472; settings.go
    &#9492;&#9472;&#9472; spider.go</code></pre></div><p>Well done! You&#8217;ll notice that the GoScrapy project structure closely resembles that of Python&#8217;s Scrapy. In particular:</p><ul><li><p><em><span>spider.go</span></em> is where you&#8217;ll implement your scraping logic.</p></li><li><p><em><span>record.go</span></em> defines the data structure for the scraped items and controls how extracted data is exported.</p></li><li><p><em><span>settings.go</span></em> contains the project&#8217;s configuration, allowing you to customize how the scraper runs.</p></li></ul><p>For more details on the main GoScrapy files, <a href="https://github.com/tech-engine/goscrapy#quick-look-powerful-features">refer to the docs</a>.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h3>Step #2: Get Familiar with the Target Site</h3><p>Open the target scraping site in your browser and start exploring its structure. You&#8217;ll notice that products are stored inside <em>li[data-products=&#8217;item&#8217;]</em> elements:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!P2HZ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!P2HZ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png 424w, https://substackcdn.com/image/fetch/$s_!P2HZ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png 848w, https://substackcdn.com/image/fetch/$s_!P2HZ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png 1272w, https://substackcdn.com/image/fetch/$s_!P2HZ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!P2HZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png" width="1456" height="732" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:732,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The DOM structure of the product listing section on the target site&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The DOM structure of the product listing section on the target site" title="The DOM structure of the product listing section on the target site" srcset="https://substackcdn.com/image/fetch/$s_!P2HZ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png 424w, https://substackcdn.com/image/fetch/$s_!P2HZ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png 848w, https://substackcdn.com/image/fetch/$s_!P2HZ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png 1272w, https://substackcdn.com/image/fetch/$s_!P2HZ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2aa4a40e-de3b-4ffc-b6ae-ee3a4a5e5e71_2418x1216.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The DOM structure of the product listing section on the target site</figcaption></figure></div><p>In detail, each product contains the following information:</p><ul><li><p><strong>Name</strong>: Stored in the <em>.product-name</em> element.</p></li><li><p><strong>URL</strong>: Available in the <em>href</em> attribute of the <em>.woocommerce-loop-product__link</em> element.</p></li><li><p><strong>Image</strong>: Available in the <em>src</em> attribute of the img element.</p></li><li><p><strong>Price</strong>: Stored in the <em>.price</em> element.</p></li><li><p><strong>Availability</strong>: Stored in the <em>class</em> attribute of the product element itself. The availability status can be determined by checking for the presence of the &#8220;instock&#8221; or &#8220;outofstock&#8221; class.</p></li></ul><p>Additionally, each page (except the last one) contains a link to the next page inside the <em>nav#pagination a.next</em> element. By following this link, you can sequentially scrape all product listing pages.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tU0Q!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tU0Q!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png 424w, https://substackcdn.com/image/fetch/$s_!tU0Q!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png 848w, https://substackcdn.com/image/fetch/$s_!tU0Q!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!tU0Q!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tU0Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png" width="1456" height="934" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:934,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the nav#pagination a.next element to move to the next pagination page&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the nav#pagination a.next element to move to the next pagination page" title="Note the nav#pagination a.next element to move to the next pagination page" srcset="https://substackcdn.com/image/fetch/$s_!tU0Q!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png 424w, https://substackcdn.com/image/fetch/$s_!tU0Q!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png 848w, https://substackcdn.com/image/fetch/$s_!tU0Q!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png 1272w, https://substackcdn.com/image/fetch/$s_!tU0Q!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0649dae9-eb27-4293-b852-91bf88e5a69e_2130x1366.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note the nav#pagination a.next element to move to the next pagination page</figcaption></figure></div><p>Now that you understand the target HTML structure, you&#8217;re ready to define the data models that GoScrapy will use to extract and store the scraped data!</p><h3>Step #3: Define the Gosm Logic</h3><p>Make sure that <em>record.go</em> contains the following:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;go&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-go">type Record struct {
        J            *Job   `json:"-" csv:"-"`
        Name         string `json:"name" csv:"name"`
        URL          string `json:"url" csv:"url"`
        Image        string `json:"image" csv:"image"`
        Price        string `json:"price" csv:"price"`
        Availability string `json:"availability" csv:"availability"`
}

type Listing struct {
        ProductNames  []string `gos_css:"li[data-products='item'] .product-name"`
        ProductURLs   []string `gos_css:"li[data-products='item'] .woocommerce-loop-product__link@href"`
        ProductImages []string `gos_css:"li[data-products='item'] img@src"`
        ProductPrices []string `gos_css:"li[data-products='item'] .price"`
        ProductClass  []string `gos_css:"li[data-products='item']@class"`
        NextPage      string   `gos_css:"nav#pagination a.next@href"`
}</code></pre></div><p>The <em>Record</em> struct defines the final output of the scraper. Each instance represents a single product and contains the fields that will be exported by the pipeline.</p><p>On the other hand, the <em>Listing</em> struct describes the data available on each product listing page. Notice that product-related fields are stored as arrays (<em>[]string</em>). The reason is that GoScrapy&#8217;s scraping approach focuses on extracting each field from all matching elements rather than mapping each product element individually. This pattern isn&#8217;t unique to GoScrapy, and other libraries like <em>rvest</em> in R follow a similar mechanism.</p><p>As a result, Gosm collects all product names, URLs, images, prices, and classes separately, allowing you to combine them later. Fantastic!</p><h3>Step #4: Define the Scraping Logic</h3><p>The data models with Gosm mappings are ready, so you can implement the spider logic to extract products, process the data, and follow pagination. To do so, make sure that your <em>spider.go</em> file contains:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;go&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-go">package ecommerce_scraper

import (
    "context"
    "strings"

    "github.com/tech-engine/goscrapy/pkg/builtin/gosm"
    "github.com/tech-engine/goscrapy/pkg/core"
)


func(s * Spider) Open(ctx context.Context) {
    req: = s.Request(ctx)

        req.Url(
        "https://www.scrapingcourse.com/ecommerce",
    )

        s.Parse(
        req,
        s.parseListing,
    )
}

func(s * Spider) parseListing(
    ctx context.Context,
    resp core.IResponseReader,
) {

    var listing Listing

    _ = gosm.Map(resp, &amp; listing)

    for i: = range listing.ProductNames {
        availability: = "unknown"

            if strings.Contains(listing.ProductClass[i], "instock") {
            availability = "instock"
        } else if strings.Contains(listing.ProductClass[i], "outofstock") {
            availability = "outofstock"
        }

        s.Yield( &amp; Record {
            Name: listing.ProductNames[i],
            URL: listing.ProductURLs[i],
            Image: listing.ProductImages[i],
            Price: listing.ProductPrices[i],
            Availability: availability,
        })
    }

    if listing.NextPage != "" {
        s.Logger().Info("Following next page:", listing.NextPage)

        s.Parse(
            s.Request(ctx).Url(listing.NextPage),
            s.parseListing,
        )
    }
}</code></pre></div><p>This GoScrapy spider implements this parsing flow:</p><ol><li><p><strong>Extract all product fields from the page in a single mapping operation</strong>:<strong> </strong>The <em>gosm.Map()</em> function applies the CSS selectors defined in <em>Listing</em> and populates the corresponding fields with all matching values.</p></li><li><p><strong>Combine extracted fields into individual product records</strong>: Since Gosm extracts product fields as separate arrays, the <em>for</em> loop iterates over them by index. Values with the same index belong to the same product, helping you create a complete <em>Record</em> object.</p></li><li><p><strong>Apply additional processing before yielding records</strong>: Some fields require custom logic before being exported. In this example, availability cannot be extracted directly because it&#8217;s stored as a class value on the product HTML element. The scraper checks whether the class contains &#8220;instock&#8221; or &#8220;outofstock&#8221; and converts it into a dedicated <em>Availability</em> field.</p></li><li><p><strong>Take care of the pagination logic</strong>: The scraper checks whether a next page exists. If <em>NextPage</em> contains a URL, it creates a new request and recursively calls <em>parseListing()</em> to continue scraping until all product pages have been processed.</p></li></ol><p>The above spider extracts products across multiple pages and sends each completed <em>Record</em> to the pipeline. Wonderful!</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h3>Step #5: Define the Export Logic</h3><p>By default, a GoScrapy project is configured to export scraped data to an <em>itstimeitsnowornever.csv </em>file. This behavior is controlled through the configuration defined in <em>settings.go</em>.</p><p>To export the scraped product data to a <em>products.csv</em> file, make sure that <span>settings.go</span> contains:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;go&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-go">var export2CSV = csv.New[*Record](csv.Options{
    Filename: "products.csv",
})</code></pre></div><h3>Step #6: Run the Scraper</h3><p>Launch the GoScrapy project with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">go run .</code></pre></div><p>You should see output similar to the following:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Scm4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Scm4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png 424w, https://substackcdn.com/image/fetch/$s_!Scm4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png 848w, https://substackcdn.com/image/fetch/$s_!Scm4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png 1272w, https://substackcdn.com/image/fetch/$s_!Scm4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Scm4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png" width="1456" height="653" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fe713efc-8aed-4e41-9808-b38988465b48_1914x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:653,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The output produced by the &#8220;go run .&#8221; command&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The output produced by the &#8220;go run .&#8221; command" title="The output produced by the &#8220;go run .&#8221; command" srcset="https://substackcdn.com/image/fetch/$s_!Scm4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png 424w, https://substackcdn.com/image/fetch/$s_!Scm4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png 848w, https://substackcdn.com/image/fetch/$s_!Scm4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png 1272w, https://substackcdn.com/image/fetch/$s_!Scm4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffe713efc-8aed-4e41-9808-b38988465b48_1914x858.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The output produced by the &#8220;go run .&#8221; command</figcaption></figure></div><p>Once the scraper finishes, a <em>products.csv</em> file will be created in the project folder. Open the file, and you&#8217;ll see the extracted product data:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!O6sA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!O6sA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png 424w, https://substackcdn.com/image/fetch/$s_!O6sA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png 848w, https://substackcdn.com/image/fetch/$s_!O6sA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png 1272w, https://substackcdn.com/image/fetch/$s_!O6sA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!O6sA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png" width="1456" height="617" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:617,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the scraped products in produc&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the scraped products in produc" title="Note the scraped products in produc" srcset="https://substackcdn.com/image/fetch/$s_!O6sA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png 424w, https://substackcdn.com/image/fetch/$s_!O6sA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png 848w, https://substackcdn.com/image/fetch/$s_!O6sA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png 1272w, https://substackcdn.com/image/fetch/$s_!O6sA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff3ce08b8-61a3-42ed-a176-06ce1a5e93b6_2940x1246.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note the scraped products in products.csv</figcaption></figure></div><p>The produced CSV file contains the information extracted from all 190 products spread across multiple listing pages. Mission complete!</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Final Comment</h2><p>Considering my experience with web scraping in Go, I can say that GoScrapy is definitely one of the most promising libraries in the ecosystem. The fact that it recreates Scrapy&#8217;s architecture significantly lowers the learning curve, especially if you&#8217;re already familiar with Scrapy&#8217;s project structure, workflows, and core concepts.</p><p>I found the library fast, and the Gosm mechanism was impressively interesting. At the same time, it&#8217;s important to note that the community around the project is relatively small, making it harder to find examples, tutorials, and external resources. Also, most LLMs have limited (or no) knowledge of the framework, and there&#8217;s no real official documentation.</p><p>That said, the <a href="https://github.com/tech-engine/goscrapy/tree/main/_examples">examples available in the GoScrapy repository</a> are enough to build a basic understanding of how the framework works. If you&#8217;re already comfortable with Go and have experience building spiders with Scrapy, you should be able to create a functional scraper within a few hours.</p><p>Overall, GoScrapy is a project worth keeping an eye on, particularly for Go enthusiasts!</p><p>I hope you found this guide useful. If you have any questions or comments, feel free to leave them below. Thanks for reading, and see you in the next one!<br></p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/goscrapy-go-alternative-scrapy?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Web Scraping Club! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/goscrapy-go-alternative-scrapy?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/goscrapy-go-alternative-scrapy?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div><hr></div><h2>FAQ</h2><h3>How to set a proxy in GoScrapy?</h3><p>GoScrapy supports proxy configuration through the <em>PROXY_LIST</em> setting in <em>settings.go</em>. Define your proxy URLs as a comma-separated list:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">const PROXY_LIST = "http://user:pass@host:port,http://host:port"</code></pre></div><p>Then, enable the setting in the <em>init()</em> function:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">"PROXY_LIST": PROXY_LIST,</code></pre></div><p>GoScrapy will use the configured proxies for outgoing requests. You can provide multiple proxies to distribute requests and improve reliability <a href="https://substack.thewebscraping.club/p/optimizing-proxy-costs">when scraping at scale</a>.</p><h3>Is GoScrapy&#8217;s API stable?</h3><p>As of this writing (July 15, 2026), not yet. GoScrapy is currently in active v0.x development, and its Core API is still evolving toward a stable v1.0 release. While it&#8217;s already fully usable today, you should expect occasional breaking changes as the project continues to mature.</p><h3>Why is GoScrapy licensed under the Business Source License (BSL)?</h3><p>The BSL is designed to support the long-term sustainability of GoScrapy. You can use it freely in production, build commercial applications with it, and scrape data for your business. The main restriction is that you can&#8217;t repackage or offer GoScrapy itself as a competing managed scraping service or commercial fork.</p>]]></content:encoded></item><item><title><![CDATA[THE LAB #113: Obscura browser against Akamai]]></title><description><![CDATA[A 30MB browser and a Radisson deal finder during Oktoberfest]]></description><link>https://www.scraping.club/p/obscura-browser-against-akamai</link><guid isPermaLink="false">https://www.scraping.club/p/obscura-browser-against-akamai</guid><dc:creator><![CDATA[Pierluigi Vinciguerra]]></dc:creator><pubDate>Thu, 20 Aug 2026 03:00:54 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/bed84518-69c1-419d-9408-b5ee225b13bc_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every few weeks a new headless browser lands on GitHub promising the same thing: a clean fingerprint, a tiny footprint, and anti-bot bypasses for free. Most of them are patched Chromium or patched Firefox. </p><p><a href="https://github.com/h4ckf0r0day/obscura">Obscura</a> is not. It is a browser engine written from scratch in Rust that embeds V8 for JavaScript, ships no Chromium and no Node.js, and claims to run in about 30 MB of RAM. I already put its fingerprint on the bench once, in <a href="https://substack.thewebscraping.club/p/open-source-browser-automation-stealth-benchmark">THE LAB #111</a>, where it scored well in a controlled probe. A lab score is one thing. What I wanted this time was to point it at a real anti-bot on a real site and see what a featherweight engine actually buys you.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p></blockquote><blockquote><div><hr></div></blockquote><p>The site is Radisson. Their booking pages hide an availability API that returns every room rate for a hotel and date range, and that API sits behind Akamai Bot Manager. If you can talk to it, you can do something useful with it. You can track a single hotel&#8217;s nightly price over the next few months and find the cheapest and most expensive days to go. I picked Munich, because Oktoberfest 2026 runs from September 19 to October 4, and nothing moves a city&#8217;s hotel prices like a festival that pulls millions of visitors into one place.</p><p>So there are two questions stacked on top of each other. Can Obscura clear Akamai at all? And if it can, is a 30 MB engine a sensible way to mint the session that a fast HTTP client then reuses? That second pattern is not new. In <a href="https://substack.thewebscraping.club/p/hybrid-scraping-camoufox-curl-cffi">THE LAB #100</a> I built exactly this hybrid, one browser login feeding thousands of curl_cffi requests, but with Camoufox, a real Firefox. So this is really a hands-on review of Obscura for one concrete job. Can the cheap engine take Camoufox&#8217;s place, and where it cannot, is that the tool&#8217;s fault or the target&#8217;s? That second question turned out to be the interesting one.</p><h2>The tools on the table</h2><p>Three pieces do the work.</p><p><a href="https://github.com/h4ckf0r0day/obscura">Obscura</a> is the from-scratch Rust engine. Because it implements its own DOM and Web APIs around V8 rather than shipping a real browser, it is small and fast, and that same design is the source of its quirks. It exposes a Chrome DevTools Protocol server, so we can drive it with Playwright over <code>connect_over_cdp</code> exactly like a headless Chrome. Its <code>--stealth</code> flag turns on a consistent spoofed fingerprint, which is the feature under test.</p><p><a href="https://github.com/yifeikong/curl_cffi">curl_cffi</a> is the replay layer. It is a Python HTTP client that impersonates a real browser&#8217;s TLS fingerprint (JA3/JA4, HTTP/2 settings, header order) without running a browser at all. When TLS fingerprinting is the wall, it walks through it in milliseconds. When JavaScript execution is the wall, it cannot help. Knowing which wall is which is most of the job.</p><p>The third piece is the fingerprint bench from #111, which reads a browser&#8217;s own fingerprint surface from a local probe page and scores it out of 100. I reused it here to get a fresh, reproducible number for Obscura before sending it into the fight.</p><p>Two more browsers turn up later as controls, both from that same bench and both scoring a clean 100. <a href="https://github.com/CloakHQ/CloakBrowser">CloakBrowser</a> is a Chromium patched at the C++ level, and <a href="https://github.com/daijro/camoufox">Camoufox</a> is a Firefox fork with a coherent injected fingerprint. I ran the same proxy test through them to separate a tool problem from a proxy problem, and all three browsers gave the identical result.</p><h2>How Radisson is actually protected</h2><p>Before running anything, it pays to model the target. Radisson does not protect everything the same way, and the whole strategy depends on that split.</p><p>The HTML pages, like the room-display page you land on after picking a hotel and dates, come back fine to a good TLS impersonation. A plain <code>curl</code> gets nothing, HTTP 000, because its TLS handshake does not look like a browser. curl_cffi with a Chrome profile gets HTTP 200 and 380 KB of real HTML. So the first tier is TLS fingerprinting, and curl_cffi alone handles it.</p><p>The XHR APIs are a different story. Two matter here. <code>content-api/hotels/{code}/rooms</code> returns a hotel&#8217;s bookable rooms, and <code>availability-api/stays-by-rooms</code> returns the rates for a set of rooms on given dates. Both sit behind Akamai Bot Manager. A request with no cookies gets HTTP 403 with a 421-byte body. Akamai wants its cookie set first: <code>_abck</code>, <code>bm_sz</code>, <code>ak_bmsc</code>, <code>bm_sv</code>, <code>bm_so</code>, <code>bm_s</code>. Those cookies are minted by the Akamai sensor script, a chunk of obfuscated JavaScript that runs on page load, collects a pile of signals, and posts them back. Only after that handshake does <code>_abck</code> reach a validated state and the API start answering.</p><p>There is a third layer that shows up when you push too hard. Load the wrong path, or hit the site too often from one address, and Akamai serves a small interstitial instead of the page. It is the <code>sec-cpt</code> behavioral challenge, with a <code>sec-if-cpt-container</code> div and a friendly &#8220;Powered and protected by Akamai&#8221; line. That page runs its own script and expects the client to solve it before moving on.</p><p>So the layer we target is clear. curl_cffi covers the TLS tier and the raw HTTP replay. The one thing it cannot do is run the Akamai sensor to mint <code>_abck</code>. That is the job we hand to Obscura, and it is the exact point where a from-scratch engine either earns its place or does not.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h2>Testing the fingerprint first</h2><p>There is no reason to send a browser at Akamai if its fingerprint falls over on the easy tests, so I scored it first.</p><p>We ran Obscura 0.1.10 headless with <code>--stealth</code>, driven through Playwright over CDP, against the #111 local probe and then against the public test pages people actually cite. The probe reads the browser&#8217;s own surface, and here Obscura looks the part. <code>navigator.webdriver</code> is false, on both the prototype and the instance. The user agent is <code>Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/145.0.0.0 Safari/537.36</code>, a plausible Windows Chrome with no <code>HeadlessChrome</code> token. <code>window.chrome</code> is complete, with <code>runtime</code>, <code>csi</code>, <code>loadTimes</code>, and <code>app</code> all present. <code>navigator.userAgentData</code> reports Chrome 145 and Chromium 145. The WebGL unmasked renderer is a spoofed <code>ANGLE (NVIDIA, NVIDIA GeForce RTX 30...)</code>. There are five plugins, a Europe/Berlin timezone, and no automation residue at all: no leaked CDP globals, no driver keys.</p><p>The score came out at 94 out of 100. That puts Obscura above every Chromium CDP tool in the bench, which sit at 70 because their user agent still carries a headless token, and well above vanilla Playwright and Selenium at 35. The one thing that costs it points is the native-code check. When you ask whether a Web API function is really native by inspecting its <code>toString</code>, a few of Obscura&#8217;s functions give themselves away as patched. That is the single tell, and the bench labels it &#8220;patched fns&#8221;.</p><p>The public suites are where it gets more interesting, and more honest. On <a href="https://bot.sannysoft.com/">Sannysoft</a>, Obscura passes cleanly, 21 checks green and none red. But CreepJS never finishes. The page loads to about 8 KB and then stops, with no trust score ever computed. Pixelscan renders its landing chrome but never produces an automation verdict. iphey renders too, but the verdict banner it normally paints, trustworthy or suspicious, never populates. The two oracles from #111, BrowserScan and deviceandbrowserinfo, were inconclusive for the same reason. browserleaks is the exception that proves the point: its canvas and WebGL pages are light enough that Obscura runs them, and the WebGL page confirms the same spoofed NVIDIA GPU the probe reported.</p><p>The split is the interesting part. Obscura sails through the boolean checks, the ones that ask a single yes-or-no question about a property. It stalls on the heavy suites, the ones that run thousands of lines of fingerprinting JavaScript to completion. Those suites cannot flag it, but only because they never finish running inside the minimal engine. Hold that thought, because Akamai&#8217;s sensor is exactly that kind of heavy script.</p><h2>Building the hybrid, Obscura mints and curl_cffi replays</h2><p>The plan follows #100. Use the browser only to mint a valid Akamai session, then hand the cookies to curl_cffi and let it hammer the availability API for every date we care about. The code lives in <a href="https://github.com/TheWebScrapingClub/thelab">our repository</a> under <code>obscura_radisson_deals</code>.</p><p>The session layer is <code>session.py</code>. It launches Obscura as a CDP server with <code>--stealth</code>, connects Playwright, and loads the room-display page for the target hotel. Then it harvests the cookies and checks them by calling the content-api rooms endpoint. If that call returns 200, the session is good and we also get the room ids we need for scanning. If not, it reloads the page and tries again. This retry loop is not decoration. It is there because of what we found next.</p><pre><code><code>def mint(self, attempts=6, settle_s=8.0):
    for attempt in range(attempts):
        if attempt == 0:
            self._page.goto(self.page_url, wait_until="load", timeout=45000)
        else:
            self._page.reload(wait_until="load", timeout=45000)
        time.sleep(settle_s)
        self.cookies = self._harvest()
        probe = resolve_rooms(self.cookies, self.hotel_code, self.currency, self.proxy)
        if probe["ok"]:
            self.room_ids = probe["room_ids"]
            return True
    return False</code></code></pre><p>From a clean residential IP it works, and it works fast. On a good load, with <code>bm_sv</code> and <code>bm_mi</code> present in the jar, we took the harvested cookies straight to curl_cffi with a Chrome 131 TLS profile. The <code>availability-api/stays-by-rooms</code> endpoint answered HTTP 200 with hundreds of kilobytes of real rate JSON. Against the Munich airport hotel the first load minted a valid session and resolved its rooms on attempt zero. That is the whole thesis in one response. The 30 MB engine minted a session a fast HTTP client could reuse.</p><p>It is not always the first load. Sometimes the handshake does not complete, <code>_abck</code> stays in its unsolved state with a <code>-1</code> in the second segment, and the API answers 403. Obscura harvests nine cookies on those loads too, but without <code>bm_sv</code> and <code>bm_mi</code> the session is not valid, so <code>mint()</code> reloads until one lands. On a trusted IP a reload or two is enough. The reason it can miss at all is the same trait we saw on CreepJS: the minimal engine runs the Akamai sensor part of the way and then not. Camoufox, a real Firefox, does not have that wobble.</p><p>There is a second signal worth recording. When we called the API from inside Obscura&#8217;s own page context instead of replaying externally, it did not return 403. It returned 500, an application error, which means the request cleared the Akamai wall and reached the backend. A 500 is not a bot block. So the in-browser path can get through too. It just needs the request shaped exactly the way the site&#8217;s own code shapes it, and on the room-display page the SPA kept navigating and tearing down our injected fetch before it settled.<br><br>You can find the full code used in this article <span>in&nbsp;</span><a href="https://github.com/TheWebScrapingClub/thelab"><span>The Lab repository</span></a><span>, available only to paying readers, in the folder &#8220;113</span>.Obscura&#8221;.</p><h2>The wall is the IP, not the fingerprint</h2>
      <p>
          <a href="https://www.scraping.club/p/obscura-browser-against-akamai">
              Read more
          </a>
      </p>
   ]]></content:encoded></item><item><title><![CDATA[Four years of The Web Scraping Club]]></title><description><![CDATA[On August 2022 The Web Scraping Club born. 4 years later the industry looks another world.]]></description><link>https://www.scraping.club/p/four-years-of-the-web-scraping-club</link><guid isPermaLink="false">https://www.scraping.club/p/four-years-of-the-web-scraping-club</guid><dc:creator><![CDATA[Pierluigi Vinciguerra]]></dc:creator><pubDate>Sun, 16 Aug 2026 03:00:07 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/ddf9ff82-be05-46ce-9283-4d5eb5484c19_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>August 2022. Inside a hotel room in Tuscany, quite bored because of the rain, I started a project that I had been thinking about for some time. A blog about web scraping. </p><p>Never imagined that someone would have read it. It was just an excuse for writing down my scraping notes in a more structured way. </p><p>Four years later, both TWSC and the industry look very different. </p><div><hr></div><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p><div><hr></div></blockquote><h2>Health of The Web Scraping Club</h2><p>First of all, thank you.</p><p>Thank you to all the readers who think I&#8217;m saying something interesting enough to be subscribed to. </p><p>In this era, when we&#8217;re all fighting for attention, having 7,000+ people who choose to receive this newsletter and open it every week seems like a miracle. <br></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!T5D5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!T5D5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png 424w, https://substackcdn.com/image/fetch/$s_!T5D5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png 848w, https://substackcdn.com/image/fetch/$s_!T5D5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png 1272w, https://substackcdn.com/image/fetch/$s_!T5D5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!T5D5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png" width="895" height="529" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:529,&quot;width&quot;:895,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:109943,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/211300990?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!T5D5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png 424w, https://substackcdn.com/image/fetch/$s_!T5D5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png 848w, https://substackcdn.com/image/fetch/$s_!T5D5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png 1272w, https://substackcdn.com/image/fetch/$s_!T5D5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc739ecf0-a695-4289-be26-af6ed5e76c52_895x529.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>This is despite no marketing efforts, 0 ads, and an issue with Google SEO that made the whole domain disappear from the results from one day to the next. </p><p>In the next few days, to solve this issue, there will be a new domain address that, according to my experiments, should fix this. </p><p>Let me also thank you, all the backers, paying readers, and companies that make this possible.</p><p>While still very lean, The Web Scraping Club in its current format could not run without sponsors and readers who choose to support it. And about the companies backing TWSC, let me spend a special word on the NetNut team, who are having a hard time now. I&#8217;ve met great people there, and they were among the first believers in this newsletter. </p><p>Behind the scenes, TWSC is far from perfect, but I&#8217;m doing my best to keep things running smoothly. <br>I&#8217;ve just launched a partner portal, where sponsors can monitor their campaign. For the readers, this year we&#8217;ve released the new version of the <a href="https://proxyprice.thewebscraping.club/">Proxy Price benchmark tool</a>, which I promise will be updated more often in the future. <span>Also, the&nbsp;</span><a href="https://github.com/TheWebScrapingClub/scraping-wiki"><span>Scraping Wiki</span></a><span>, our repo with all the findings of The Web Scraping Club organized as a second brain, is a recent new entry.</span> Please give it a look and share your feedback.</p><h3>What&#8217;s next</h3><p>Apart from fixing the Google SEO issue in the immediate term, I&#8217;ve got a couple of ideas that still need time to be implemented, but hopefully they&#8217;ll see the light before the end of the year.<br>Something I&#8217;ve been asked for a long time is a Job Board dedicated to open scraping positions and the great talent to fill them. <br>Is this something you&#8217;d like to have here?<br><br>Ideally, I&#8217;d like to revamp the YouTube channel. And last but not least, I&#8217;m working on a web-scraping event in Italy in October. More details soon, but be ready for it!</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h3>How the industry changed</h3><p>The industry over the last four years looks very different. </p><p>We got LLMs; we know it, so the coding part is way faster. But what they brought to the industry is the legitimacy of web scraping. </p><p>It seems the world has recognized the role of web data and browser automation in innovation. While web data was once seen as something shady for spying on your competitors, it is now the main moat for training LLMs, and browser automation is the key tool for giving your agents real-time data.</p><p>This changed the perception of the industry as a whole, and the recent funding rounds (Nimble, Oxylabs) are the proof. </p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><p>Think about it: have you ever heard of a funding round for a proxy company before 2023?</p><h2>Conclusion</h2><p><span>It&#8217;s an exciting time for the industry, and I&#8217;m glad to work at The Web Scraping Club right now. I&#8217;ll be at conferences around Europe (</span><a href="https://oxylabs.io/oxycon">Oxycon in September</a><span>&nbsp;and&nbsp;</span><a href="https://www.extractsummit.io/"><span>the Extract Summit in Dublin</span></a><span>), which will allow me to meet great professionals and learn about</span> the latest trends. </p><p>While both TWSC and the industry have changed a lot over the years, the spirit of this newsletter hasn't: no marketing fluff, honest reviews, some hot takes, and my personal opinions. I know that in four years, not all articles can be a 10 out of 10, but I can assure you that every article written here was the result of sweat and hard work. And it will be the same for the future.</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/four-years-of-the-web-scraping-club?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Web Scraping Club! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/four-years-of-the-web-scraping-club?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/four-years-of-the-web-scraping-club?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[Prepare Web Content and Documents for LLM Ingestion Using MarkItDown]]></title><description><![CDATA[Markdown is the language of AI. Learn how to convert different data formats into it!]]></description><link>https://www.scraping.club/p/markitdown-ai-markdown</link><guid isPermaLink="false">https://www.scraping.club/p/markitdown-ai-markdown</guid><dc:creator><![CDATA[Antonello Zanini]]></dc:creator><pubDate>Sun, 09 Aug 2026 21:27:01 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/a95436ad-6ed8-4d30-871c-528ebaed6dd4_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most LLMs understand Markdown exceptionally well. Consequently, when building AI-powered data pipelines, it makes sense to convert all input data into Markdown first. This way, scraped web pages, documents, and other content can then be processed in a consistent format.</p><p>That&#8217;s where the MarkItDown Python library comes into play!</p><p>Here, I&#8217;ll show you everything you need to know about MarkItDown, from installation to practical examples, so you can convert HTML pages, PDFs, Word documents, Excel spreadsheets, and many other data sources into LLM-ready Markdown.</p><h2>Why the Markdown Data Format Is More Relevant Than Ever</h2><p>As I covered <a href="https://substack.thewebscraping.club/p/why-scraping-return-markdown-llm-ai">in a recent post</a>, AI-ready web scrapers, RAG pipelines, and agent frameworks all have one thing in common: they rely heavily on Markdown!</p><p>That&#8217;s no coincidence... Mainstream LLMs (including OpenAI&#8217;s latest models) natively &#8220;speak&#8221; Markdown and often generate Markdown-formatted responses without being prompted.</p><p>Why? Because Markdown strikes the perfect balance between plain text and structured documents. It preserves headings, lists, tables, links, code blocks, and other semantic elements without the overhead and noise of HTML.</p><p>As a result, LLMs can understand and process Markdown efficiently while consuming far fewer tokens. This translates directly into lower inference costs and leaves more of the context window available for meaningful content.</p><p>In my experience (and as I demonstrated in <a href="https://www.kaggle.com/code/brightdataml/benchmarking-ai-on-different-data-formats">a benchmark I conducted for Bright Data</a>), Markdown has become the natural format for feeding documents, especially content extracted from the web, into LLMs.</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p><div><hr></div></blockquote><h2>Why Markdown Conversion Matters in Web Scraping Pipelines</h2><p>Web data is rarely the final destination. Quite the opposite, scraped content generally represents the starting point of a larger data analysis pipeline, where the goal is to extract insights, enrich datasets, or power downstream applications.</p><p>In these workflows, the information you need tends to go beyond traditional web pages. PDFs, Word documents, videos, presentations, and other files can provide additional context required for accurate analysis and processing. These resources may come from the web and be collected during scraping, or they may be added later.</p><p>Regardless of the original format, data is increasingly processed by AI systems. Since LLMs naturally work well with Markdown, converting different sources into a clean, structured Markdown representation can greatly simplify your data pipelines.</p><p>That&#8217;s why you need a multi-format Markdown conversion library in your toolkit, such as MarkItDown!</p><div><hr></div><blockquote><p><em><strong>The new anti-bot solution</strong> - Toughest walls, lowest price. Claim your free 10 000 requests with coupon code <strong>WSCLUB</strong></em></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0jGM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 424w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 848w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0jGM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png" width="612" height="306" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/baf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:728,&quot;width&quot;:1456,&quot;resizeWidth&quot;:612,&quot;bytes&quot;:493234,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k&quot;,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/208113514?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!0jGM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 424w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 848w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 1272w, https://substackcdn.com/image/fetch/$s_!0jGM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbaf4debc-e56d-4592-992d-02cbb3112a17_2400x1200.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k&quot;,&quot;text&quot;:&quot;Claim your credits&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://scrapeunblocker.com/?utm_source=wsclub&amp;utm_medium=email&amp;utm_campaign=free-10k"><span>Claim your credits</span></a></p></blockquote><div><hr></div><h2>MarkItDown: A Complete Overview</h2><p>Let me now introduce you to MarkItDown, one of the most popular libraries for converting multiple input formats into Markdown.</p><h3>What Is MarkItDown?</h3><p><a href="https://github.com/microsoft/markitdown">MarkItDown</a> is an open-source Python library for converting a wide range of documents and other data sources into Markdown. The project is developed and maintained by Microsoft.</p><p>It&#8217;s quickly become one of the most popular tools in its category (more on this later in the post), with over 165k GitHub stars, over <a href="https://pypistats.org/packages/markitdown">12 million monthly downloads</a>, and a thriving community.</p><p>MarkItDown supports dozens of input formats, ranging from Office documents and PDFs to images, audio files, web pages, YouTube videos, and structured data formats such as JSON, XML, and CSV.</p><h3>Key Features</h3><p>The main capabilities supported by MarkItDown are:</p><ul><li><p><strong>Broad format support</strong>: Converts dozens of input formats, including PDFs, Office documents, HTML, images, audio, EPUBs, ZIP archives, YouTube URLs, and structured data files.</p></li><li><p><strong>Python API</strong>: Offers a clean, developer-friendly API for integrating document conversion into Python applications.</p></li><li><p><strong>Native CLI</strong>: Includes a rich CLI for converting files directly from the terminal, making it ideal for scripting, batch processing, and DevOps workflows.</p></li><li><p><strong>Plugin architecture</strong>: Supports third-party plugins, allowing the community to extend the library with custom converters and additional processing features.</p></li><li><p><strong>AI-powered processing</strong>: Integrates with LLMs to generate image descriptions, perform OCR, and transcribe audio, enriching the resulting Markdown.</p></li><li><p><strong>Flexible dependency management</strong>: Lets you install only the converters you need, reducing dependencies and keeping deployments lightweight.</p></li><li><p><strong>MCP server support:</strong> Provides a lightweight Model Context Protocol server that allows AI agents to call MarkItDown as a tool.</p></li><li><p><strong>Azure AI integration</strong>: Works with <em><a href="https://learn.microsoft.com/en-us/azure/ai-services/document-intelligence/overview">Azure Document Intelligence</a></em> and <em><a href="https://learn.microsoft.com/en-us/azure/ai-services/content-understanding/">Azure Content Understanding</a></em> for higher-quality OCR, layout analysis, and structured field extraction.</p></li></ul><h3>Supported Input Formats</h3><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mphI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mphI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png 424w, https://substackcdn.com/image/fetch/$s_!mphI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png 848w, https://substackcdn.com/image/fetch/$s_!mphI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png 1272w, https://substackcdn.com/image/fetch/$s_!mphI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mphI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png" width="1456" height="1747" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1747,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;MarkItDown: Input > Output table&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="MarkItDown: Input > Output table" title="MarkItDown: Input > Output table" srcset="https://substackcdn.com/image/fetch/$s_!mphI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png 424w, https://substackcdn.com/image/fetch/$s_!mphI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png 848w, https://substackcdn.com/image/fetch/$s_!mphI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png 1272w, https://substackcdn.com/image/fetch/$s_!mphI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2109c0d2-263e-4e69-ad00-6f6aa7b59549_1490x1788.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">MarkItDown: Input &gt; Output table</figcaption></figure></div><h3>Installation and Setup</h3><p>Follow the steps below to add MarkItDown to your system.</p><h3>Prerequisites</h3><p>MarkItDown requires Python 3.10 or higher. It&#8217;s also recommended to install it inside a <a href="https://docs.python.org/3/library/venv.html">Python virtual environment</a>.</p><h3>Installation via pip</h3><p>The easiest way to install MarkItDown is through the <a href="https://pypi.org/project/markitdown/">PyPI </a><em><a href="https://pypi.org/project/markitdown/">markitdown</a></em><a href="https://pypi.org/project/markitdown/"> package</a> with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">pip install 'markitdown[all]'</code></pre></div><p>Note that <em>[all]</em> option adds all optional dependencies required to support every available input format.</p><p>If you only need support for specific file types, you can install the specific dependencies individually for more control. For example:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">pip install 'markitdown[pdf, docx]'</code></pre></div><p>This adds only the extra dependencies required for PDF and Word file conversion.</p><p>Available optional dependencies include:</p><ul><li><p><em>[all]</em>: Installs all optional dependencies.</p></li><li><p><em>[pptx]</em>: Adds support for PowerPoint files.</p></li><li><p><em>[docx]</em>: Adds support for Word documents.</p></li><li><p><em>[xlsx]</em>: Adds support for Excel files.</p></li><li><p><em>[xls]</em>: Adds support for older Excel files.</p></li><li><p><em>[pdf]</em>: Adds support for PDF documents.</p></li><li><p><em>[outlook]</em>: Adds support for Outlook messages.</p></li><li><p><em>[audio-transcription]</em>: Adds support for WAV and MP3 audio transcription.</p></li><li><p><em>[youtube-transcription]</em>: Adds support for YouTube video transcription.</p></li><li><p><em>[az-doc-intel]</em>: Enables integration with <em>Azure Document Intelligence</em>.</p></li><li><p><em>[az-content-understanding]</em>: Enables integration with <em>Azure Content Understanding</em>.</p></li></ul><p><strong>Note</strong>: For installation from source or Docker-based usage, <a href="https://github.com/microsoft/markitdown">refer to the official MarkItDown docs</a>.</p><h2>MarkItDown in Action: Full Examples</h2><p>Time to explore some practical examples of converting different input data formats into Markdown.</p><h3>HTML Document to Markdown</h3><p>Suppose you have an HTML page stored locally (e.g., as part of an <a href="https://substack.thewebscraping.club/p/offline-web-scraping">offline web scraping procedure</a>). You can convert it to Markdown using the MarkItDown CLI:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">markitdown example.html -o example.md</code></pre></div><p>Alternatively, you can achieve the same result via the Python API:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("example.html")

with open("example.md", "w", encoding="utf-8") as f:
    f.write(result.text_content)</code></pre></div><p>Now, assume the input is the following HTML page (i.e., the homepage from <em>example.com</em>):</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gzz9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gzz9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png 424w, https://substackcdn.com/image/fetch/$s_!gzz9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png 848w, https://substackcdn.com/image/fetch/$s_!gzz9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png 1272w, https://substackcdn.com/image/fetch/$s_!gzz9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gzz9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png" width="1456" height="1105" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1105,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The input example.html page&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The input example.html page" title="The input example.html page" srcset="https://substackcdn.com/image/fetch/$s_!gzz9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png 424w, https://substackcdn.com/image/fetch/$s_!gzz9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png 848w, https://substackcdn.com/image/fetch/$s_!gzz9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png 1272w, https://substackcdn.com/image/fetch/$s_!gzz9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4a78396f-044b-432b-a892-6c0bb17307e1_2242x1702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The input example.html page</figcaption></figure></div><p>The resulting <em>example.md</em> file will contain:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Uuo0!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Uuo0!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png 424w, https://substackcdn.com/image/fetch/$s_!Uuo0!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png 848w, https://substackcdn.com/image/fetch/$s_!Uuo0!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png 1272w, https://substackcdn.com/image/fetch/$s_!Uuo0!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Uuo0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png" width="1456" height="249" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:249,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Uuo0!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png 424w, https://substackcdn.com/image/fetch/$s_!Uuo0!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png 848w, https://substackcdn.com/image/fetch/$s_!Uuo0!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png 1272w, https://substackcdn.com/image/fetch/$s_!Uuo0!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F525c452d-95c8-42ce-89cf-32152c90fb00_2246x384.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">The resulting example.md Markdown document</figcaption></figure></div><p>Notice how MarkItDown focuses on the meaningful HTML content, ignoring tags like <em><a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/style">&lt;style&gt;</a></em>.</p><p>The library extracts the relevant elements and converts them into a structured Markdown representation, keeping important information such as headings, links, and text formatting while removing unnecessary HTML overhead.</p><h3>Web Page to Markdown</h3><p>A particularly useful feature for web scraping workflows is that MarkItDown can also fetch and convert web pages directly from their URLs, eliminating the need to manually save the HTML first.</p><p>Just pass the URL of the target page directly to the MarkItDown CLI:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">markitdown 'https://example.com' -o example.md</code></pre></div><p>Or to its Python API:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("https://example.com")

with open("example.md", "w", encoding="utf-8") as f:
    f.write(result.text_content)</code></pre></div><p>Under the hood, MarkItDown performs an HTTP GET request to the specified URL using <em><a href="https://requests.readthedocs.io/">Requests</a></em>, retrieves the page HTML, and converts the resulting content into Markdown. As usual, keep in mind that the request may fail if the target website uses anti-bot protections.</p><p>The output will be the same <span>example.md</span> Markdown file shown in the previous example.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h3><br>PDF to Markdown</h3><p>Many websites store valuable information in downloadable PDF files (e.g., shopping flyers, business reports, whitepapers, product documentation, etc.).</p><p>While you can send these files directly to an AI model, doing so often consumes unnecessary context and tokens because PDFs may contain complex layouts and additional formatting overhead.</p><p>MarkItDown converts PDFs into clean Markdown while preserving important elements such as headings, document structure, lists, and tables, making the content easier for LLMs to process.</p><p>Assume your input is the sample PDF below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ULY3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ULY3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png 424w, https://substackcdn.com/image/fetch/$s_!ULY3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png 848w, https://substackcdn.com/image/fetch/$s_!ULY3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png 1272w, https://substackcdn.com/image/fetch/$s_!ULY3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ULY3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png" width="1456" height="1038" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1038,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The input sample.pdf&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The input sample.pdf" title="The input sample.pdf" srcset="https://substackcdn.com/image/fetch/$s_!ULY3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png 424w, https://substackcdn.com/image/fetch/$s_!ULY3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png 848w, https://substackcdn.com/image/fetch/$s_!ULY3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png 1272w, https://substackcdn.com/image/fetch/$s_!ULY3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6af0c9e3-ab35-4033-a065-bcbb6becc3c7_2248x1602.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The input sample.pdf</figcaption></figure></div><p>Convert it to Markdown with the MarkItDown CLI:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">markitdown sample.pdf -o sample.md</code></pre></div><p>Or in Python:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("sample.pdf")

with open("sample.md", "w", encoding="utf-8") as f:
    f.write(result.text_content)</code></pre></div><p>The result will be this <em>sample.md</em> file:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0raX!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0raX!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png 424w, https://substackcdn.com/image/fetch/$s_!0raX!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png 848w, https://substackcdn.com/image/fetch/$s_!0raX!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png 1272w, https://substackcdn.com/image/fetch/$s_!0raX!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0raX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png" width="1456" height="1074" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1074,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The output sample.md file&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The output sample.md file" title="The output sample.md file" srcset="https://substackcdn.com/image/fetch/$s_!0raX!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png 424w, https://substackcdn.com/image/fetch/$s_!0raX!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png 848w, https://substackcdn.com/image/fetch/$s_!0raX!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png 1272w, https://substackcdn.com/image/fetch/$s_!0raX!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F586e977e-cb92-45ec-989e-e1cfd055fbf3_2248x1658.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The output sample.md file</figcaption></figure></div><p>As you can see, MarkItDown preserves all the meaningful content from the PDF.</p><h3>Excel to Markdown</h3><p>Now, suppose you have relevant internal data stored in an Excel spreadsheet and want to pass it to an LLM for analysis or processing:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Zce6!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Zce6!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png 424w, https://substackcdn.com/image/fetch/$s_!Zce6!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png 848w, https://substackcdn.com/image/fetch/$s_!Zce6!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png 1272w, https://substackcdn.com/image/fetch/$s_!Zce6!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Zce6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png" width="1456" height="772" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:772,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The input spreadsheet.xls file&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The input spreadsheet.xls file" title="The input spreadsheet.xls file" srcset="https://substackcdn.com/image/fetch/$s_!Zce6!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png 424w, https://substackcdn.com/image/fetch/$s_!Zce6!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png 848w, https://substackcdn.com/image/fetch/$s_!Zce6!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png 1272w, https://substackcdn.com/image/fetch/$s_!Zce6!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe7705eeb-d5e1-4505-b1ca-a69cf2c9c7ad_3072x1628.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The input spreadsheet.xls file</figcaption></figure></div><p>Convert it to Markdown through the MarkItDown CLI:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">markitdown spreadsheet.xls -o spreadsheet.md</code></pre></div><p>Or use the Python API:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">from markitdown import MarkItDown

md = MarkItDown()
result = md.convert("spreadsheet.xls")

with open("spreadsheet.md", "w", encoding="utf-8") as f:
    f.write(result.text_content)</code></pre></div><p>The result will be a Markdown file containing a table with the same data as the original spreadsheet:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!I5hf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!I5hf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png 424w, https://substackcdn.com/image/fetch/$s_!I5hf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png 848w, https://substackcdn.com/image/fetch/$s_!I5hf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!I5hf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!I5hf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png" width="1456" height="1103" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/adcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1103,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The output spreadsheet.md file&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The output spreadsheet.md file" title="The output spreadsheet.md file" srcset="https://substackcdn.com/image/fetch/$s_!I5hf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png 424w, https://substackcdn.com/image/fetch/$s_!I5hf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png 848w, https://substackcdn.com/image/fetch/$s_!I5hf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!I5hf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fadcad2c7-0e99-4cd9-a393-7a858eed5588_2238x1696.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The output spreadsheet.md file</figcaption></figure></div><p>Or, for a better visual representation, through the Markdown viewer:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!mnHs!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!mnHs!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png 424w, https://substackcdn.com/image/fetch/$s_!mnHs!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png 848w, https://substackcdn.com/image/fetch/$s_!mnHs!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!mnHs!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!mnHs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png" width="1456" height="1101" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1101,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Note the table in the spreadsheet.md Markdown file&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Note the table in the spreadsheet.md Markdown file" title="Note the table in the spreadsheet.md Markdown file" srcset="https://substackcdn.com/image/fetch/$s_!mnHs!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png 424w, https://substackcdn.com/image/fetch/$s_!mnHs!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png 848w, https://substackcdn.com/image/fetch/$s_!mnHs!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png 1272w, https://substackcdn.com/image/fetch/$s_!mnHs!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9d73a619-d1ef-4b8a-b9a3-c3561a9aedfb_2242x1696.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Note the table in the spreadsheet.md Markdown file</figcaption></figure></div><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h3>MarkItDown Plugins</h3><p>MarkItDown also supports third-party plugins that extend its built-in capabilities with additional converters and processing features. You can discover available plugins by searching GitHub for the <em>#markitdown-plugin</em> hashtag:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!C4xg!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!C4xg!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png 424w, https://substackcdn.com/image/fetch/$s_!C4xg!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png 848w, https://substackcdn.com/image/fetch/$s_!C4xg!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png 1272w, https://substackcdn.com/image/fetch/$s_!C4xg!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!C4xg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png" width="1456" height="778" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:778,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;The result of a &#8220;#markitdown-plugin&#8221; hashtag search on GitHub&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The result of a &#8220;#markitdown-plugin&#8221; hashtag search on GitHub" title="The result of a &#8220;#markitdown-plugin&#8221; hashtag search on GitHub" srcset="https://substackcdn.com/image/fetch/$s_!C4xg!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png 424w, https://substackcdn.com/image/fetch/$s_!C4xg!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png 848w, https://substackcdn.com/image/fetch/$s_!C4xg!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png 1272w, https://substackcdn.com/image/fetch/$s_!C4xg!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb92fc2e0-b297-4d1b-ba2b-3428430ddb88_3072x1642.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The result of a &#8220;#markitdown-plugin&#8221; hashtag search on GitHub</figcaption></figure></div><p>To list all installed plugins, run:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">markitdown --list-plugins</code></pre></div><p>Plugins are disabled by default. To enable them from the CLI, add the <em>--use-plugins</em> flag:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">markitdown --use-plugins &lt;SOURCE_FILE_PATH&gt; -o &lt;OUTPUT_FILE&gt;</code></pre></div><p>If you&#8217;re using the Python API, enable plugins by setting the <em>enable_plugins</em> parameter to <em>True</em>:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">
from markitdown import MarkItDown

md = MarkItDown(
  enable_plugins=True,
)</code></pre></div><p>Once enabled, MarkItDown automatically loads all installed plugins.</p><h2>MarkItDown Alternatives: Other Document-to-Markdown Libraries</h2><p>MarkItDown isn&#8217;t the only library for converting documents to Markdown. Other popular libraries for converting different types of data into Markdown include:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!A07U!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!A07U!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png 424w, https://substackcdn.com/image/fetch/$s_!A07U!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png 848w, https://substackcdn.com/image/fetch/$s_!A07U!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png 1272w, https://substackcdn.com/image/fetch/$s_!A07U!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!A07U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png" width="1456" height="1251" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1251,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;MarkItDown alternatives&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="MarkItDown alternatives" title="MarkItDown alternatives" srcset="https://substackcdn.com/image/fetch/$s_!A07U!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png 424w, https://substackcdn.com/image/fetch/$s_!A07U!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png 848w, https://substackcdn.com/image/fetch/$s_!A07U!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png 1272w, https://substackcdn.com/image/fetch/$s_!A07U!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd9f0284f-fe4a-46dd-93e9-b4c5fbaebcae_1537x1321.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">MarkItDown alternatives</figcaption></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Conclusion</h2><p>Markdown is the language of LLMs and, as a result, the preferred format for AI-powered data processing and analysis pipelines. In this post, I covered how to use MarkItDown to convert web pages, HTML documents, PDFs, Word documents, Excel spreadsheets, PowerPoint presentations, YouTube videos, and many other file formats into clean, AI-friendly Markdown.</p><p>You now know how to get the most out of MarkItDown to prepare data for AI workflows, regardless of whether it comes from web scraping, downloaded files, or local documents.</p><p>I hope you found this guide useful. If you have any questions or comments, feel free to leave them below. Thanks for reading, and see you in the next one!</p><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/markitdown-ai-markdown?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading The Web Scraping Club! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/markitdown-ai-markdown?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.scraping.club/p/markitdown-ai-markdown?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><div><hr></div><h2>FAQ</h2><h3>How to set a proxy in MarkItDown?</h3><p>MarkItDown doesn&#8217;t provide a dedicated proxy configuration option. Still, it relies on the Python <em>requests</em> library internally, which supports <a href="https://requests.readthedocs.io/en/latest/user/advanced/#proxies">proxy configuration through special environment variables</a>. Thus, you can set a proxy in MarkItDown with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;bash&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-bash">export HTTP_PROXY="http://user:password@your-proxy-server.com:port"
export HTTPS_PROXY="http://user:password@your-proxy-server.com:port"</code></pre></div><p>Or, directly in the Python code with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;python&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-python">import os
from markitdown import MarkItDown

# Set your proxy addresses (replace with your proxy details)
os.environ["HTTP_PROXY"] = "http://user:password@your-proxy-server.com:port"
os.environ["HTTPS_PROXY"] = "http://user:password@your-proxy-server.com:port"

md = MarkItDown()
# ...</code></pre></div><h3>How to deal with 429 errors when converting YouTube videos to Markdown with MarkItDown?</h3><p>Try to convert a YouTube video to Markdown, such as with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">markitdown "https://www.youtube.com/watch?v=1wtQAoBZLTg" -o video.md</code></pre></div><p>The request is likely to <a href="https://github.com/microsoft/markitdown/issues/1380">fail with </a><em><a href="https://github.com/microsoft/markitdown/issues/1380">429 Too Many Requests</a></em><a href="https://github.com/microsoft/markitdown/issues/1380"> errors</a> due to YouTube anti-bot protections. This can happen even with a fresh IP address. To improve reliability, try to route MarkItDown requests through a <a href="https://substack.thewebscraping.club/p/evaluating-proxy-providers-ips">high-quality residential proxy</a>.</p><h3>How to use the MarkItDown MCP server?</h3><p>The <a href="https://github.com/microsoft/markitdown/tree/main/packages/markitdown-mcp">MarkItDown MCP server</a> exposes a single tool that allows AI agents and MCP-compatible applications to convert different data sources into Markdown. The tool is <em>convert_to_markdown</em>, which accepts <em>http:</em>, <em>https:</em>, <em>file:</em>, and <em>data:</em> URIs.</p><p>Install the MarkItDown MCP server with:</p><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;plaintext&quot;,&quot;nodeId&quot;:null}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-plaintext">pip install markitdown-mcp</code></pre></div><p>Then, connect it to an MCP-compatible client, such as Claude Code, Claude Desktop, Codex, Gemini CLI, etc.</p><p><br><br></p>]]></content:encoded></item><item><title><![CDATA[Tool of the week #1: Bright Data Scraper Studio, From Prompt to Production Scraper in Minutes ]]></title><description><![CDATA[Explore how Bright Data's Scraper Studio bridges the gap between AI-assisted building and full IDE-level control without locking you into either.]]></description><link>https://www.scraping.club/p/bright-data-scraper-studio</link><guid isPermaLink="false">https://www.scraping.club/p/bright-data-scraper-studio</guid><dc:creator><![CDATA[Federico Trotta]]></dc:creator><pubDate>Tue, 04 Aug 2026 03:01:29 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/1f585129-6ef1-4c20-8885-181da3fa1486_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>If you&#8217;ve been building serious scrapers for a while, you know that the real bottleneck is everything around the extraction logic. Especially for production-ready scrapers, you have to spend hours wiring up proxy rotation, managing headless browser sessions, handling rate limits and fingerprinting, and then babysitting the whole system when the target site inevitably changes its DOM structure. The actual scraping part? It&#8217;s maybe 20% of the whole work.</p><p>As AI usage is growing more and more every day, you&#8217;d like an AI-powered tool that can improve your scraping productivity, don&#8217;t you?! Especially when it comes to <a href="https://substack.thewebscraping.club/p/scraping-with-llms-gpt-vision">managing selectors, and DOM structure changes</a>&#8230;</p><p>Well, there&#8217;s good news for you: this is the exact gap <a href="https://get.brightdata.com/twsc-scraper-studio">Bright Data Scraper Studio</a> is designed to close!</p><p>This article discusses what Bright Data&#8217;s Scraper Studio is, why it exists, and how to use it with a step-by-step tutorial.</p><p>Let&#8217;s get into it!</p><h2>What Scraper Studio Actually Is</h2><p><a href="https://brightdata.com/products/web-scraper/studio">Scraper Studio</a> is a cloud-hosted, end-to-end scraping environment running entirely on top of Bright Data&#8217;s infrastructure. The tool is designed from the ground up with scraping primitives in mind, as it provides built-in proxy rotation, native JavaScript rendering, anti-bot handling, and direct integrations with data delivery targets like Amazon S3, Snowflake, Google Cloud, and Microsoft Azure.</p><p>The platform offers two build modes that sit on the same underlying scraper runtime:</p><ul><li><p><strong>AI agent mode</strong>: You provide a target URL and a plain-English description of the data you want to extract. The AI agent visits the page, infers a structured output schema, and then generates the full scraper code for you. At the end of this automated process, you review and approve the schema before code generation begins. This gives you a checkpoint to catch misaligned fields before they propagate into your pipeline, allowing you to change them.</p></li><li><p><strong>Full IDE mode</strong>: A full browser-based JavaScript code editor with debugging tools for when you need direct, line-level control over the scraper logic. This is the mode you can use for when you&#8217;re dealing with multi-stage scrapers, custom pagination logic, complex state management between page navigations, or sites with particularly aggressive anti-bot stacks that need fine-tuned handling.</p></li></ul><p>What&#8217;s more important is that both modes produce the same type of scraper. This means that you&#8217;re never locked into one approach: a scraper built in the AI Agent mode can be opened and edited in the IDE at any time, and any scraper can be updated using the <em><a href="https://docs.brightdata.com/datasets/scraper-studio/self-healing-tool">Self-healing tool</a>.</em></p><h2>Scraper Studio Key Features</h2><p>Let&#8217;s take a close look at Scraper Studio&#8217;s features:</p><ul><li><p><strong>Built-in proxy infrastructure</strong>: Scraper Studio runs on Bright Data&#8217;s proxy network which, among other types, provides users with 400+ million residential IPs across 195 countries, with 99.99% uptime. For scraping professionals, this means no proxy pool management and, more importantly, no dealing with burned IPs.</p></li><li><p><strong>Anti-bot bypass, natively integrated</strong>: JavaScript rendering, fingerprinting evasion, and <a href="https://substack.thewebscraping.club/p/managing-proxy-bans-proxy-retries">bot detection bypass are built into the runtime</a>. This is significant because it means your scraper code doesn&#8217;t need to account for these concerns. You write the extraction logic, and the platform handles the unblocking automatically.</p></li><li><p><strong>AI-powered self-healing</strong>: This is arguably the most operationally relevant feature for running scrapers long-term. When a target site changes its structure, and your scraper breaks, the self-healing tool lets you describe the fix in plain English. The AI analyzes the current code, proposes changes with a diff view, and you approve or reject them. This means that you remain in control of the overall process, as changes aren&#8217;t auto-applied unless you explicitly enable auto-approval</p></li><li><p><strong>Scheduled runs and data delivery</strong>: Scraper Studio includes a scheduling layer, so you can configure periodic runs without external orchestration. Combine this with native delivery to S3, Snowflake, GCS, or Azure, and you have a complete data pipeline that starts from scraping and ends with structured output in your data warehouse, with no spaghetti code required.</p></li><li><p><strong>CLI and agent integration</strong>: If you prefer working outside the browser UI, scrapers can be built and triggered via the Bright Data CLI, and the AI Agent mode is accessible programmatically, currently compatible with tools like Claude Code, Cursor, and Codex. This means you can integrate Scraper Studio into existing developer workflows without being locked into the web interface.</p></li><li><p><strong>Wide pricing offer</strong>: The pricing offer may seem like a secondary theme, but it&#8217;s not. First and foremost, Bright Data offers you 5k page loads for free every month, backed by their expert support if you need it. The other pricing options are:</p><ul><li><p>Pay-as-you-go: $1.5 per 1k page loads, and you pay only for successful requests.</p></li><li><p>Scale: $400/Mo that includes about 400k page loads per month and more.</p></li><li><p>Enterprise: A custom pricing tier for enterprises, based on their specific needs.</p></li></ul></li></ul><h2>Scraper Studio Best Use Cases</h2><p>If you&#8217;re already familiar with Bright Data products and offers, you may be asking why use Scraper Studio. Below is a list of practical examples when this is the right tool to use:</p><ul><li><p><strong>No APIs or ready-to-use datasets</strong>: If you need to scrape a site that isn&#8217;t available on Bright Data&#8217;s pre-built Datasets Marketplace or on its web scraping APIs, and you want to own the scraper logic yourself but not the infrastructure, well, Scraper Studio is your best choice.</p></li><li><p><strong>Recurring pipelines</strong>: When you&#8217;re building a recurring data pipeline and don&#8217;t want to manage cron jobs, deployment infrastructure, or <a href="https://substack.thewebscraping.club/p/differences-residential-mobile-proxies">proxy pools</a> separately.</p></li><li><p><strong>Quick prototypes</strong>: The AI Agent mode can go from a single URL to a working scraper in under 10 minutes. This makes it genuinely useful for validating whether a scraping approach is feasible before committing engineering time on a larger scale.</p></li><li><p><strong>You&#8217;re in a team with mixed technical levels</strong>: The AI Agent is accessible to non-engineers, and the IDE gives developers full control. They both produce the same type of scraper, deployable on the same infrastructure, and as it is interchangeable, your team can manage the same project with different technical levels.</p></li></ul><h2>How to Build a Web Scraper With Scraper Studio Using the AI Agent Mode</h2><p>Time to take the theory into practice. In this section, you&#8217;ll learn how to create a web scraper with Scraper Studio using its AI agent mode. The target URL for this tutorial is from the <a href="https://www.kappa.com/products/active-jerseys-man-amirilore-trackhouse-blue-diva-grey-antrachite-neon-yellow-322j6hw-trh-a02">Kappa&#8217;s website</a>:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NfDA!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NfDA!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png 424w, https://substackcdn.com/image/fetch/$s_!NfDA!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png 848w, https://substackcdn.com/image/fetch/$s_!NfDA!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png 1272w, https://substackcdn.com/image/fetch/$s_!NfDA!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NfDA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png" width="1456" height="656" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c549333-7ede-4b83-8242-917209959f20_1903x858.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:656,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:424073,&quot;alt&quot;:&quot;The target product from Kappa&#8217;s website by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="The target product from Kappa&#8217;s website by Federico Trotta" title="The target product from Kappa&#8217;s website by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!NfDA!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png 424w, https://substackcdn.com/image/fetch/$s_!NfDA!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png 848w, https://substackcdn.com/image/fetch/$s_!NfDA!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png 1272w, https://substackcdn.com/image/fetch/$s_!NfDA!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c549333-7ede-4b83-8242-917209959f20_1903x858.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The target product from Kappa&#8217;s website</figcaption></figure></div><p>The scraper will retrieve the data from this target page, using the constraints via the prompt description.</p><p>Follow the next steps to build your scraper!</p><h3>Step #1: Create a New AI Web Scraper Project</h3><p>After creating a new <a href="https://brightdata.com/">Bright Data account</a>, go to the <strong>Scrapers</strong> tab and click on <strong>Develop a web scraper</strong> under <strong>New</strong>:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xmDN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xmDN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png 424w, https://substackcdn.com/image/fetch/$s_!xmDN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png 848w, https://substackcdn.com/image/fetch/$s_!xmDN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png 1272w, https://substackcdn.com/image/fetch/$s_!xmDN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xmDN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png" width="1456" height="360" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:360,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:88822,&quot;alt&quot;:&quot;Create a new web scraper in Bright Data&#8217;s dashboard by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Create a new web scraper in Bright Data&#8217;s dashboard by Federico Trotta" title="Create a new web scraper in Bright Data&#8217;s dashboard by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!xmDN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png 424w, https://substackcdn.com/image/fetch/$s_!xmDN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png 848w, https://substackcdn.com/image/fetch/$s_!xmDN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png 1272w, https://substackcdn.com/image/fetch/$s_!xmDN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F87ae1506-f01f-4ffc-af6c-1b210fc64da9_1887x466.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Create a new web scraper in Bright Data&#8217;s dashboard</figcaption></figure></div><p>You&#8217;ll be redirected to a page where you can insert the target URL and the prompt. For this tutorial, the prompt is the following:</p><pre><code><code>Extract the product name, price, available variations / colors, sizes, image URLs, product description, product details.</code></code></pre><p>Below is the visual result:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TESU!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TESU!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png 424w, https://substackcdn.com/image/fetch/$s_!TESU!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png 848w, https://substackcdn.com/image/fetch/$s_!TESU!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png 1272w, https://substackcdn.com/image/fetch/$s_!TESU!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TESU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png" width="1291" height="683" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:683,&quot;width&quot;:1291,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:183288,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!TESU!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png 424w, https://substackcdn.com/image/fetch/$s_!TESU!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png 848w, https://substackcdn.com/image/fetch/$s_!TESU!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png 1272w, https://substackcdn.com/image/fetch/$s_!TESU!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F24ed096d-079e-4814-897b-1e75e51542a9_1291x683.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Starting your AI web scraping project with Scraper Studio</figcaption></figure></div><p>Note that this is also where you can immediately go for the IDE mode by clicking on <strong>Open IDE</strong>.</p><p>When you&#8217;re ready, click on <strong>Start scraping with AI,</strong> and Scraper Studio will make its magic!</p><h3>Step #2: Analyze and Approve the Output Schema</h3><p>The system will automatically produce the output below:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!wD0G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!wD0G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png 424w, https://substackcdn.com/image/fetch/$s_!wD0G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png 848w, https://substackcdn.com/image/fetch/$s_!wD0G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png 1272w, https://substackcdn.com/image/fetch/$s_!wD0G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!wD0G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png" width="863" height="721" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:721,&quot;width&quot;:863,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:121860,&quot;alt&quot;:&quot;Approve or decline the presented data structure by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Approve or decline the presented data structure by Federico Trotta" title="Approve or decline the presented data structure by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!wD0G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png 424w, https://substackcdn.com/image/fetch/$s_!wD0G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png 848w, https://substackcdn.com/image/fetch/$s_!wD0G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png 1272w, https://substackcdn.com/image/fetch/$s_!wD0G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F80b2354e-7109-49e4-b6a7-501e60fade5d_863x721.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Approve or decline the presented data structure</figcaption></figure></div><p>This is the output schema. It&#8217;s a structured list of data fields the scraper will extract, along with their data types. Compare this with the data in the target page, and click <strong>Approve</strong> if the output matches your expectations.</p><p>After your approval, Scraper Studio will start creating the web scraper. When the process is done, you&#8217;ll receive the following pop-up:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!8Fxy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!8Fxy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png 424w, https://substackcdn.com/image/fetch/$s_!8Fxy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png 848w, https://substackcdn.com/image/fetch/$s_!8Fxy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png 1272w, https://substackcdn.com/image/fetch/$s_!8Fxy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!8Fxy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png" width="861" height="711" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:711,&quot;width&quot;:861,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:106553,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!8Fxy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png 424w, https://substackcdn.com/image/fetch/$s_!8Fxy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png 848w, https://substackcdn.com/image/fetch/$s_!8Fxy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png 1272w, https://substackcdn.com/image/fetch/$s_!8Fxy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5272e0de-d378-4c27-a3e5-fb9554de0795_861x711.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Your scraper is ready!</figcaption></figure></div><p>You&#8217;ll also get a notification email when the scraper is ready:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!jVW7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!jVW7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png 424w, https://substackcdn.com/image/fetch/$s_!jVW7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png 848w, https://substackcdn.com/image/fetch/$s_!jVW7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png 1272w, https://substackcdn.com/image/fetch/$s_!jVW7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!jVW7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png" width="1456" height="666" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:666,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:83143,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!jVW7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png 424w, https://substackcdn.com/image/fetch/$s_!jVW7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png 848w, https://substackcdn.com/image/fetch/$s_!jVW7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png 1272w, https://substackcdn.com/image/fetch/$s_!jVW7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbc548cb3-ae09-4358-9f9f-3cdeb873fb45_1531x700.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">The email notification you&#8217;ll receive when your scraper is ready</figcaption></figure></div><p>All right, your scraper is ready for data retrieval.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h3>Step #3: Manage Preferences and Retrieve The Data</h3><p>When the scraper is ready, this doesn&#8217;t mean the data is scraped. Before scraping the data, you have to manage your preferences.</p><p>First of all, go into your scrapers and navigate to the <strong>Delivery preferences</strong> tab:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!sRzP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!sRzP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png 424w, https://substackcdn.com/image/fetch/$s_!sRzP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png 848w, https://substackcdn.com/image/fetch/$s_!sRzP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png 1272w, https://substackcdn.com/image/fetch/$s_!sRzP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!sRzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png" width="1456" height="475" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:475,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:87023,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!sRzP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png 424w, https://substackcdn.com/image/fetch/$s_!sRzP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png 848w, https://substackcdn.com/image/fetch/$s_!sRzP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png 1272w, https://substackcdn.com/image/fetch/$s_!sRzP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9697b201-60ae-43c7-b758-b8f7b1f47bb9_1690x551.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Manage the delivery preferences</figcaption></figure></div><p>Here is where you can choose among:</p><ul><li><p>Data format for local download, like JSON, NDJSON, CSV, or XLS.</p></li><li><p>Third-party connections like Amazon S3 bucket, AWS, Snowflake, and more.</p></li><li><p>Get notified via email based on the status of the data delivery.</p></li></ul><p>If you want a scraper that starts recurrently, navigate to the <strong>Subscriptions</strong> tab and set your schedule:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JeL8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JeL8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png 424w, https://substackcdn.com/image/fetch/$s_!JeL8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png 848w, https://substackcdn.com/image/fetch/$s_!JeL8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png 1272w, https://substackcdn.com/image/fetch/$s_!JeL8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JeL8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png" width="1456" height="681" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:681,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:95359,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!JeL8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png 424w, https://substackcdn.com/image/fetch/$s_!JeL8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png 848w, https://substackcdn.com/image/fetch/$s_!JeL8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png 1272w, https://substackcdn.com/image/fetch/$s_!JeL8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fba20dd9a-253e-4d3f-bc70-fa1c5aa292be_1502x702.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Manage scheduling options</figcaption></figure></div><p>If you just want to test things around or if you need a one-time scraper, the <strong><span>Initiate manually</span></strong> tab is already sufficient. You just need to click on <strong><span>Start,</span></strong> and the scraper will begin retrieving the data:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aEVq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aEVq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png 424w, https://substackcdn.com/image/fetch/$s_!aEVq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png 848w, https://substackcdn.com/image/fetch/$s_!aEVq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png 1272w, https://substackcdn.com/image/fetch/$s_!aEVq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aEVq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png" width="1456" height="746" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:746,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:92010,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!aEVq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png 424w, https://substackcdn.com/image/fetch/$s_!aEVq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png 848w, https://substackcdn.com/image/fetch/$s_!aEVq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png 1272w, https://substackcdn.com/image/fetch/$s_!aEVq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72ae9e67-4fa5-48f8-92f7-d1e8281ed2c1_1567x803.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Manually start the scrapers</figcaption></figure></div><p>Very well! You made it to retrieve data with your first scraper made with Scraper Studio.</p><h3>Step #4: Check Runs and Go to IDE Mode</h3><p>To check the status of each scraping run, go to the <strong>Runs</strong> section. This will display all the information you need on each data retrieval performed by the scraper:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!WMcf!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!WMcf!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png 424w, https://substackcdn.com/image/fetch/$s_!WMcf!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png 848w, https://substackcdn.com/image/fetch/$s_!WMcf!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png 1272w, https://substackcdn.com/image/fetch/$s_!WMcf!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!WMcf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png" width="1456" height="548" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:548,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:124884,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!WMcf!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png 424w, https://substackcdn.com/image/fetch/$s_!WMcf!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png 848w, https://substackcdn.com/image/fetch/$s_!WMcf!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png 1272w, https://substackcdn.com/image/fetch/$s_!WMcf!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F40c4290a-3280-43d6-8061-253ecf73e90a_1723x648.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Check runs</figcaption></figure></div><p>The <strong>Actions</strong> section allows you to download the data in different formats. Below is the result in JSON:</p><pre><code><code>[
  {
    "product_name": "Blue Men's Trackhouse Moto GP Team Motorcycle T-Shirt with Contrast Inserts",
    "product_subtitle": "AMIRILORE TRACKHOUSE Blue Diva-Grey Antrachite-NEON Yellow",
    "brand": "KAPPA",
    "price": {
      "value": 67,
      "currency": "USD",
      "symbol": "$"
    },
    "sku": "Style: 322J6HW - Color: A02",
    "available_sizes": [
      "XS",
      "S",
      "M",
      "L",
      "XL",
      "2XL",
      "3XL",
      "4XL",
      "5XL",
      "6XL"
    ],
    "image_urls": [
      "&lt;https://www.kappa.com/cdn/shop/files/UB322J6HWTRHA02_5f5f425b-48d1-4181-af4c-ce863229cbf4.jpg&gt;",
      "&lt;https://www.kappa.com/cdn/shop/files/UB322J6HWTRHA02_aa19b0fa-ca41-4894-ad74-8d408cc31725.jpg&gt;",
      "&lt;https://www.kappa.com/cdn/shop/files/UB322J6HWTRHA02.jpg&gt;",
      "&lt;https://www.kappa.com/cdn/shop/files/UB322J6HWTRHA02_8bd76dc9-0550-48f9-a974-e3c38a4b707e.jpg&gt;"
    ],
    "description": "Product Description GARA. T-shirt for man in polyester fabric. REGULAR FIT. Short sleeve, roundcollar, insert on shoulders in contrast color, sides and shoulders inserts. Omini logo, Team personalizations and sponsors sublimated. TRACKHOUSE.",
    "product_details": "Description Active Jerseys Gender Man Season Spring Composition Main Fabric: Recycled Polyester 100%",
    "input": {
      "url": "&lt;https://www.kappa.com/products/active-jerseys-man-amirilore-trackhouse-blue-diva-grey-antrachite-neon-yellow-322j6hw-trh-a02&gt;"
    }
  }
]</code></code></pre><p>As you can see, the results are exactly how&#8217;d you expect.</p><p>To change the mode to the full IDE one, navigate to the <strong>Code</strong> tab:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FIsG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FIsG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png 424w, https://substackcdn.com/image/fetch/$s_!FIsG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png 848w, https://substackcdn.com/image/fetch/$s_!FIsG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png 1272w, https://substackcdn.com/image/fetch/$s_!FIsG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FIsG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png" width="1456" height="681" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:681,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:150776,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!FIsG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png 424w, https://substackcdn.com/image/fetch/$s_!FIsG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png 848w, https://substackcdn.com/image/fetch/$s_!FIsG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png 1272w, https://substackcdn.com/image/fetch/$s_!FIsG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbfee9ac9-9d16-41ae-bb75-85cfd64f4a50_1817x850.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">Switch to full IDE mode</figcaption></figure></div><p>This is where you can write your custom JavaScript to modify anything you need.</p><p>Terrific! You completed your first scraping project with Bright Data&#8217;s Scraper Studio.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h2>Comparison Table: Scraping via Custom Code Vs Using Scraper Studio</h2><p>The table below summarizes the differences in scraping the same target using a scraper you coded yourself or using Scraper Studio:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!XsLN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!XsLN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png 424w, https://substackcdn.com/image/fetch/$s_!XsLN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png 848w, https://substackcdn.com/image/fetch/$s_!XsLN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png 1272w, https://substackcdn.com/image/fetch/$s_!XsLN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!XsLN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png" width="725" height="199.67376373626374" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:401,&quot;width&quot;:1456,&quot;resizeWidth&quot;:725,&quot;bytes&quot;:132900,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206983382?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!XsLN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png 424w, https://substackcdn.com/image/fetch/$s_!XsLN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png 848w, https://substackcdn.com/image/fetch/$s_!XsLN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png 1272w, https://substackcdn.com/image/fetch/$s_!XsLN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F54f4b6db-c1e0-48d7-9e64-9b70e8807a84_1857x511.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">Comparing manually scraping Vs using Scraper Studio on the same target website</figcaption></figure></div><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Conclusion</h2><p>In this article, you discovered what <a href="https://get.brightdata.com/twsc-scraper-studio">Bright Data&#8217;s Scraper Studio</a> is, its features and best use cases, and how easy it is to use it.</p><p>As you&#8217;ve learned, Scraper Studio is an ideal solution for building a web scraper without any infrastructure overhead, but also without managing selectors manually. Thanks to it, you don&#8217;t have to deal with common challenges like infrastructure maintenance, proxy rotation, and anti-bot bypass, but also with DOM changes.</p><p>In a matter of a few minutes, you can go from a prompt written in natural language to a production-ready scraper, with automated data delivery to Amazon S3, Snowflake, and many other destinations, and with the possibility to schedule your scrapers and manage DOM changes without manual overhead.</p><p>So, let us know in the comments: have you ever tried Scraper Studio? What&#8217;s your experience with it?</p><div><hr></div><p><em>Did you like this article? Share it with someone who might find it useful and get a discount on paid plans.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/bright-data-scraper-studio?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.scraping.club/p/bright-data-scraper-studio?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div><hr></div>]]></content:encoded></item><item><title><![CDATA[Why Your RAG Pipelines Are Only as Good as Your Data Acquisition Layer]]></title><description><![CDATA[A deep dive into what RAG actually requires, where web search integration falls short, and why scraping is the only retrieval layer that scales.]]></description><link>https://www.scraping.club/p/rag-pipeline-web-scraping</link><guid isPermaLink="false">https://www.scraping.club/p/rag-pipeline-web-scraping</guid><dc:creator><![CDATA[Federico Trotta]]></dc:creator><pubDate>Sun, 02 Aug 2026 19:28:25 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/9a964356-43bf-4581-99d7-ba6e43bfaf5b_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Large language models have a memory problem, but it&#8217;s not in the conventional sense you may think of. The problem is that the knowledge baked into a model&#8217;s weights is static, bounded by its training cutoff, blind to proprietary data, and structurally incapable of being updated without retraining.</p><p>Retrieval Augmented Generation (RAG) was designed to solve exactly such limitations. By decoupling what the model knows from what it can access at query time, RAG gives LLMs the ability to reason over fresh, domain-specific, and proprietary knowledge without any retraining. In theory, this closes the knowledge gap entirely. In practice, the quality of a RAG system is bound entirely by the quality of its retrieval layer, and this is where most implementations break down.</p><p>Indeed, many teams think that the solution is already offered by web search tools that, nowadays, are integrated in all commercial LLMs. This article makes the case for why that is the wrong call and why web scraping is the right retrieval layer that RAG actually requires.</p><p>Let&#8217;s get into it!</p><blockquote><p>Give your AI a web data layer &#8211; <strong><a href="https://visit.decodo.com/rE0PQB">Decodo&#8217;s Web Scraping API</a></strong> turns any site into clean, structured data your models can actually use.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://visit.decodo.com/rE0PQB" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png" width="724" height="362" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;normal&quot;,&quot;height&quot;:512,&quot;width&quot;:1024,&quot;resizeWidth&quot;:724,&quot;bytes&quot;:716985,&quot;alt&quot;:&quot;&quot;,&quot;title&quot;:&quot;&quot;,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/204450518?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!aRfI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 424w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 848w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1272w, https://substackcdn.com/image/fetch/$s_!aRfI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F33ef41f8-3e73-4fa1-a516-a17d90e53e20_1024x512.png 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption"></figcaption></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://visit.decodo.com/rE0PQB&quot;,&quot;text&quot;:&quot;Activate starter plan&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://visit.decodo.com/rE0PQB"><span>Activate starter plan</span></a></p><div><hr></div></blockquote><h2>What is RAG?</h2><p>Retrieval Augmented Generation (RAG<strong>)</strong> is an architectural pattern in natural language processing that augments the inference pipeline of a generative large language model (LLM). It does so by dynamically injecting externally retrieved, contextually relevant information into the prompt at query time. In simple terms, rather than relying exclusively on knowledge encoded in model weights during training, RAG decouples parametric memory (what the model learned) from non-parametric memory (an external, queryable knowledge store), combining both at runtime. This produces models&#8217; outputs that are accurate and grounded.</p><p>The canonical RAG pipeline operates in two distinct phases:</p><ol><li><p><strong>Retrieval phase</strong>: Given a user query <em>q</em>, a retriever component encodes <em>q</em> into a vector embedding database and performs approximate nearest-neighbor (ANN) search against a pre-indexed corpus of document chunks.</p></li><li><p><strong>Generation phase</strong>: The retrieved passages are concatenated with the original query and injected into the LLM&#8217;s context window as an augmented prompt. The model, then, conditions its output token generation on both its parametric weights and the retrieved evidence, producing a response that is grounded in the supplied documents.</p></li></ol><p>Modern RAG implementations have evolved beyond this baseline. Advanced RAG patterns introduce query rewriting, hypothetical document embeddings (HyDE), re-ranking layers, and recursive or agentic retrieval loops. Modular RAG frameworks further decompose the pipeline into interchangeable components, enabling fine-grained control over each retrieval and generation step.</p><p>At the infrastructure level, modern RAG pipelines rely on three core components working in concert:</p><ul><li><p>A vector database for storing and querying document embeddings at scale.</p></li><li><p>An embedding model responsible for encoding both documents and queries into a shared latent semantic space.</p></li><li><p>A generative model (the LLM) that synthesizes retrieved evidence into a coherent, task-specific response.</p></li></ul><p>Below is an image that shows the high-level architecture:</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!JGU4!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!JGU4!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png 424w, https://substackcdn.com/image/fetch/$s_!JGU4!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png 848w, https://substackcdn.com/image/fetch/$s_!JGU4!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png 1272w, https://substackcdn.com/image/fetch/$s_!JGU4!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!JGU4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png" width="1118" height="554" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/efc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:554,&quot;width&quot;:1118,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:932771,&quot;alt&quot;:&quot;A RAG system schema by Federico Trotta&quot;,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:&quot;https://substack.thewebscraping.club/i/206036182?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="A RAG system schema by Federico Trotta" title="A RAG system schema by Federico Trotta" srcset="https://substackcdn.com/image/fetch/$s_!JGU4!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png 424w, https://substackcdn.com/image/fetch/$s_!JGU4!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png 848w, https://substackcdn.com/image/fetch/$s_!JGU4!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png 1272w, https://substackcdn.com/image/fetch/$s_!JGU4!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fefc3d14a-8eba-4e66-be82-8d8d55c9905d_1118x554.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg" class="icon-noB79L"><g><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image buttonBase-GK1x3M"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2 icon-noB79L"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">A RAG system schema</figcaption></figure></div><h2>Why LLMs Need RAG</h2><p>During the training phase, an LLM compresses knowledge from its training corpus into billions of parameters. This process is inherently lossy because the model doesn&#8217;t store facts verbatim: it learns statistical associations between tokens. As a result of this process:</p><ul><li><p><strong>Factual recall is probabilistic, not deterministic</strong>: The model may confidently produce a plausible-sounding but incorrect answer on a user query, because it&#8217;s sampling from a learned distribution rather than retrieving from a verifiable source. The process of producing a plausible-sounding but incorrect response is called hallucination.</p></li><li><p><strong>Knowledge is frozen at the training cutoff:</strong> Any event, document, regulation, product update, or research finding that postdates the model&#8217;s training window is entirely invisible to the model. For enterprise applications where data changes frequently, this is a critical failure mode. This means that if you query a model on something that occurred after its training ended, it will surely hallucinate the response.</p></li><li><p><strong>Specific, private, or proprietary knowledge is absent by design:</strong> Internal documentation, CRM records, legal contracts, and domain-specific corpora are never part of a pre-training dataset.</p></li></ul><p>RAG was designed precisely to address these constraints that are inherent to LLMs. Below is how RAG maps to concrete business scenarios that enterprises face every day.</p><h3>Documentation-Aware Support Bots</h3><p>One of the most immediate and impactful enterprise applications of RAG is the construction of intelligent support bots grounded in a product&#8217;s technical documentation. Consider a SaaS company with several pages of technical docs, API references, changelogs, and troubleshooting guides. An LLM cannot reliably answer user questions about that product. What happens is that it either lacks the knowledge entirely or, worse, generates plausible-but-wrong instructions that erode user trust.</p><p>With RAG, every user query triggers a retrieval step against the indexed documentation corpus. The bot responds based on what the docs <em>actually say</em>, not on what the model statistically associates with similar-sounding topics.</p><p>The same pattern extends naturally to internal knowledge bases like HR policy portals, IT helpdesks, onboarding assistants, and legal FAQ systems, where the source of truth is a controlled, company-owned corpus rather than the public web.</p><h3>Legal and Regulatory Intelligence on Recent Developments</h3><p>The legal industry represents one of the clearest demonstrations of RAG&#8217;s necessity. Why? Because court rulings, regulatory guidance, legislative amendments, and compliance frameworks are published continuously. Legal research on an LLM is inherently dangerous because its training cutoff means the model is blind to any case law or regulation published after that date. And, in law, a single overlooked precedent can have material consequences.</p><p>RAG enables a fundamentally different architecture: legal documents, newly published court opinions, and regulatory updates are scraped, processed, and indexed into the retrieval layer as soon as they are available. When a lawyer or compliance officer queries the system, the retriever fetches the latest relevant documents, and the LLM synthesizes a grounded answer.</p><h3>Competitive Intelligence and Market Monitoring</h3><p>Enterprises routinely need to <a href="https://app.notion.com/p/TWS-How-to-Use-Web-Scraping-for-RAG-38b945fea5028092b6baca3f49d54755?pvs=21">track competitor activity, industry trends, and market signals</a> across news sources, press releases, job postings, and public filings. This information is inherently ephemeral because a competitor&#8217;s product launch announcement published yesterday is invisible to any LLM. By building a RAG pipeline that continuously ingests and indexes targeted public web sources, organizations can deploy analysts-in-the-loop systems that answer strategic queries based on fresh, real-world evidence rather than stale parametric knowledge.</p><h2>Why Web Search Integration Is Not Enough</h2><p>On the side of the architecture, the retrieval part of RAG systems can be built in different ways. The common ones are two:</p><ul><li><p>Creating a knowledge base of documents (like a plethora of PDFs and similar).</p></li><li><p>Retrieving the needed information from the live web.</p></li></ul><p>The knowledge base of documents is generally something that companies have already built over the years. So, let&#8217;s focus on the web retrieval part&#8212;which is also the most interesting one for us, scraping professionals.</p><p>Today, every commercial LLM has a web search tool integrated into it. So, at first glance, it seems to be the right tool to use for creating RAG systems. After all, if the model can query the live web, doesn&#8217;t that solve the knowledge cutoff problem entirely? The answer is: partially, and only for a narrow subset of enterprise needs. This is because the web search integration and RAG are fundamentally different mechanisms that solve different problems. Below are the main differences between the two:</p><ul><li><p><strong>Web search operates on public web content</strong>: First of all, a web search tool cannot reach your internal knowledge base, your proprietary documentation, your CRM history, or your company&#8217;s legal contracts. Sure, some companies put their internal knowledge on the web with restricted access, but this encompasses only a few cases. Also, the truth is that no company actually puts all its documentation on a website, even if with restricted access (think of legal contracts, for example).</p></li><li><p><strong>Web search is non-deterministic and uncontrolled by design</strong>: When an LLM issues a search query, the results it retrieves depend on the search engine&#8217;s ranking algorithm, which is commercially influenced and optimized for general web traffic, not for your specific domain. In a RAG system, instead, you control the corpus. In other words, you decide what documents are indexed, how they are chunked, how they are weighted, and when they are refreshed. This level of governance is not optional in regulated industries where compliance is a requirement. Indeed, an enterprise cannot defend an AI-generated legal or financial output that was grounded in whatever Google happened to rank first. Also, no one guarantees that the web search is actually able to read the content on a website that is highly protected. In other words, very often happens that the web search tool can&#8217;t overcome the anti-bot systems on a target website, and the model simply hallucinates the response to your query (and you don&#8217;t even notice!).</p></li><li><p><strong>The retrieval mechanism itself is categorically different</strong>: Web search tools rely on keyword-based and PageRank-style relevance signals. RAG retrieval, by contrast, operates in a dense semantic vector space. This means that it finds documents that are conceptually relevant to a query even when they share no exact keywords with it. For domain-specific queries, this distinction in retrieval precision directly impacts the quality of the generated response.</p></li><li><p><strong>Web search tools introduce latency, rate limits, and external dependencies</strong>: A RAG system backed by an internal vector store is a self-contained, auditable, scalable infrastructure component. A system that depends on a web search tool at every call is coupled to external services, subject to availability failures, and difficult to reproduce or audit</p></li><li><p><strong>Web search tools don&#8217;t solve the hallucination problem:</strong> Web search tools increase the probability that relevant information surfaces in the context window, but if the search query is poorly formed, if the right page isn&#8217;t indexed, or if the model misreads the retrieved snippet, hallucination remains entirely possible. RAG, when implemented with rigorous chunking strategies, high-quality embeddings, and re-ranking layers, provides a far more controlled and reliable grounding mechanism.</p></li></ul><p>In short, web search tools make general-purpose LLMs more useful for casual queries. This means that an LLM equipped with a web search tool is useful to respond to basic queries that rely on data recently published on the web. However, they can&#8217;t replace RAG systems for any organization that requires precision, privacy, control, and auditability over wide and specific knowledge.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.youtube.com/@thewebscrapingclub&quot;,&quot;text&quot;:&quot;Check the TWSC YouTube Channel&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.youtube.com/@thewebscrapingclub"><span>Check the TWSC YouTube Channel</span></a></p><div><hr></div><h2>Web Scraping as the Data Acquisition Layer for RAG</h2><p>The limitations of web search tools presented in the previous paragraph are structural. The solution to overcome them is to use web scraping as the retrieval layer for your RAG pipelines. This is because by using web scraping, you are not querying an external search engine and accepting whatever it returns. You get direct, programmatic access to the content of any publicly accessible web page, on your own schedule, under your own control.</p><p>So, let&#8217;s see how scraping the web changes the dynamic of retrieving content from the web for RAG purposes.</p><h3>Full Control Over the Knowledge Corpus</h3><p>When you build a RAG pipeline fed by a web scraper, you are the one defining the boundaries of your knowledge base. You decide which domains, subdomains, and URL patterns are in scope. You decide how frequently each source is re-crawled, which pages are included, which are filtered out, and which are prioritized during indexing. None of this is possible with web search integration, where the retrieval scope is, by definition, the entire public web as ranked by an opaque external algorithm.</p><p>This level of corpus governance is a prerequisite for any enterprise deployment where the knowledge base must be auditable, bounded, and defensible.</p><p>Also, using web scraping as the retrieval layer doesn&#8217;t mean that you have to code and manage your own scraping infrastructure&#8212;which could cause overheads as well as a huge amount of investments. The scraping industry today is mature enough to offer you:</p><ul><li><p>Pre-scraped datasets whose data can be refreshed based on your needs.</p></li><li><p>Scraping infrastructure as-a-service. In other words, you tell the provider the content to scrape, and their professionals do the job for you, providing you with ready-for-analytics data.</p></li></ul><h3>Accessing Content That Search Engines Cannot Deliver</h3><p>Public search engines index a fraction of the publicly accessible web, and they do so on their own timeline and according to their own crawl priorities. Pages that were published recently, that exist on domains with low authority, that are dynamically rendered via JavaScript, or that are structured in ways that resist standard crawling are routinely underrepresented or absent from search engine indexes entirely.</p><p>A purpose-built web scraper is not subject to any of these constraints. It can be engineered to handle JavaScript-rendered single-page applications using headless browser automation tools such as Playwright or Puppeteer, capturing <a href="https://substack.thewebscraping.club/p/scraping-with-llms-gpt-vision">the fully hydrated DOM rather than the bare HTML</a> shell that a naive HTTP request would return. It can navigate paginated content, follow internal links recursively to achieve full site coverage, and process non-HTML formats.</p><p>Now, you can also think that a plausible solution is to put a target URL into the prompt and ask the LLM to retrieve the content via the web search tool. But due to the nature of the web search tool, this is not a reliable solution, because, as discussed previously:</p><ul><li><p>The web search tool may not be able to retrieve the content if the domain is highly protected by anti-bots.</p></li><li><p>The use of a web search tool is non-deterministic due to how LLMs work. This means that the LLM can respond without actually retrieving the content. Or, in some cases, the LLM can respond, but its response can be a mix of content retrieved from the target URL and other content that the web search tool has retrieved from the web. In other words, the LLM can autonomously decide to retrieve the content, for a given query, from the target URL you passed into the prompt, and from other content that the web search tool retrieves from the web, based on the query.</p></li></ul><p>But for RAG pipelines that need comprehensive, deep coverage of a specific web domain, the right degree of control over the crawling behavior is a fundamental feature, often a non-negotiable one.</p><div><hr></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://substack.thewebscraping.club/p/consulting&quot;,&quot;text&quot;:&quot;Need help with your scraping project?&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://substack.thewebscraping.club/p/consulting"><span>Need help with your scraping project?</span></a></p><div><hr></div><h3>Deterministic, Reproducible Retrieval</h3><p>One of the most underappreciated properties of a scraping-fed RAG system is reproducibility. When a user queries a RAG system backed by a web-scraped and version-controlled vector store, the retrieval behavior is deterministic: the same query against the same index returns the same results. This makes the system testable, debuggable, and auditable in ways that a live-search-grounded system categorically is not.</p><p>In a search-integrated LLM, the retrieved content is ephemeral. Specifically speaking, the content exists only in the context window of a single inference call. This means that it cannot be logged in a structured way, and may differ entirely if the same query is issued five minutes later because the search ranking shifted. In a scraping-fed RAG system, instead, every document in the index has a known origin, a known ingestion timestamp, and a known embedding. If an output is questioned, you can trace it back to the exact chunk, the exact source page, and the exact crawl that produced it. This traceability is the operational backbone of trustworthy enterprise AI.</p><h3>Freshness on Your Terms</h3><p>The knowledge cutoff problem that cripples base LLMs does not disappear with a static RAG corpus. A vector store that was indexed six months ago and never refreshed is, from a knowledge currency standpoint, equivalent to a model with a six-month-old training cutoff. <strong>Web scraping solves this by making</strong> <strong>freshness a configurable, automated pipeline</strong>.</p><p>A production RAG scraping pipeline typically implements a tiered crawl schedule calibrated to the update frequency of each source: high-volatility sources like breaking news feeds, regulatory update pages, earnings release portals, and product changelog endpoints are re-crawled on a schedule ranging from hourly to daily. Lower-volatility sources may be re-crawled weekly or triggered by change detection signals. When new content is detected, only the affected chunks are re-embedded and re-indexed, making incremental updates computationally efficient even at scale.</p><p>This architecture gives enterprises something that neither a base LLM nor a search-integrated model can offer: a knowledge base with a freshness SLA<strong>.</strong> This is a contractual guarantee that the information grounding the system&#8217;s outputs is no older than a defined threshold.</p><h3>Clean, Structured Text as a First-Class Output</h3><p>Web scraping, when implemented correctly, does not simply dump raw HTML into the processing pipeline. A <a href="https://substack.thewebscraping.club/p/how-to-use-llms-data-extraction-unstructured-text">production-grade scraping pipeline extracts clean, structured</a>, semantically meaningful text from the web.</p><p>This matters enormously for chunking quality, and by extension, for retrieval quality. Recall that the integrity of every chunk is bounded by the integrity of the raw text it was derived from. A scraper that faithfully extracts clean, well-structured prose gives the downstream chunker the structural signals it needs to produce semantically coherent chunks. A scraper that emits raw HTML soup, or that fails to distinguish between primary content and navigational boilerplate, contaminates the entire corpus with noise that no chunking strategy can fully recover from.</p><p>Furthermore, this is another point of distinction with web search tools. In another article here at the web scraping club, we already covered the <a href="https://substack.thewebscraping.club/i/184656666/why-markdown-is-a-perfect-data-format-for-llms-and-ai-ready-scrapers-use-it-too">importance of feeding LLMs in markdown, rather than in HTML</a>. Based on this, consider that:</p><ul><li><p>Every scraping pipeline can be managed to return data in any format you prefer. It can be a structured JSON, markdown, or anything else.</p></li><li><p>Web search tools go directly to &#8220;read&#8221; the HTML of the target web pages. This means that the LLM responds based also on footers, banners, and anything in between. And this can lead the model to confusion as it responds to users&#8217; queries.</p></li></ul><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">The Web Scraping Club is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><div><hr></div><h2>Conclusion</h2><p>RAG is an architectural commitment and, as such, it must be preceded by a deliberate choice to build a system where outputs are grounded in a controlled and continuously refreshed knowledge base. But that commitment is only as strong as the pipeline feeding it.</p><p>Web search integration tools are not that pipeline. This is because they are optimized for general-purpose queries, not for the precision, governance, and reproducibility that enterprises demand.</p><p>Web scraping, on the other hand, gives you full ownership over what enters the knowledge base, how fresh it is, how it is structured, and how it can be traced back when an output is questioned.</p><p>The next step is to start thinking of your scraping infrastructure not as a standalone data collection tool, but as the retrieval backbone of an intelligent system.</p><p>So, let us know in the comments: are you using web scraping for RAG purposes?</p><div><hr></div><p><em>Did you like this article? Share it with someone who might find it useful and get a discount on paid plans.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.scraping.club/p/rag-pipeline-web-scraping?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.scraping.club/p/rag-pipeline-web-scraping?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><div><hr></div>]]></content:encoded></item></channel></rss>