<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Charles</title>
    <description>The latest articles on DEV Community by Charles (@charles_90891cea4a1800830).</description>
    <link>https://dev.to/charles_90891cea4a1800830</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3930561%2Ffe7dbf6f-a808-436a-ad76-e12cbbe330af.png</url>
      <title>DEV Community: Charles</title>
      <link>https://dev.to/charles_90891cea4a1800830</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/charles_90891cea4a1800830"/>
    <language>en</language>
    <item>
      <title>xcrawl-scraper v1.0.1 — Node.js SDK for Web Scraping</title>
      <dc:creator>Charles</dc:creator>
      <pubDate>Thu, 14 May 2026 08:51:26 +0000</pubDate>
      <link>https://dev.to/charles_90891cea4a1800830/xcrawl-scraper-v101-nodejs-sdk-for-web-scraping-2p49</link>
      <guid>https://dev.to/charles_90891cea4a1800830/xcrawl-scraper-v101-nodejs-sdk-for-web-scraping-2p49</guid>
      <description>&lt;p&gt;I just released &lt;strong&gt;xcrawl-scraper v1.0.1&lt;/strong&gt; on npm!&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scrape&lt;/strong&gt; any webpage → clean Markdown, JSON, HTML, or text&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search&lt;/strong&gt; the web → structured results with snippets&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crawl&lt;/strong&gt; entire sites → built-in sitemap discovery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Extraction&lt;/strong&gt; — describe what you want in plain English, get JSON back&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Proxy control&lt;/strong&gt; — choose exit region (US, JP, DE, GB) or sticky sessions&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;xcrawl-scraper
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;XCrawlScraper&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;xcrawl-scraper&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;xcrawl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;XCrawlScraper&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;apiKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;YOUR_API_KEY&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;xcrawl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;scrapeMarkdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;https://example.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;markdown&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/yanxvdong123/xcrawl-scraper" rel="noopener noreferrer"&gt;https://github.com/yanxvdong123/xcrawl-scraper&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;npm&lt;/strong&gt;: &lt;a href="https://www.npmjs.com/package/xcrawl-scraper" rel="noopener noreferrer"&gt;https://www.npmjs.com/package/xcrawl-scraper&lt;/a&gt;&lt;/p&gt;

</description>
      <category>showdev</category>
      <category>javascript</category>
      <category>webscraping</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I Built a Web Scraper API That Handles JS Rendering, CAPTCHAs, and Proxies</title>
      <dc:creator>Charles</dc:creator>
      <pubDate>Thu, 14 May 2026 06:29:19 +0000</pubDate>
      <link>https://dev.to/charles_90891cea4a1800830/i-built-a-web-scraper-api-that-handles-js-rendering-captchas-and-proxies-56hp</link>
      <guid>https://dev.to/charles_90891cea4a1800830/i-built-a-web-scraper-api-that-handles-js-rendering-captchas-and-proxies-56hp</guid>
      <description>&lt;p&gt;I got tired of maintaining Puppeteer scripts and proxy lists for every website I needed data from. So I built something better -- a single API that handles JS rendering, proxy rotation, CAPTCHA solving, and AI-powered extraction.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Scrape any page
&lt;/h3&gt;

&lt;p&gt;\\ash&lt;br&gt;
curl -X POST '&lt;a href="https://run.xcrawl.com/v1/scrape" rel="noopener noreferrer"&gt;https://run.xcrawl.com/v1/scrape&lt;/a&gt;' \&lt;br&gt;
  -H 'Authorization: Bearer ***' \&lt;br&gt;
  -H 'Content-Type: application/json' \&lt;br&gt;
  -d '{"url": "&lt;a href="https://news.ycombinator.com" rel="noopener noreferrer"&gt;https://news.ycombinator.com&lt;/a&gt;", "output": {"formats": ["markdown"]}}'&lt;br&gt;
\\&lt;br&gt;
Returns clean Markdown. No HTML parsing, no DOM traversal.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI extraction
&lt;/h3&gt;

&lt;p&gt;Describe what you want in English, get structured JSON:&lt;br&gt;
\\ash&lt;br&gt;
curl -X POST '&lt;a href="https://run.xcrawl.com/v1/scrape" rel="noopener noreferrer"&gt;https://run.xcrawl.com/v1/scrape&lt;/a&gt;' \&lt;br&gt;
  -H 'Authorization: Bearer ***' \&lt;br&gt;
  -H 'Content-Type: application/json' \&lt;br&gt;
  -d '{"url": "&lt;a href="https://example.com" rel="noopener noreferrer"&gt;https://example.com&lt;/a&gt;", "output": {"formats": ["json"]}, "json": {"prompt": "Extract product names and prices"}}'&lt;br&gt;
\\&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Search the web
&lt;/h3&gt;

&lt;p&gt;\\ash&lt;br&gt;
curl -X POST '&lt;a href="https://run.xcrawl.com/v1/search" rel="noopener noreferrer"&gt;https://run.xcrawl.com/v1/search&lt;/a&gt;' \&lt;br&gt;
  -H 'Authorization: Bearer ***' \&lt;br&gt;
  -H 'Content-Type: application/json' \&lt;br&gt;
  -d '{"query": "web scraping best practices", "location": "US"}'&lt;br&gt;
\\&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Full crawl with proxy control
&lt;/h3&gt;

&lt;p&gt;Choose exit region (US, JP, DE) or sticky session:&lt;br&gt;
\\ash&lt;br&gt;
curl -X POST '&lt;a href="https://run.xcrawl.com/v1/crawl" rel="noopener noreferrer"&gt;https://run.xcrawl.com/v1/crawl&lt;/a&gt;' \&lt;br&gt;
  -H 'Authorization: Bearer ***' \&lt;br&gt;
  -H 'Content-Type: application/json' \&lt;br&gt;
  -d '{"url": "&lt;a href="https://docs.example.com/" rel="noopener noreferrer"&gt;https://docs.example.com/&lt;/a&gt;", "crawler": {"limit": 50, "max_depth": 3}, "proxy": {"location": "JP"}}'&lt;br&gt;
\\&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;p&gt;Credit-based: basic scrape = 1 credit, search = 2, AI extraction = 5, crawl = 1-5 per page.&lt;br&gt;
Free plan: 1000 credits, no credit card.&lt;br&gt;
Paid plans: Hobby \\/mo -&amp;gt; Starter \\/mo -&amp;gt; Pro \\/mo -&amp;gt; Enterprise \\/mo.&lt;/p&gt;

&lt;h2&gt;
  
  
  SDK
&lt;/h2&gt;

&lt;p&gt;\\ash&lt;br&gt;
npm install xcrawl-scraper&lt;br&gt;
\\&lt;br&gt;
\\ ypescript&lt;br&gt;
import { XCrawlScraper } from 'xcrawl-scraper';&lt;br&gt;
const x = new XCrawlScraper({ apiKey: process.env.XCRAWL_API_KEY });&lt;br&gt;
const r = await x.scrapeMarkdown('&lt;a href="https://example.com'" rel="noopener noreferrer"&gt;https://example.com'&lt;/a&gt;);&lt;br&gt;
\\&lt;/p&gt;

&lt;p&gt;CLI: \&lt;br&gt;
px xcrawl-scraper scrape &lt;a href="https://example.com%5C" rel="noopener noreferrer"&gt;https://example.com\&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Sign up at dash.xcrawl.com (free, no credit card)&lt;/li&gt;
&lt;li&gt;Get your API key&lt;/li&gt;
&lt;li&gt;Make your first API call in 30 seconds&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Built this because I needed it. Questions? Drop a comment.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>webscraping</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
