{"id":39651,"date":"2026-07-14T16:13:02","date_gmt":"2026-07-14T16:13:02","guid":{"rendered":"https:\/\/nodemaven.com\/?p=39651"},"modified":"2026-07-14T16:13:03","modified_gmt":"2026-07-14T16:13:03","slug":"openclaw-web-scraping-guide","status":"publish","type":"post","link":"https:\/\/nodemaven.com\/ru\/blog\/openclaw-web-scraping-guide\/","title":{"rendered":"OpenClaw web scraping guide: Build AI scrapers with residential proxies"},"content":{"rendered":"\n<p>AI agents are changing how people pull data off the web. Instead of writing brittle CSS selectors, you describe what you want and let an agent figure out how to get it. OpenClaw is one of the frameworks driving that shift.<\/p>\n\n\n\n<p>This guide walks through web scraping with OpenClaw from a clean install to a production-ready scraper. You&#8217;ll learn what OpenClaw actually is, how its scraping pipeline works under the hood, and why the proxy layer underneath your requests matters just as much as the code on top of it.<\/p>\n\n\n\n<p>By the end, you&#8217;ll have a working OpenClaw coding skill web scraping product listing pipeline you can point at real e-commerce pages.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p data-pm-slice=\"0 0 []\"><strong>Build reliable OpenClaw scrapers with premium proxies. Start with NodeMaven for just $3.50 and get 750 MB of proxy traffic<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\/\"\n            >\n            Start trial        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-what-is-openclaw\">What is OpenClaw?<\/h2>\n\n\n\n<p>OpenClaw is an open-source AI agent framework. Think of it as a gateway that connects a language model to the outside world: your browser, your file system, your messaging apps, and any tool you register as a \u201cskill\u201d.<\/p>\n\n\n\n<p><strong>At its core, OpenClaw has four pieces:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Gateway<\/strong> \u2014 the daemon that runs continuously and routes messages between channels, the model, and tools<\/li>\n\n\n\n<li><strong>Brain<\/strong> \u2014 the LLM provider you connect (Anthropic, OpenAI, Google, or a local model)<\/li>\n\n\n\n<li><strong>Hands<\/strong> \u2014 the tools the agent can call: browser control, shell commands, file access, HTTP requests<\/li>\n\n\n\n<li><strong>Skills<\/strong> \u2014 markdown instruction files (<strong>SKILL.md<\/strong>) that teach the agent how and when to use a tool for a specific task<\/li>\n<\/ul>\n\n\n\n<p>Of the four, OpenClaw web scraping skills are the piece that&#8217;s most important for this guide.<\/p>\n\n\n\n<p>An OpenClaw Coding Skill is just a folder with a <strong>SKILL.md<\/strong> file and, usually, a supporting script. When you ask the agent to do something that matches a skill&#8217;s description, it reads the instructions and follows them.<\/p>\n\n\n\n<p>This is what makes web scraping with OpenClaw feel fundamentally different from Playwright or Selenium. Those are libraries you import into your own script and drive line by line. OpenClaw flips the relationship: the agent reasons about the page using an accessibility tree, decides how to navigate, and calls your skill&#8217;s code when it needs deterministic, repeatable extraction logic.<\/p>\n\n\n\n<p>You still write real code, but the agent decides when and how to run it.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Feature<\/strong><\/td><td><strong>OpenClaw<\/strong><\/td><td><strong>Playwright<\/strong><\/td><td><strong>Selenium<\/strong><\/td><\/tr><\/thead><tbody><tr><td>Control model<\/td><td>Agent decides actions from natural-language goals<\/td><td>You script every action explicitly<\/td><td>You script every action explicitly<\/td><\/tr><tr><td>Setup<\/td><td>CLI + onboarding wizard, skills registry<\/td><td>npm\/pip package<\/td><td>Language-specific bindings<\/td><\/tr><tr><td>Adaptivity<\/td><td>Reasons about page structure, adapts to layout changes<\/td><td>Breaks when selectors change<\/td><td>Breaks when selectors change<\/td><\/tr><tr><td>Extensibility<\/td><td>Skills (SKILL.md + scripts)<\/td><td>Custom scripts<\/td><td>Custom scripts<\/td><\/tr><tr><td>Best for<\/td><td>Agent-driven extraction, messy or changing sites<\/td><td>Fixed, well-understood sites<\/td><td>Fixed, well-understood sites<\/td><\/tr><tr><td>Proxy handling<\/td><td>Configured per-skill or per-agent<\/td><td>Configured per-context<\/td><td>Configured per-driver<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>This kind of adaptability is the whole appeal of an OpenClaw web scraping framework over a fixed script. The benefit of this architecture is resilience. A traditional scraper that hardcodes <strong>.product-title<\/strong> breaks the moment a site redesigns its markup.<\/p>\n\n\n\n<p>An OpenClaw web scraping framework built around accessibility trees and agent reasoning tends to survive small layout changes.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-how-openclaw-web-scraping-works\">How OpenClaw web scraping works<\/h2>\n\n\n\n<p>Before touching a terminal, it helps to see the full request path. A typical OpenClaw web scraping job looks like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"683\" height=\"1024\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc1-683x1024.png\" alt=\"OpenClaw web scraping path\" class=\"wp-image-39652\" style=\"aspect-ratio:0.6666627564606379;width:329px;height:auto\" srcset=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc1-683x1024.png 683w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc1-200x300.png 200w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc1-768x1152.png 768w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc1-8x12.png 8w, https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc1.png 1024w\" sizes=\"auto, (max-width: 683px) 100vw, 683px\" \/><\/figure>\n\n\n\n<p><strong>Walking through each step:<\/strong><\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-user-request\">User request<\/h3>\n\n\n\n<p>You tell the agent what you want in plain language: \u201cscrape the product listings on this page and give me name, price, and rating\u201d<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-openclaw-agent\">OpenClaw agent<\/h3>\n\n\n\n<p>The Gateway routes this to your configured model, which matches the request against installed skills and picks the right one.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-browser-fetch-tool\">Browser \/ Fetch tool<\/h3>\n\n\n\n<p>The skill&#8217;s script runs, either as a lightweight HTTP fetch or, for JavaScript-heavy pages, a full browser session.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-nodemaven-residential-proxy\">NodeMaven residential proxy<\/h3>\n\n\n\n<p>Every outbound request is routed through a residential IP instead of your server&#8217;s own address, so the target site sees ordinary consumer traffic.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-target-website\">Target website<\/h3>\n\n\n\n<p>The request reaches the site looking like it came from a real visitor in a real location.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-structured-data\">Structured data<\/h3>\n\n\n\n<p>The response is parsed, validated against your schema, and handed back to the agent as JSON.<\/p>\n\n\n\n<p>That proxy hop in the middle is easy to skip in a demo and expensive to skip in production. We&#8217;ll get to why in the next section.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-why-residential-proxies-matter\">Why residential proxies matter<\/h2>\n\n\n\n<p>Scraping without a proxy strategy works right up until it doesn&#8217;t. Here&#8217;s what you&#8217;re actually up against:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>IP reputation.<\/strong> Data centers use a narrow range of known IP blocks. Anti-bot systems maintain lists of these and block or challenge them on sight.<\/li>\n\n\n\n<li><strong>Rate limits<\/strong>. Even a \u201cclean\u201d IP gets throttled once request volume looks non-human.<\/li>\n\n\n\n<li><strong>CAPTCHA.<\/strong> Suspicious traffic patterns trigger challenge pages that a script can&#8217;t solve on its own.<\/li>\n\n\n\n<li><strong>JavaScript rendering<\/strong>. Many sites only reveal real content after client-side scripts run, which single-request scrapers never trigger.<\/li>\n\n\n\n<li><strong>Browser fingerprinting<\/strong>. TLS handshakes, header order, and canvas fingerprints all feed into a trust score for your connection.<\/li>\n\n\n\n<li><strong>Geo restrictions.<\/strong> Some content only renders for visitors in a specific country, region, or even city.<\/li>\n\n\n\n<li><strong>Session persistence.<\/strong> Logged-in scraping and multi-step checkouts break if your IP changes mid-session.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-different-proxy-types-solve-different-pieces-of-that-list\">Different proxy types solve different pieces of that list:<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Proxy type<\/strong><\/td><td><strong>IP source<\/strong><\/td><td><strong>Stability<\/strong><\/td><td><strong>Best for<\/strong><\/td><\/tr><\/thead><tbody><tr><td>Datacenter<\/td><td>Cloud hosting providers<\/td><td>High speed, low trust<\/td><td>Non-sensitive, low-block-risk targets<\/td><\/tr><tr><td><a href=\"https:\/\/nodemaven.com\/proxies\/residential-proxies\/\">Residential<\/a><\/td><td>Real household devices<\/td><td>Slower, high trust<\/td><td>E-commerce, SERPs, social platforms<\/td><\/tr><tr><td><a href=\"https:\/\/nodemaven.com\/proxies\/isp-proxies\/\">ISP<\/a><\/td><td>Registered to an ISP, hosted in a data center<\/td><td>Datacenter speed, residential trust<\/td><td>Logged-in sessions, long-running jobs<\/td><\/tr><tr><td><a href=\"https:\/\/nodemaven.com\/proxies\/mobile-proxies\/\">Mobile<\/a><\/td><td>Carrier networks (3G\/4G\/5G)<\/td><td>Highest trust, variable speed<\/td><td>Extremely aggressive anti-bot targets<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>For most OpenClaw scraping tool setups, this is the breakdown:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>E-commerce scraping<\/strong> \u2192 residential, rotating per request, for broad catalog pulls<\/li>\n\n\n\n<li><strong>Search engines<\/strong> \u2192 residential, rotating, since SERPs fingerprint aggressively<\/li>\n\n\n\n<li><a href=\"https:\/\/nodemaven.com\/use-cases\/ai-agent-proxy\/\"><strong>AI agents<\/strong><\/a> making autonomous requests \u2192 residential with a quality filter, since agents can&#8217;t manually solve a CAPTCHA mid-run<\/li>\n\n\n\n<li><a href=\"https:\/\/nodemaven.com\/use-cases\/social-media-proxies\/\"><strong>Social media<\/strong><\/a> \u2192 residential or mobile, sticky sessions, since these platforms track session continuity closely<\/li>\n\n\n\n<li><strong>Logged-in sessions<\/strong> \u2192 ISP or sticky residential, since the IP needs to hold steady for the length of the session<\/li>\n<\/ul>\n\n\n\n<p>This is where <a href=\"https:\/\/nodemaven.com\/\">NodeMaven<\/a> fits into an OpenClaw for web scraping setup.<\/p>\n\n\n\n<p>It gives you residential and mobile proxies from the same dashboard, with automatic IP rotation for high-volume jobs.<\/p>\n\n\n\n<p>The IP pool sits above 30 million residential addresses across 190+ countries and 1,400+ cities, and every <a href=\"https:\/\/nodemaven.com\/features\/ip-quality-filter\/\">IP passes a quality filter<\/a> that keeps the clean rate above 95%.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p data-pm-slice=\"0 0 []\"><strong>Avoid blocks and CAPTCHAs with OpenClaw. Try NodeMaven for $3.50 and get 750 MB of residential and mobile proxy traffic<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\/\"\n            >\n            Start trial        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-installing-openclaw\">Installing OpenClaw<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-requirements\">Requirements<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Node.js 22.19+ (Node 24 is recommended) \u2014 Node 23 is not supported<\/li>\n\n\n\n<li>Python 3.10+ for the scraper scripts in this guide<\/li>\n\n\n\n<li>An API key from a model provider: Anthropic, OpenAI, Google, or a local model endpoint<\/li>\n\n\n\n<li>macOS, Linux, or Windows (Windows users should run OpenClaw under WSL2)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-installation\">Installation<\/h3>\n\n\n\n<p>The fastest path is the hosted installer script. It detects your OS, installs Node if it&#8217;s missing, installs OpenClaw, and launches onboarding automatically:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"curl%20-fsSL%20https%3A%2F%2Fopenclaw.ai%2Finstall.sh%20%7C%20bash\"><\/code><\/pre><\/figure>\n\n\n<p>On Windows (PowerShell):<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"iwr%20-useb%20https%3A%2F%2Fopenclaw.ai%2Finstall.ps1%20%7C%20iex\"><\/code><\/pre><\/figure>\n\n\n<p>If you already have a supported Node version and prefer to manage the install yourself:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"npm%20install%20-g%20openclaw%40latest%0Aopenclaw%20onboard%20--install-daemon\"><\/code><\/pre><\/figure>\n\n\n<p>Tip: If <strong>sharp<\/strong> fails to build during install (common on macOS with a Homebrew <strong>libvips<\/strong> already installed), force prebuilt binaries instead of compiling from source:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"SHARP_IGNORE_GLOBAL_LIBVIPS%3D1%20npm%20install%20-g%20openclaw%40latest\"><\/code><\/pre><\/figure>\n\n\n<p><strong>openclaw onboard &#8211;install-daemon<\/strong> does three things:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Connects your model provider \u2014 you paste in an API key when prompted<\/li>\n\n\n\n<li>Installs the Gateway as a background service (systemd on Linux, launchd on macOS) so it survives reboots<\/li>\n\n\n\n<li>Walks you through optional channel and skill setup, which you can safely skip for now with <strong>openclaw configure<\/strong> available later<\/li>\n<\/ol>\n\n\n\n<p>Common mistake: Running the plain <strong>openclaw onboard<\/strong> without <strong>&#8211;install-daemon<\/strong> leaves the Gateway running only in your current terminal session. Close the terminal and the agent stops. Always add the flag if you want OpenClaw to keep running.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-verification\">Verification<\/h3>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"openclaw%20--version%0Aopenclaw%20status%0Aopenclaw%20doctor\"><\/code><\/pre><\/figure>\n\n\n<p><strong>openclaw status<\/strong> confirms the Gateway daemon is up and listening, normally on port <strong>18789<\/strong>. <strong>openclaw doctor<\/strong> checks for common misconfiguration: missing API keys, blocked ports, or risky permission settings. If either command comes back with errors, fix those before moving on, since every skill and scraper below depends on a healthy Gateway.<\/p>\n\n\n\n<p><strong>Warning:<\/strong> Never expose port 18789 on a public-facing server without authentication in front of it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-configuring-openclaw-for-web-scraping\">Configuring OpenClaw for web scraping<\/h2>\n\n\n\n<p>OpenClaw&#8217;s configuration lives in a single JSON file at <strong>~\/.openclaw\/openclaw.json<\/strong>, but for scraping work you mostly interact with it through environment variables and skill-level settings, not by hand-editing that file.<\/p>\n\n\n\n<p>Create a <strong>.env<\/strong> file inside your skill&#8217;s working directory:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"yaml\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-yaml\" data-rhino-code=\"%23%20Model%20provider%0AANTHROPIC_API_KEY%3Dsk-ant-your-key-here%0AOPENCLAW_MODEL%3Dclaude-sonnet-4-6%0A%0A%23%20NodeMaven%20residential%20proxy%0ANODEMAVEN_USERNAME%3Dyour_nodemaven_username%0ANODEMAVEN_PASSWORD%3Dyour_nodemaven_password%0ANODEMAVEN_HOST%3Dgate.nodemaven.com%0ANODEMAVEN_PORT%3D8080\"><\/code><\/pre><\/figure>\n\n\n<p><strong>Here&#8217;s what each variable does:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>ANTHROPIC_API_KEY<\/strong> \u2014 authenticates the agent&#8217;s model calls; swap for OPENAI_API_KEY or another provider&#8217;s variable if you&#8217;re using a different model<\/li>\n\n\n\n<li><strong>OPENCLAW_MODEL<\/strong> \u2014 the default model the agent uses; a fast mid-tier model is usually enough for scraping tasks, since you don&#8217;t need the most expensive model to decide &#8220;click next page&#8221;<\/li>\n\n\n\n<li><strong>NODEMAVEN_USERNAME \/ NODEMAVEN_PASSWORD<\/strong> \u2014 your proxy credentials from the NodeMaven dashboard; the username can also encode country, city, and session parameters directly (for example <strong>username-country-us-sid-98213<\/strong>)<\/li>\n\n\n\n<li><strong>NODEMAVEN_HOST \/ NODEMAVEN_PORT<\/strong> \u2014 NodeMaven&#8217;s gateway address; port 8080 is used for HTTP, 1080 for SOCKS5<\/li>\n<\/ul>\n\n\n\n<p>Skills read secrets through <strong>skills.entries.*.env<\/strong> in OpenClaw&#8217;s config, which injects them into the skill&#8217;s process for that turn only, not into a shared sandbox. That keeps your proxy password out of prompts and logs.<\/p>\n\n\n\n<p>Once your <strong>.env<\/strong> is in place, verify the proxy connection independently of OpenClaw before wiring it into a skill:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"curl%20-x%20http%3A%2F%2FNODEMAVEN_USERNAME%3ANODEMAVEN_PASSWORD%40gate.nodemaven.com%3A8080%20-L%20https%3A%2F%2Fifconfig.me\"><\/code><\/pre><\/figure>\n\n\n<p>If that returns an IP address that isn&#8217;t your own, the proxy is live and you&#8217;re ready to build.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-building-your-first-scraper\">Building your first scraper<\/h2>\n\n\n\n<p>Before the full product listing tutorial, let&#8217;s build a simpler scraper you can run standalone, outside of any skill wrapper. This version fetches a page through the NodeMaven proxy, parses it, retries on failure, and writes clean JSON to disk.<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20json%0Aimport%20logging%0Aimport%20os%0Aimport%20time%0Afrom%20dataclasses%20import%20dataclass%2C%20asdict%0A%0Aimport%20requests%0Afrom%20bs4%20import%20BeautifulSoup%0Afrom%20dotenv%20import%20load_dotenv%0A%0Aload_dotenv%28%29%0A%0Alogging.basicConfig%28%0A%20%20%20%20level%3Dlogging.INFO%2C%0A%20%20%20%20format%3D%22%25%28asctime%29s%20%5B%25%28levelname%29s%5D%20%25%28message%29s%22%2C%0A%29%0Alogger%20%3D%20logging.getLogger%28%22openclaw-scraper%22%29%0A%0ANODEMAVEN_USER%20%3D%20os.getenv%28%22NODEMAVEN_USERNAME%22%29%0ANODEMAVEN_PASS%20%3D%20os.getenv%28%22NODEMAVEN_PASSWORD%22%29%0ANODEMAVEN_HOST%20%3D%20os.getenv%28%22NODEMAVEN_HOST%22%2C%20%22gate.nodemaven.com%22%29%0ANODEMAVEN_PORT%20%3D%20os.getenv%28%22NODEMAVEN_PORT%22%2C%20%228080%22%29%0A%0APROXY_URL%20%3D%20f%22http%3A%2F%2F%7BNODEMAVEN_USER%7D%3A%7BNODEMAVEN_PASS%7D%40%7BNODEMAVEN_HOST%7D%3A%7BNODEMAVEN_PORT%7D%22%0APROXIES%20%3D%20%7B%22http%22%3A%20PROXY_URL%2C%20%22https%22%3A%20PROXY_URL%7D%0A%0AHEADERS%20%3D%20%7B%0A%20%20%20%20%22User-Agent%22%3A%20%22Mozilla%2F5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%20AppleWebKit%2F537.36%22%2C%0A%7D%0A%0A%0A%40dataclass%0Aclass%20PageResult%3A%0A%20%20%20%20url%3A%20str%0A%20%20%20%20title%3A%20str%0A%20%20%20%20status_code%3A%20int%0A%0A%0Adef%20fetch_with_retry%28url%3A%20str%2C%20max_retries%3A%20int%20%3D%203%2C%20timeout%3A%20int%20%3D%2015%29%20-%3E%20requests.Response%3A%0A%20%20%20%20%22%22%22Fetch%20a%20URL%20through%20the%20NodeMaven%20proxy%2C%20retrying%20on%20transient%20failures.%22%22%22%0A%20%20%20%20last_error%20%3D%20None%0A%20%20%20%20for%20attempt%20in%20range%281%2C%20max_retries%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20requests.get%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20url%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20proxies%3DPROXIES%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20headers%3DHEADERS%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20timeout%3Dtimeout%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20response.status_code%20%3D%3D%20200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20response%0A%20%20%20%20%20%20%20%20%20%20%20%20logger.warning%28%22Attempt%20%25s%20got%20status%20%25s%20for%20%25s%22%2C%20attempt%2C%20response.status_code%2C%20url%29%0A%20%20%20%20%20%20%20%20except%20requests.RequestException%20as%20exc%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20last_error%20%3D%20exc%0A%20%20%20%20%20%20%20%20%20%20%20%20logger.warning%28%22Attempt%20%25s%20failed%20for%20%25s%3A%20%25s%22%2C%20attempt%2C%20url%2C%20exc%29%0A%20%20%20%20%20%20%20%20time.sleep%282%20%2A%2A%20attempt%29%0A%20%20%20%20raise%20RuntimeError%28f%22Failed%20to%20fetch%20%7Burl%7D%20after%20%7Bmax_retries%7D%20attempts%22%29%20from%20last_error%0A%0A%0Adef%20scrape_page%28url%3A%20str%29%20-%3E%20PageResult%3A%0A%20%20%20%20response%20%3D%20fetch_with_retry%28url%29%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28response.text%2C%20%22html.parser%22%29%0A%20%20%20%20title%20%3D%20soup.title.string.strip%28%29%20if%20soup.title%20else%20%22No%20title%20found%22%0A%20%20%20%20return%20PageResult%28url%3Durl%2C%20title%3Dtitle%2C%20status_code%3Dresponse.status_code%29%0A%0A%0Adef%20save_json%28data%2C%20path%3A%20str%20%3D%20%22output.json%22%29%20-%3E%20None%3A%0A%20%20%20%20with%20open%28path%2C%20%22w%22%2C%20encoding%3D%22utf-8%22%29%20as%20f%3A%0A%20%20%20%20%20%20%20%20json.dump%28data%2C%20f%2C%20indent%3D2%2C%20ensure_ascii%3DFalse%29%0A%20%20%20%20logger.info%28%22Saved%20results%20to%20%25s%22%2C%20path%29%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20target%20%3D%20%22https%3A%2F%2Fexample.com%22%0A%20%20%20%20result%20%3D%20scrape_page%28target%29%0A%20%20%20%20save_json%28asdict%28result%29%29\"><\/code><\/pre><\/figure>\n\n\n<p><strong>A quick walkthrough of what each part is doing:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Imports<\/strong> \u2014 <strong>requests<\/strong> handles HTTP, <strong>BeautifulSoup<\/strong> parses HTML, <strong>python-dotenv<\/strong> loads your <strong>.env<\/strong> file so credentials never live in the script itself<\/li>\n\n\n\n<li><strong>Proxy setup<\/strong> \u2014 <strong>PROXY_URL<\/strong> builds a single authenticated proxy string from your NodeMaven credentials, used for both HTTP and HTTPS traffic<\/li>\n\n\n\n<li><strong>fetch_with_retry<\/strong> \u2014 retries failed requests with exponential backoff (<strong>2 ** attempt seconds<\/strong>), so a single dropped connection doesn&#8217;t kill the whole run<\/li>\n\n\n\n<li><strong>scrape_page<\/strong> \u2014 the actual extraction logic, this is the part you&#8217;ll customize per site<\/li>\n\n\n\n<li><strong>save_json<\/strong> \u2014 writes results to disk in a format any downstream tool can consume<\/li>\n<\/ul>\n\n\n\n<p><strong>Install the dependencies before running it:<\/strong><\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"pip%20install%20requests%20beautifulsoup4%20python-dotenv%0Apython%20scraper.py\"><\/code><\/pre><\/figure>\n\n\n<p>This script works standalone, but it&#8217;s also exactly the shape of script an OpenClaw skill wraps. That&#8217;s the core building block of web scraping with OpenClaw at any scale, and it&#8217;s what we&#8217;ll wrap into a full skill next.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p data-pm-slice=\"0 0 []\"><strong>Power OpenClaw web scraping with clean residential IPs. Start your NodeMaven trial for $3.50 and get 750 MB of proxy traffic<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\/\"\n            >\n            Start trial        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-openclaw-coding-skill-web-scraping-product-listing-example\">OpenClaw coding skill (web scraping product listing example)<\/h2>\n\n\n\n<p>This is the section that matters most if you&#8217;re scraping e-commerce data. We&#8217;re going to wrap the scraper above in a proper OpenClaw skill, so the agent can call it whenever you ask it to pull a product listing.<\/p>\n\n\n\n<p>The OpenClaw coding skill (web scraping product listing) pattern below extracts six fields per product: <strong>name<\/strong>, <strong>price<\/strong>, <strong>availability<\/strong>, <strong>rating<\/strong>, <strong>product URL<\/strong>, and <strong>image URL<\/strong>, all delivered as JSON.<\/p>\n\n\n\n<p><strong>Start with the folder structure:<\/strong><\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"plaintext\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-plaintext\" data-rhino-code=\"product-scraper%2F%0A%E2%94%9C%E2%94%80%E2%94%80%20SKILL.md%0A%E2%94%94%E2%94%80%E2%94%80%20scrape_products.py\"><\/code><\/pre><\/figure>\n\n\n<p><strong>SKILL.md<\/strong> needs YAML frontmatter plus instructions the agent follows:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"plaintext\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-plaintext\" data-rhino-code=\"---%0Aname%3A%20product-scraper%0Adescription%3A%20%3E%0A%20%20Scrape%20product%20listing%20pages%20for%20name%2C%20price%2C%20availability%2C%20rating%2C%0A%20%20product%20URL%2C%20and%20image%20URL.%20Use%20when%20the%20user%20asks%20to%20extract%20product%0A%20%20data%2C%20catalog%20information%2C%20or%20pricing%20from%20an%20e-commerce%20page.%0Ametadata%3A%0A%20%20openclaw%3A%0A%20%20%20%20requires%3A%0A%20%20%20%20%20%20bins%3A%20%5B%22python3%22%5D%0A%20%20%20%20%20%20env%3A%20%5B%22NODEMAVEN_USERNAME%22%2C%20%22NODEMAVEN_PASSWORD%22%5D%0A---%0A%0A%23%20Product%20Scraper%0A%0AWhen%20the%20user%20gives%20a%20product%20listing%20page%20URL%2C%20run%3A%0A%0A%60%60%60bash%0Apython3%20scrape_products.py%20--url%20%22%3Cthe%20URL%3E%22%20--output%20products.json%0A%60%60%60%0A%0AReport%20back%3A%0A-%20How%20many%20products%20were%20found%0A-%20Any%20products%20that%20failed%20to%20parse%20and%20why%0A-%20The%20path%20to%20the%20saved%20JSON%20file%0A%0ADo%20not%20attempt%20to%20scrape%20pages%20requiring%20login%20without%20explicit%20user%20confirmation.\"><\/code><\/pre><\/figure>\n\n\n<p>Declaring <strong>env<\/strong> in the frontmatter&#8217;s <strong>metadata.openclaw.requires<\/strong> block matters: if the script references a variable the frontmatter doesn&#8217;t declare, ClawHub&#8217;s scan flags a metadata mismatch and blocks the skill from publishing. Keep the two in sync.<\/p>\n\n\n\n<p><strong>Now the extraction script itself:<\/strong><\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"import%20argparse%0Aimport%20json%0Aimport%20logging%0Aimport%20os%0Aimport%20time%0Afrom%20dataclasses%20import%20dataclass%2C%20asdict%0Afrom%20typing%20import%20List%2C%20Optional%0A%0Aimport%20requests%0Afrom%20bs4%20import%20BeautifulSoup%0Afrom%20dotenv%20import%20load_dotenv%0A%0Aload_dotenv%28%29%0A%0Alogging.basicConfig%28level%3Dlogging.INFO%2C%20format%3D%22%25%28asctime%29s%20%5B%25%28levelname%29s%5D%20%25%28message%29s%22%29%0Alogger%20%3D%20logging.getLogger%28%22product-scraper%22%29%0A%0ANODEMAVEN_USER%20%3D%20os.getenv%28%22NODEMAVEN_USERNAME%22%29%0ANODEMAVEN_PASS%20%3D%20os.getenv%28%22NODEMAVEN_PASSWORD%22%29%0ANODEMAVEN_HOST%20%3D%20os.getenv%28%22NODEMAVEN_HOST%22%2C%20%22gate.nodemaven.com%22%29%0ANODEMAVEN_PORT%20%3D%20os.getenv%28%22NODEMAVEN_PORT%22%2C%20%228080%22%29%0A%0APROXY_URL%20%3D%20f%22http%3A%2F%2F%7BNODEMAVEN_USER%7D%3A%7BNODEMAVEN_PASS%7D%40%7BNODEMAVEN_HOST%7D%3A%7BNODEMAVEN_PORT%7D%22%0APROXIES%20%3D%20%7B%22http%22%3A%20PROXY_URL%2C%20%22https%22%3A%20PROXY_URL%7D%0AHEADERS%20%3D%20%7B%22User-Agent%22%3A%20%22Mozilla%2F5.0%20%28Windows%20NT%2010.0%3B%20Win64%3B%20x64%29%20AppleWebKit%2F537.36%22%7D%0A%0A%0A%40dataclass%0Aclass%20Product%3A%0A%20%20%20%20name%3A%20str%0A%20%20%20%20price%3A%20Optional%5Bstr%5D%0A%20%20%20%20availability%3A%20Optional%5Bstr%5D%0A%20%20%20%20rating%3A%20Optional%5Bstr%5D%0A%20%20%20%20product_url%3A%20Optional%5Bstr%5D%0A%20%20%20%20image_url%3A%20Optional%5Bstr%5D%0A%0A%0Adef%20fetch%28url%3A%20str%2C%20max_retries%3A%20int%20%3D%203%2C%20timeout%3A%20int%20%3D%2020%29%20-%3E%20requests.Response%3A%0A%20%20%20%20last_error%20%3D%20None%0A%20%20%20%20for%20attempt%20in%20range%281%2C%20max_retries%20%2B%201%29%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20response%20%3D%20requests.get%28url%2C%20proxies%3DPROXIES%2C%20headers%3DHEADERS%2C%20timeout%3Dtimeout%29%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20response.status_code%20%3D%3D%20200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20return%20response%0A%20%20%20%20%20%20%20%20%20%20%20%20logger.warning%28%22Status%20%25s%20on%20attempt%20%25s%22%2C%20response.status_code%2C%20attempt%29%0A%20%20%20%20%20%20%20%20except%20requests.RequestException%20as%20exc%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20last_error%20%3D%20exc%0A%20%20%20%20%20%20%20%20%20%20%20%20logger.warning%28%22Attempt%20%25s%20failed%3A%20%25s%22%2C%20attempt%2C%20exc%29%0A%20%20%20%20%20%20%20%20time.sleep%282%20%2A%2A%20attempt%29%0A%20%20%20%20raise%20RuntimeError%28f%22Could%20not%20fetch%20%7Burl%7D%22%29%20from%20last_error%0A%0A%0Adef%20parse_products%28html%3A%20str%2C%20base_url%3A%20str%29%20-%3E%20List%5BProduct%5D%3A%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22html.parser%22%29%0A%20%20%20%20products%20%3D%20%5B%5D%0A%20%20%20%20for%20card%20in%20soup.select%28%22.product-card%2C%20.product%2C%20%5Bdata-product%5D%22%29%3A%0A%20%20%20%20%20%20%20%20try%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20name_el%20%3D%20card.select_one%28%22.product-title%2C%20.name%2C%20h2%2C%20h3%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20price_el%20%3D%20card.select_one%28%22.price%2C%20.product-price%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20avail_el%20%3D%20card.select_one%28%22.availability%2C%20.stock-status%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20rating_el%20%3D%20card.select_one%28%22.rating%2C%20.stars%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20link_el%20%3D%20card.select_one%28%22a%22%29%0A%20%20%20%20%20%20%20%20%20%20%20%20img_el%20%3D%20card.select_one%28%22img%22%29%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20products.append%28Product%28%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%3Dname_el.get_text%28strip%3DTrue%29%20if%20name_el%20else%20%22Unknown%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20price%3Dprice_el.get_text%28strip%3DTrue%29%20if%20price_el%20else%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20availability%3Davail_el.get_text%28strip%3DTrue%29%20if%20avail_el%20else%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rating%3Drating_el.get_text%28strip%3DTrue%29%20if%20rating_el%20else%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20product_url%3Dlink_el%5B%22href%22%5D%20if%20link_el%20and%20link_el.has_attr%28%22href%22%29%20else%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20image_url%3Dimg_el%5B%22src%22%5D%20if%20img_el%20and%20img_el.has_attr%28%22src%22%29%20else%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%29%29%0A%20%20%20%20%20%20%20%20except%20Exception%20as%20exc%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20logger.warning%28%22Skipped%20a%20product%20card%3A%20%25s%22%2C%20exc%29%0A%20%20%20%20return%20products%0A%0A%0Adef%20main%28%29%3A%0A%20%20%20%20parser%20%3D%20argparse.ArgumentParser%28description%3D%22Scrape%20a%20product%20listing%20page.%22%29%0A%20%20%20%20parser.add_argument%28%22--url%22%2C%20required%3DTrue%29%0A%20%20%20%20parser.add_argument%28%22--output%22%2C%20default%3D%22products.json%22%29%0A%20%20%20%20args%20%3D%20parser.parse_args%28%29%0A%0A%20%20%20%20response%20%3D%20fetch%28args.url%29%0A%20%20%20%20products%20%3D%20parse_products%28response.text%2C%20args.url%29%0A%0A%20%20%20%20with%20open%28args.output%2C%20%22w%22%2C%20encoding%3D%22utf-8%22%29%20as%20f%3A%0A%20%20%20%20%20%20%20%20json.dump%28%5Basdict%28p%29%20for%20p%20in%20products%5D%2C%20f%2C%20indent%3D2%2C%20ensure_ascii%3DFalse%29%0A%0A%20%20%20%20logger.info%28%22Extracted%20%25s%20products%2C%20saved%20to%20%25s%22%2C%20len%28products%29%2C%20args.output%29%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20main%28%29\"><\/code><\/pre><\/figure>\n\n\n<p><strong>Line by line, the pieces worth calling out:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Selectors are intentionally loose<\/strong> (.product-card, .product, [data-product]) since real catalog pages rarely agree on class names; adjust these to match your target once you inspect the page<\/li>\n\n\n\n<li><strong>Every field is optional except name<\/strong> \u2014 a missing price or rating shouldn&#8217;t crash the whole scrape, it should just come back as null<\/li>\n\n\n\n<li><strong>try\/except<\/strong> inside the loop means one malformed product card doesn&#8217;t take down the other forty on the page<\/li>\n\n\n\n<li><strong>argparse<\/strong> lets the OpenClaw skill call this script directly from the command the agent runs, passing the URL and output path as arguments<\/li>\n<\/ul>\n\n\n\n<p>Like most OpenClaw web scraping skills, this one installs by dropping the folder into <strong>~\/.openclaw\/skills\/product-scraper\/<\/strong> and restarting the Gateway:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"mkdir%20-p%20~%2F.openclaw%2Fskills%2Fproduct-scraper%0Acp%20SKILL.md%20scrape_products.py%20~%2F.openclaw%2Fskills%2Fproduct-scraper%2F%0Aopenclaw%20gateway%20restart\"><\/code><\/pre><\/figure>\n\n\n<p>Confirm it loaded correctly:<\/p>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"bash\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-bash\" data-rhino-code=\"openclaw%20skills%20list%20--eligible\"><\/code><\/pre><\/figure>\n\n\n<p>If product-scraper shows up in that list, ask the agent directly: \u201cScrape the product listings on https:\/\/example-store.com\/bestsellers\u201d. It reads the skill, runs the script through your NodeMaven proxy, and reports back what it found. This OpenClaw coding skill setup is the same pattern you&#8217;ll reuse for any structured extraction task, just with different selectors.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-openclaw-web-scraping-examples\">OpenClaw web scraping examples<\/h2>\n\n\n\n<p>Once you have the pattern above working, most other OpenClaw web scraping examples are variations on the same script with different parsing logic. Here are five common ones.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-example-1-news-website\">Example 1: News website<\/h3>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"def%20parse_article%28html%3A%20str%29%20-%3E%20dict%3A%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22html.parser%22%29%0A%20%20%20%20headline%20%3D%20soup.select_one%28%22h1%22%29%0A%20%20%20%20byline%20%3D%20soup.select_one%28%22.byline%2C%20.author%22%29%0A%20%20%20%20body_paragraphs%20%3D%20soup.select%28%22article%20p%22%29%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%22headline%22%3A%20headline.get_text%28strip%3DTrue%29%20if%20headline%20else%20None%2C%0A%20%20%20%20%20%20%20%20%22author%22%3A%20byline.get_text%28strip%3DTrue%29%20if%20byline%20else%20None%2C%0A%20%20%20%20%20%20%20%20%22word_count%22%3A%20sum%28len%28p.get_text%28%29.split%28%29%29%20for%20p%20in%20body_paragraphs%29%2C%0A%20%20%20%20%7D\"><\/code><\/pre><\/figure>\n\n\n<p>Note the <strong>word_count<\/strong> field instead of the full article body. Copying full article text raises copyright concerns; extract metadata and summaries, not verbatim content.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-example-2-documentation\">Example 2: Documentation<\/h3>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"def%20parse_docs_page%28html%3A%20str%29%20-%3E%20dict%3A%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22html.parser%22%29%0A%20%20%20%20headings%20%3D%20%5Bh.get_text%28strip%3DTrue%29%20for%20h%20in%20soup.select%28%22h1%2C%20h2%2C%20h3%22%29%5D%0A%20%20%20%20code_blocks%20%3D%20len%28soup.select%28%22pre%20code%22%29%29%0A%20%20%20%20return%20%7B%22headings%22%3A%20headings%2C%20%22code_block_count%22%3A%20code_blocks%7D\"><\/code><\/pre><\/figure>\n\n\n<p>Useful for building a site map of a docs portal before deciding which pages need a deeper scrape.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-example-3-google-search\">Example 3: Google Search<\/h3>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"def%20parse_serp%28html%3A%20str%29%20-%3E%20list%3A%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22html.parser%22%29%0A%20%20%20%20results%20%3D%20%5B%5D%0A%20%20%20%20for%20block%20in%20soup.select%28%22div.g%22%29%3A%0A%20%20%20%20%20%20%20%20link%20%3D%20block.select_one%28%22a%22%29%0A%20%20%20%20%20%20%20%20title%20%3D%20block.select_one%28%22h3%22%29%0A%20%20%20%20%20%20%20%20if%20link%20and%20title%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20results.append%28%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22title%22%3A%20title.get_text%28strip%3DTrue%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22url%22%3A%20link.get%28%22href%22%29%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%29%0A%20%20%20%20return%20results\"><\/code><\/pre><\/figure>\n\n\n<p><strong>Warning:<\/strong> Google&#8217;s result markup changes frequently and aggressively rate-limits scripted traffic. <a href=\"https:\/\/nodemaven.com\/proxies\/rotating-residential-proxies\/\">Rotating residential IPs<\/a> per request is close to mandatory here, and even then, expect to update selectors regularly.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p class=\"PDq2pG_selectionAnchorContainer\" data-start=\"527\" data-end=\"655\"><strong data-start=\"527\" data-end=\"655\">Scale OpenClaw scraping with automatic IP rotation. Get started with NodeMaven for $3.50 and receive 750 MB of proxy traffic<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\/\"\n            >\n            Start trial        <\/a>\n    <\/div>\n<\/div>\n\n\n<h3 class=\"wp-block-heading\" id=\"h-example-4-product-pages\">Example 4: Product pages<\/h3>\n\n\n\n<p>Reuse the <strong>parse_products<\/strong> function from the previous section, but point it at a single product page instead of a listing, and swap the CSS selectors to match a detail page layout (spec tables, image galleries, and review counts instead of card grids).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"h-example-5-blog-articles\">Example 5: Blog articles<\/h3>\n\n\n<figure class=\"rhino-code-snippet\" data-lang=\"python\"><button type=\"button\" class=\"rhino-code-snippet__copy\" aria-label=\"Copy code to clipboard\"><svg class=\"rhino-code-snippet__icon-copy\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"><\/rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"><\/path><\/svg><svg class=\"rhino-code-snippet__icon-check\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\"><polyline points=\"20 6 9 17 4 12\"><\/polyline><\/svg><\/button><span class=\"rhino-code-snippet__sr\" aria-live=\"polite\"><\/span><pre class=\"line-numbers\"><code class=\"language-python\" data-rhino-code=\"def%20parse_blog_post%28html%3A%20str%29%20-%3E%20dict%3A%0A%20%20%20%20soup%20%3D%20BeautifulSoup%28html%2C%20%22html.parser%22%29%0A%20%20%20%20title%20%3D%20soup.select_one%28%22h1%22%29%0A%20%20%20%20published%20%3D%20soup.select_one%28%22time%22%29%0A%20%20%20%20tags%20%3D%20%5Bt.get_text%28strip%3DTrue%29%20for%20t%20in%20soup.select%28%22.tag%2C%20.category%22%29%5D%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%22title%22%3A%20title.get_text%28strip%3DTrue%29%20if%20title%20else%20None%2C%0A%20%20%20%20%20%20%20%20%22published%22%3A%20published.get%28%22datetime%22%29%20if%20published%20else%20None%2C%0A%20%20%20%20%20%20%20%20%22tags%22%3A%20tags%2C%0A%20%20%20%20%7D\"><\/code><\/pre><\/figure>\n\n\n<p>Good for building a content calendar view of a competitor&#8217;s blog without pulling the actual post text.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-best-practices\">Best Practices<\/h2>\n\n\n\n<p>Good habits here save real debugging time later:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Respect robots.txt<\/strong> \u2014 check it before scraping and honor disallowed paths<\/li>\n\n\n\n<li><strong>Add delays between requests<\/strong> \u2014 even a random 1-3 second delay looks less mechanical than a fixed interval<\/li>\n\n\n\n<li><strong>Build retries into everything<\/strong> \u2014 networks fail, proxies occasionally time out, sites throttle; retries with backoff absorb all three<\/li>\n\n\n\n<li><strong>Cache responses during development<\/strong> \u2014 don&#8217;t re-fetch the same page ten times while you&#8217;re still tuning selectors<\/li>\n\n\n\n<li><strong>Log everything<\/strong> \u2014 status codes, retry counts, and parse failures, so a failed run is debuggable after the fact<\/li>\n\n\n\n<li><strong>Rotate IPs for volume, stick with one IP for sessions<\/strong> \u2014 match the proxy behavior to the task, not the other way around<\/li>\n\n\n\n<li><strong>Keep structured output consistent<\/strong> \u2014 a stable JSON schema makes downstream processing far simpler<\/li>\n\n\n\n<li><strong>Monitor success rate over time<\/strong> \u2014 a slowly dropping success rate is usually the first sign a site changed its defenses<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-troubleshooting\">Troubleshooting<\/h2>\n\n\n\n<p>Most issues follow predictable patterns. Here&#8217;s what you&#8217;re likely to run into and how to fix it.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Issue<\/strong><\/td><td><strong>Cause<\/strong><\/td><td><strong>Solution<\/strong><\/td><\/tr><\/thead><tbody><tr><td>403 Forbidden<\/td><td>IP or fingerprint flagged as a bot<\/td><td>Switch to a residential proxy, rotate IP, check headers match a real browser<\/td><\/tr><tr><td>429 Too Many Requests<\/td><td>Rate limit hit<\/td><td>Add delays, reduce concurrency, rotate IPs more aggressively<\/td><\/tr><tr><td>Timeouts<\/td><td>Proxy or target server slow to respond<\/td><td>Increase <strong>timeout<\/strong>, retry with backoff, check proxy region matches target<\/td><\/tr><tr><td>JavaScript not rendering<\/td><td>Page needs client-side execution<\/td><td>Use OpenClaw&#8217;s browser tool instead of a plain HTTP fetch<\/td><\/tr><tr><td>Empty HTML<\/td><td>Bot-detection serving a blank shell page<\/td><td>Verify with a real browser first, check for a JS challenge<\/td><\/tr><tr><td>Blocked IP<\/td><td>Overused or low-reputation address<\/td><td>Switch providers or enable a quality filter on your proxy pool<\/td><\/tr><tr><td>Invalid proxy<\/td><td>Wrong credentials or malformed proxy string<\/td><td>Re-copy credentials from the dashboard, verify with a standalone curl test<\/td><\/tr><tr><td>OpenClaw errors in logs<\/td><td>Misconfigured skill or missing dependency<\/td><td>Run <strong>openclaw doctor<\/strong> and <strong>openclaw skills list &#8211;eligible<\/strong><\/td><\/tr><tr><td>Installation errors<\/td><td>PATH issue after npm install<\/td><td>Check <strong>npm prefix -g<\/strong> is on your <strong>$PATH<\/strong>, restart the terminal<\/td><\/tr><tr><td>API errors<\/td><td>Invalid or expired model API key<\/td><td>Re-run <strong>openclaw configure<\/strong> and re-enter the key<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-why-use-nodemaven-with-openclaw\">Why Use NodeMaven with OpenClaw?<\/h2>\n\n\n\n<p>The gap between \u201cworks in a demo\u201d and \u201cworks every day\u201d almost always comes down to the proxy layer. Here&#8217;s how the options actually compare in practice:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><td><strong>Setup<\/strong><\/td><td><strong>What happens<\/strong><\/td><\/tr><\/thead><tbody><tr><td>No proxy<\/td><td>Your server&#8217;s IP gets flagged within hours on any moderately protected site<\/td><\/tr><tr><td>Cheap\/shared datacenter proxies<\/td><td>Blocked quickly, since the IP range is already on most anti-bot blocklists<\/td><\/tr><tr><td>Premium residential proxies (generic)<\/td><td>Works, but rotation and session control are often clunky to configure<\/td><\/tr><tr><td>NodeMaven<\/td><td>Automatic <a href=\"https:\/\/nodemaven.com\/proxies\/rotating-residential-proxies\/\">rotation<\/a>, sticky sessions, 95%+ clean IP quality, and consistent success rates across e-commerce, search, and social targets<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>In a real scenario: an OpenClaw scraping tool pulling daily pricing data from a dozen retailers needs a fresh IP per request to avoid pattern detection, while a LinkedIn or account-based workflow needs the opposite, one stable IP held for the length of a session.<\/p>\n\n\n\n<p>NodeMaven&#8217;s dashboard lets you switch between rotating and sticky sessions from the same account, across 190+ countries and 1,400+ cities, without juggling separate providers for each use case.<\/p>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-rhino-alert-banner so-widget-rhinocore-addons-rhino-alert-banner-default-d75171398898\"\n\t\t\t\n\t\t><div class=\"rhino-widget rhino-widget--rhinocore-addons-rhino-alert-banner section-alert\"    style=\"--alert-background-color: #E6E6FF\"\n>\n            <div class=\"section-alert__icon\">\n            <img decoding=\"async\" src=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/02\/icon-4.svg\" alt=\"\" loading=\"lazy\" width=\"64\" height=\"64\">        <\/div>\n    \n            <div class=\"section-alert__main\">\n            \n                            <div class=\"section-alert__description\"><p class=\"PDq2pG_selectionAnchorContainer\" data-start=\"527\" data-end=\"655\"><strong>Scrape with OpenClaw using trusted proxies. Try NodeMaven for $3.50 and get 750 MB of proxy traffic<\/strong><\/p>\n<\/div>\n                    <\/div>\n    \n            <a\n            class=\"section-alert__button b-btn b-btn--static-xl b-btn--secondary-black\"\n            href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\/\"\n            >\n            Start trial        <\/a>\n    <\/div>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" id=\"h-conclusion\">Conclusion<\/h2>\n\n\n\n<p>OpenClaw gives you an agent-driven way to scrape the web that adapts better than hardcoded selector scripts, and skills make it straightforward to package that logic into something reusable.<\/p>\n\n\n\n<p>But none of it holds up without a proxy layer that keeps your requests looking like ordinary traffic. You now have a complete OpenClaw web scraping coding skill, backed by clean residential IPs, ready to point at real targets.<\/p>\n\n\n\n<p>If you want to test the proxy side of this setup before committing to a plan, <a href=\"https:\/\/dashboard.nodemaven.com\/checkout\/pag\/trial\/\">NodeMaven&#8217;s trial<\/a> is a low-cost way to see how your specific target site behaves with a real residential IP pool behind it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"h-frequently-asked-questions\">Frequently asked questions<\/h2>\n\n\n<div\n\t\t\t\n\t\t\tclass=\"so-widget-rhinocore-addons-faq so-widget-rhinocore-addons-faq-default-d75171398898\"\n\t\t\t\n\t\t>    <div class=\"rhino-widget rhino-widget--rhinocore-addons-faq section-faq\">\n        <div class=\"section-faq__list section-faq__list--columns-1\" role=\"list\" aria-label=\"Frequently Asked Questions\">\n                            <div class=\"section-faq__column\">\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can OpenClaw scrape JavaScript websites?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Yes. OpenClaw can interact with browser-based tools that render JavaScript before extracting content. This makes it suitable for modern websites where data is loaded dynamically instead of being present in the initial HTML.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Do I need proxies for OpenClaw web scraping?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>If you scrape multiple pages, access geo-restricted content, or target websites with anti-bot protection, <a href=\"https:\/\/nodemaven.com\/blog\/what-is-a-residential-proxy\/\">residential proxies<\/a> significantly improve reliability by reducing blocks, CAPTCHAs, and rate limits.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Which proxy type is best for OpenClaw?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Residential proxies are the best choice for most scraping tasks because they use real residential IP addresses that appear as genuine users. <a href=\"https:\/\/nodemaven.com\/proxies\/isp-proxies\/\">ISP proxies<\/a> are also a strong option for long-running or logged-in sessions, while datacenter proxies are better suited to low-risk targets.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can OpenClaw scrape product listings?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Yes. One of the most common use cases is OpenClaw coding skill web scraping product listing workflows. OpenClaw can extract product names, prices, ratings, stock availability, images, and product URLs from many e-commerce websites. The data can then be exported to JSON, CSV, or other formats for analysis.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Does OpenClaw work with NodeMaven proxies?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Yes. NodeMaven proxies can be configured within your OpenClaw setup to improve scraping success rates. Features like automatic IP rotation, sticky sessions, and high-quality residential IPs help reduce blocks on e-commerce, search engine, and social media websites.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Can OpenClaw scrape LinkedIn or X (Twitter)?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>OpenClaw can automate data collection from publicly accessible pages, but you should always comply with the platform&#8217;s Terms of Service and applicable laws.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Is OpenClaw better than Playwright or Selenium?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>It depends on your project. OpenClaw is designed for AI-driven workflows where the agent can adapt to changing page layouts and make decisions automatically. Playwright and Selenium are better suited for deterministic automation where every action is explicitly scripted.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">How can I avoid getting blocked while scraping?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Follow best practices such as rotating residential IPs, limiting request rates, respecting robots.txt where appropriate, adding randomized delays between requests, using sticky sessions for logged-in workflows, and validating your extracted data. Combining these techniques with high-quality proxies significantly improves scraping reliability.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                            <div class=\"section-faq__item\" data-accordion=\"wrapper\" data-accordion-group=\"faq\" role=\"listitem\">\n                            <h3 class=\"section-faq__heading\">\n                                <button class=\"section-faq__trigger\" data-accordion=\"trigger\" type=\"button\" aria-expanded=\"false\">\n                                    <span class=\"section-faq__question\">Is OpenClaw free?<\/span>\n                                    <svg width=\"28\" height=\"28\" viewBox=\"0 0 28 28\" fill=\"none\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" aria-hidden=\"true\" focusable=\"false\">\n                                        <path d=\"M7 10.5L14 17.5L21 10.5\" stroke=\"#5D5D5D\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" \/>\n                                    <\/svg>\n                                <\/button>\n                            <\/h3>\n                            <div class=\"section-faq__content\">\n                                <div class=\"section-faq__answer\">\n                                    <p>Yes. OpenClaw is an open-source project and can be used for free. However, you may need paid services such as AI model APIs or premium residential proxies if you plan to run large-scale or production scraping workloads.<\/p>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                                    <\/div>\n                    <\/div>\n    <\/div>\n<\/div>\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"A practical guide to building AI-powered web scrapers with OpenClaw, including setup, coding skills, and proxy integration","protected":false},"author":80,"featured_media":39653,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[213,205],"class_list":["post-39651","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-guides-tutorials","tag-web-scraping"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.8 (Yoast SEO v27.8) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>How to use OpenClaw for web scraping: setup &amp; coding guide<\/title>\n<meta name=\"description\" content=\"Master OpenClaw web scraping with working code examples, product listing extraction, proxy setup, troubleshooting, and best practices\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/nodemaven.com\/ru\/blog\/openclaw-web-scraping-guide\/\" \/>\n<meta property=\"og:locale\" content=\"ru_RU\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OpenClaw web scraping guide: Build AI scrapers with residential proxies\" \/>\n<meta property=\"og:description\" content=\"Master OpenClaw web scraping with working code examples, product listing extraction, proxy setup, troubleshooting, and best practices\" \/>\n<meta property=\"og:url\" content=\"https:\/\/nodemaven.com\/ru\/blog\/openclaw-web-scraping-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"NodeMaven\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-14T16:13:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-14T16:13:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc_featured.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1672\" \/>\n\t<meta property=\"og:image:height\" content=\"941\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Olga Kotko\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c\" \/>\n\t<meta name=\"twitter:data1\" content=\"Olga Kotko\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 \u043c\u0438\u043d\u0443\u0442\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/\"},\"author\":{\"name\":\"Olga Kotko\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/79a9c10c7956e31a5628504fe9cffe2e\"},\"headline\":\"OpenClaw web scraping guide: Build AI scrapers with residential proxies\",\"datePublished\":\"2026-07-14T16:13:02+00:00\",\"dateModified\":\"2026-07-14T16:13:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/\"},\"wordCount\":2874,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/oc_featured.png\",\"keywords\":[\"Guides &amp; Tutorials\",\"Web Scraping\"],\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/\",\"name\":\"How to use OpenClaw for web scraping: setup & coding guide\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/oc_featured.png\",\"datePublished\":\"2026-07-14T16:13:02+00:00\",\"dateModified\":\"2026-07-14T16:13:03+00:00\",\"description\":\"Master OpenClaw web scraping with working code examples, product listing extraction, proxy setup, troubleshooting, and best practices\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#breadcrumb\"},\"inLanguage\":\"ru-RU\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#primaryimage\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/oc_featured.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/oc_featured.png\",\"width\":1672,\"height\":941,\"caption\":\"OpenClaw web scraping with AI agent, coding skills, and NodeMaven residential proxies for automated data extraction\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/nodemaven.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OpenClaw web scraping guide: Build AI scrapers with residential proxies\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#website\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/\",\"name\":\"NodeMaven\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/nodemaven.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ru-RU\"},{\"@type\":[\"Organization\",\"Place\"],\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#organization\",\"name\":\"NodeMaven\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/\",\"logo\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#local-main-organization-logo\"},\"image\":{\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#local-main-organization-logo\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/people\\\/NodeMaven\\\/100095402507825\\\/\",\"https:\\\/\\\/t.me\\\/NodeMavenTG\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/nodemaven\\\/\"],\"telephone\":[],\"openingHoursSpecification\":[{\"@type\":\"OpeningHoursSpecification\",\"dayOfWeek\":[\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\",\"Sunday\"],\"opens\":\"00:00\",\"closes\":\"23:59\"}],\"legalName\":\"NodeMaven FZ LLC\",\"email\":\"support@nodemaven.com\",\"description\":\"NodeMaven is a proxy infrastructure provider offering residential, mobile, and ISP proxies with IP quality filtering, precise geo-targeting, HTTPS and SOCKS5 support, and developer APIs.\",\"contactPoint\":[{\"@type\":\"ContactPoint\",\"contactType\":\"customer support\",\"email\":\"support@nodemaven.com\"},{\"@type\":\"ContactPoint\",\"contactType\":\"legal\",\"email\":\"legal.public@nodemaven.com\"}]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/#\\\/schema\\\/person\\\/79a9c10c7956e31a5628504fe9cffe2e\",\"name\":\"Olga Kotko\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/olga-kotko_avatar-96x96.jpg\",\"caption\":\"Olga Kotko\"},\"description\":\"I write about proxies and automation, translating complicated digital topics into research-driven content people can actually enjoy reading\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/ru\\\/author\\\/olga-kotko\\\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"ru-RU\",\"@id\":\"https:\\\/\\\/nodemaven.com\\\/blog\\\/openclaw-web-scraping-guide\\\/#local-main-organization-logo\",\"url\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Untitled-design-8-1.png\",\"contentUrl\":\"https:\\\/\\\/nodemaven.com\\\/wp-content\\\/uploads\\\/2025\\\/03\\\/cropped-Untitled-design-8-1.png\",\"width\":512,\"height\":512,\"caption\":\"NodeMaven\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to use OpenClaw for web scraping: setup & coding guide","description":"Master OpenClaw web scraping with working code examples, product listing extraction, proxy setup, troubleshooting, and best practices","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/nodemaven.com\/ru\/blog\/openclaw-web-scraping-guide\/","og_locale":"ru_RU","og_type":"article","og_title":"OpenClaw web scraping guide: Build AI scrapers with residential proxies","og_description":"Master OpenClaw web scraping with working code examples, product listing extraction, proxy setup, troubleshooting, and best practices","og_url":"https:\/\/nodemaven.com\/ru\/blog\/openclaw-web-scraping-guide\/","og_site_name":"NodeMaven","article_publisher":"https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","article_published_time":"2026-07-14T16:13:02+00:00","article_modified_time":"2026-07-14T16:13:03+00:00","og_image":[{"width":1672,"height":941,"url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc_featured.png","type":"image\/png"}],"author":"Olga Kotko","twitter_card":"summary_large_image","twitter_misc":{"\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0430\u0432\u0442\u043e\u0440\u043e\u043c":"Olga Kotko","\u041f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f":"13 \u043c\u0438\u043d\u0443\u0442"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#article","isPartOf":{"@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/"},"author":{"name":"Olga Kotko","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/79a9c10c7956e31a5628504fe9cffe2e"},"headline":"OpenClaw web scraping guide: Build AI scrapers with residential proxies","datePublished":"2026-07-14T16:13:02+00:00","dateModified":"2026-07-14T16:13:03+00:00","mainEntityOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/"},"wordCount":2874,"commentCount":0,"publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc_featured.png","keywords":["Guides &amp; Tutorials","Web Scraping"],"articleSection":["Uncategorized"],"inLanguage":"ru-RU","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/nodemaven.com\/ru\/#organization"}},{"@type":"WebPage","@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/","url":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/","name":"How to use OpenClaw for web scraping: setup & coding guide","isPartOf":{"@id":"https:\/\/nodemaven.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#primaryimage"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc_featured.png","datePublished":"2026-07-14T16:13:02+00:00","dateModified":"2026-07-14T16:13:03+00:00","description":"Master OpenClaw web scraping with working code examples, product listing extraction, proxy setup, troubleshooting, and best practices","breadcrumb":{"@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#breadcrumb"},"inLanguage":"ru-RU","potentialAction":[{"@type":"ReadAction","target":["https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/"]}]},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#primaryimage","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc_featured.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/07\/oc_featured.png","width":1672,"height":941,"caption":"OpenClaw web scraping with AI agent, coding skills, and NodeMaven residential proxies for automated data extraction"},{"@type":"BreadcrumbList","@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/nodemaven.com\/"},{"@type":"ListItem","position":2,"name":"OpenClaw web scraping guide: Build AI scrapers with residential proxies"}]},{"@type":"WebSite","@id":"https:\/\/nodemaven.com\/#website","url":"https:\/\/nodemaven.com\/","name":"NodeMaven","description":"","publisher":{"@id":"https:\/\/nodemaven.com\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/nodemaven.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ru-RU"},{"@type":["Organization","Place"],"@id":"https:\/\/nodemaven.com\/#organization","name":"NodeMaven","url":"https:\/\/nodemaven.com\/","logo":{"@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#local-main-organization-logo"},"image":{"@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#local-main-organization-logo"},"sameAs":["https:\/\/www.facebook.com\/people\/NodeMaven\/100095402507825\/","https:\/\/t.me\/NodeMavenTG","https:\/\/www.linkedin.com\/company\/nodemaven\/"],"telephone":[],"openingHoursSpecification":[{"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"],"opens":"00:00","closes":"23:59"}],"legalName":"NodeMaven FZ LLC","email":"support@nodemaven.com","description":"NodeMaven is a proxy infrastructure provider offering residential, mobile, and ISP proxies with IP quality filtering, precise geo-targeting, HTTPS and SOCKS5 support, and developer APIs.","contactPoint":[{"@type":"ContactPoint","contactType":"customer support","email":"support@nodemaven.com"},{"@type":"ContactPoint","contactType":"legal","email":"legal.public@nodemaven.com"}]},{"@type":"Person","@id":"https:\/\/nodemaven.com\/#\/schema\/person\/79a9c10c7956e31a5628504fe9cffe2e","name":"\u041e\u043b\u044c\u0433\u0430 \u041a\u043e\u0442\u043a\u043e","image":{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2026\/05\/olga-kotko_avatar-96x96.jpg","caption":"Olga Kotko"},"description":"\u042f \u043f\u0438\u0448\u0443 \u043e \u043f\u0440\u043e\u043a\u0441\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u043e\u0432\u044b\u0435 \u0442\u0435\u043c\u044b \u0432 \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0438\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u044f\u0445 \u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043b\u044e\u0434\u0438 \u043c\u043e\u0433\u0443\u0442 \u0441 \u0443\u0434\u043e\u0432\u043e\u043b\u044c\u0441\u0442\u0432\u0438\u0435\u043c \u0447\u0438\u0442\u0430\u0442\u044c.","url":"https:\/\/nodemaven.com\/ru\/author\/olga-kotko\/"},{"@type":"ImageObject","inLanguage":"ru-RU","@id":"https:\/\/nodemaven.com\/blog\/openclaw-web-scraping-guide\/#local-main-organization-logo","url":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/03\/cropped-Untitled-design-8-1.png","contentUrl":"https:\/\/nodemaven.com\/wp-content\/uploads\/2025\/03\/cropped-Untitled-design-8-1.png","width":512,"height":512,"caption":"NodeMaven"}]}},"_links":{"self":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/39651","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/users\/80"}],"replies":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/comments?post=39651"}],"version-history":[{"count":2,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/39651\/revisions"}],"predecessor-version":[{"id":39666,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/posts\/39651\/revisions\/39666"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media\/39653"}],"wp:attachment":[{"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/media?parent=39651"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/categories?post=39651"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nodemaven.com\/ru\/wp-json\/wp\/v2\/tags?post=39651"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}