[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F7RG9N9SEMAY0HH9YKSFSF":3,"skill-same:01M6F7RG9N9SEMAY0HH9YKSFSF":88},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":65,"commitSha":66,"skillDirectory":67,"forksCount":68,"repositoryHtmlUrl":69,"repositoryHomepageUrl":70,"ownerHtmlUrl":71,"ownerBlogUrl":6,"ownerDescription":72,"updatedAt":73,"install":74,"resources":87},"01M6F7RG9N9SEMAY0HH9YKSFSF","brightdata-core-workflow-a",null,"Scrape structured data with Bright Data Scraping Browser using Playwright\u002FPuppeteer.\nUse when scraping JavaScript-rendered pages, SPAs, or sites requiring browser interaction.\nTrigger with phrases like \"brightdata scraping browser\", \"brightdata playwright\",\n\"brightdata puppeteer\", \"scrape SPA with brightdata\", \"browser scraping\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fbrightdata-core-workflow-a\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"workflow","brightdata core workflow a","brightdata","core","edit","structured data","interaction","sites","trigger","io","spa","scraping","code","write","read","Bash","scrape","data","puppeteer","browser","2026-11-10 10:12:30",false,"---\nname: brightdata-core-workflow-a\ndescription: |\n  Scrape structured data with Bright Data Scraping Browser using Playwright\u002FPuppeteer.\n  Use when scraping JavaScript-rendered pages, SPAs, or sites requiring browser interaction.\n  Trigger with phrases like \"brightdata scraping browser\", \"brightdata playwright\",\n  \"brightdata puppeteer\", \"scrape SPA with brightdata\", \"browser scraping\".\nallowed-tools: Read, Write, Edit, Bash(npm:*), Bash(npx:*), Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, scraping, data, brightdata, playwright, puppeteer]\ncompatible-with: claude-code\n---\n\n# Bright Data Scraping Browser\n\n## Overview\n\nUse Bright Data's Scraping Browser to scrape JavaScript-rendered pages. The Scraping Browser works like a regular Playwright\u002FPuppeteer browser but routes through Bright Data's proxy infrastructure with built-in CAPTCHA solving, fingerprint management, and automatic retries.\n\n## Prerequisites\n\n- Completed `brightdata-install-auth` setup\n- Scraping Browser zone active in Bright Data control panel\n- Playwright or Puppeteer installed\n\n## Instructions\n\n### Step 1: Install Playwright\n\n```bash\nnpm install playwright\nnpx playwright install chromium\n```\n\n### Step 2: Connect to Scraping Browser with Playwright\n\n```typescript\n\u002F\u002F scraping-browser.ts\nimport { chromium } from 'playwright';\nimport 'dotenv\u002Fconfig';\n\nconst { BRIGHTDATA_CUSTOMER_ID, BRIGHTDATA_ZONE, BRIGHTDATA_ZONE_PASSWORD } = process.env;\n\nconst AUTH = `brd-customer-${BRIGHTDATA_CUSTOMER_ID}-zone-${BRIGHTDATA_ZONE}:${BRIGHTDATA_ZONE_PASSWORD}`;\nconst BROWSER_WS = `wss:\u002F\u002F${AUTH}@brd.superproxy.io:9222`;\n\nasync function scrapWithBrowser(url: string) {\n  console.log('Connecting to Scraping Browser...');\n  const browser = await chromium.connectOverCDP(BROWSER_WS);\n\n  try {\n    const page = await browser.newPage();\n    await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });\n\n    \u002F\u002F Wait for dynamic content to load\n    await page.waitForSelector('body', { timeout: 30000 });\n\n    \u002F\u002F Extract structured data\n    const data = await page.evaluate(() => ({\n      title: document.title,\n      metaDescription: document.querySelector('meta[name=\"description\"]')?.getAttribute('content') || '',\n      h1: document.querySelector('h1')?.textContent?.trim() || '',\n      links: Array.from(document.querySelectorAll('a[href]')).slice(0, 20).map(a => ({\n        text: a.textContent?.trim(),\n        href: a.getAttribute('href'),\n      })),\n    }));\n\n    console.log('Scraped data:', JSON.stringify(data, null, 2));\n    return data;\n  } finally {\n    await browser.close();\n  }\n}\n\nscrapWithBrowser('https:\u002F\u002Fexample.com').catch(console.error);\n```\n\n### Step 3: Scrape Dynamic Product Listings\n\n```typescript\n\u002F\u002F scrape-products.ts — real-world example\nimport { chromium, Page } from 'playwright';\nimport 'dotenv\u002Fconfig';\n\ninterface Product {\n  name: string;\n  price: string;\n  rating: string;\n  url: string;\n}\n\nconst AUTH = `brd-customer-${process.env.BRIGHTDATA_CUSTOMER_ID}-zone-${process.env.BRIGHTDATA_ZONE}:${process.env.BRIGHTDATA_ZONE_PASSWORD}`;\n\nasync function scrapeProducts(searchUrl: string): Promise\u003CProduct[]> {\n  const browser = await chromium.connectOverCDP(`wss:\u002F\u002F${AUTH}@brd.superproxy.io:9222`);\n  const page = await browser.newPage();\n\n  try {\n    await page.goto(searchUrl, { waitUntil: 'networkidle', timeout: 90000 });\n\n    \u002F\u002F Scroll to trigger lazy-loaded content\n    await autoScroll(page);\n\n    const products = await page.evaluate(() => {\n      return Array.from(document.querySelectorAll('[data-testid=\"product-card\"]')).map(card => ({\n        name: card.querySelector('.product-title')?.textContent?.trim() || '',\n        price: card.querySelector('.price')?.textContent?.trim() || '',\n        rating: card.querySelector('.rating')?.textContent?.trim() || '',\n        url: card.querySelector('a')?.getAttribute('href') || '',\n      }));\n    });\n\n    return products;\n  } finally {\n    await browser.close();\n  }\n}\n\nasync function autoScroll(page: Page): Promise\u003Cvoid> {\n  await page.evaluate(async () => {\n    await new Promise\u003Cvoid>((resolve) => {\n      let totalHeight = 0;\n      const distance = 300;\n      const timer = setInterval(() => {\n        window.scrollBy(0, distance);\n        totalHeight += distance;\n        if (totalHeight >= document.body.scrollHeight) {\n          clearInterval(timer);\n          resolve();\n        }\n      }, 200);\n    });\n  });\n}\n```\n\n### Step 4: Puppeteer Alternative\n\n```typescript\n\u002F\u002F scraping-browser-puppeteer.ts\nimport puppeteer from 'puppeteer-core';\n\nconst AUTH = `brd-customer-${process.env.BRIGHTDATA_CUSTOMER_ID}-zone-${process.env.BRIGHTDATA_ZONE}:${process.env.BRIGHTDATA_ZONE_PASSWORD}`;\n\nasync function scrapeWithPuppeteer(url: string) {\n  const browser = await puppeteer.connect({\n    browserWSEndpoint: `wss:\u002F\u002F${AUTH}@brd.superproxy.io:9222`,\n  });\n  const page = await browser.newPage();\n  await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });\n  const title = await page.title();\n  console.log('Page title:', title);\n  await browser.close();\n}\n```\n\n## Output\n\n- Browser connection through Bright Data's proxy network\n- Scraped structured data from JS-rendered pages\n- Automatic CAPTCHA solving and fingerprint management\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `WebSocket connection failed` | Wrong zone or credentials | Verify Scraping Browser zone is active |\n| `Timeout 60000ms exceeded` | Slow page load | Increase timeout; use `domcontentloaded` instead of `networkidle` |\n| `Target closed` | Browser disconnected | Implement retry logic; browser sessions are ephemeral |\n| `Navigation failed` | Site blocked request | Scraping Browser handles this; increase timeout |\n\n## Resources\n\n- [Scraping Browser Docs](https:\u002F\u002Fdocs.brightdata.com\u002Fscraping-automation\u002Fscraping-browser\u002Foverview)\n- [Scraping Browser Code Examples](https:\u002F\u002Fdocs.brightdata.com\u002Fscraping-automation\u002Fscraping-browser\u002Fcode-examples)\n- [Playwright CDP Docs](https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fapi\u002Fclass-browsertype#browser-type-connect-over-cdp)\n\n## Next Steps\n\nFor SERP API scraping, see `brightdata-core-workflow-b`.\n\n","# Bright Data Scraping Browser\n\n## Overview\n\nUse Bright Data's Scraping Browser to scrape JavaScript-rendered pages. The Scraping Browser works like a regular Playwright\u002FPuppeteer browser but routes through Bright Data's proxy infrastructure with built-in CAPTCHA solving, fingerprint management, and automatic retries.\n\n## Prerequisites\n\n- Completed `brightdata-install-auth` setup\n- Scraping Browser zone active in Bright Data control panel\n- Playwright or Puppeteer installed\n\n## Instructions\n\n### Step 1: Install Playwright\n\n```bash\nnpm install playwright\nnpx playwright install chromium\n```\n\n### Step 2: Connect to Scraping Browser with Playwright\n\n```typescript\n\u002F\u002F scraping-browser.ts\nimport { chromium } from 'playwright';\nimport 'dotenv\u002Fconfig';\n\nconst { BRIGHTDATA_CUSTOMER_ID, BRIGHTDATA_ZONE, BRIGHTDATA_ZONE_PASSWORD } = process.env;\n\nconst AUTH = `brd-customer-${BRIGHTDATA_CUSTOMER_ID}-zone-${BRIGHTDATA_ZONE}:${BRIGHTDATA_ZONE_PASSWORD}`;\nconst BROWSER_WS = `wss:\u002F\u002F${AUTH}@brd.superproxy.io:9222`;\n\nasync function scrapWithBrowser(url: string) {\n  console.log('Connecting to Scraping Browser...');\n  const browser = await chromium.connectOverCDP(BROWSER_WS);\n\n  try {\n    const page = await browser.newPage();\n    await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });\n\n    \u002F\u002F Wait for dynamic content to load\n    await page.waitForSelector('body', { timeout: 30000 });\n\n    \u002F\u002F Extract structured data\n    const data = await page.evaluate(() => ({\n      title: document.title,\n      metaDescription: document.querySelector('meta[name=\"description\"]')?.getAttribute('content') || '',\n      h1: document.querySelector('h1')?.textContent?.trim() || '',\n      links: Array.from(document.querySelectorAll('a[href]')).slice(0, 20).map(a => ({\n        text: a.textContent?.trim(),\n        href: a.getAttribute('href'),\n      })),\n    }));\n\n    console.log('Scraped data:', JSON.stringify(data, null, 2));\n    return data;\n  } finally {\n    await browser.close();\n  }\n}\n\nscrapWithBrowser('https:\u002F\u002Fexample.com').catch(console.error);\n```\n\n### Step 3: Scrape Dynamic Product Listings\n\n```typescript\n\u002F\u002F scrape-products.ts — real-world example\nimport { chromium, Page } from 'playwright';\nimport 'dotenv\u002Fconfig';\n\ninterface Product {\n  name: string;\n  price: string;\n  rating: string;\n  url: string;\n}\n\nconst AUTH = `brd-customer-${process.env.BRIGHTDATA_CUSTOMER_ID}-zone-${process.env.BRIGHTDATA_ZONE}:${process.env.BRIGHTDATA_ZONE_PASSWORD}`;\n\nasync function scrapeProducts(searchUrl: string): Promise\u003CProduct[]> {\n  const browser = await chromium.connectOverCDP(`wss:\u002F\u002F${AUTH}@brd.superproxy.io:9222`);\n  const page = await browser.newPage();\n\n  try {\n    await page.goto(searchUrl, { waitUntil: 'networkidle', timeout: 90000 });\n\n    \u002F\u002F Scroll to trigger lazy-loaded content\n    await autoScroll(page);\n\n    const products = await page.evaluate(() => {\n      return Array.from(document.querySelectorAll('[data-testid=\"product-card\"]')).map(card => ({\n        name: card.querySelector('.product-title')?.textContent?.trim() || '',\n        price: card.querySelector('.price')?.textContent?.trim() || '',\n        rating: card.querySelector('.rating')?.textContent?.trim() || '',\n        url: card.querySelector('a')?.getAttribute('href') || '',\n      }));\n    });\n\n    return products;\n  } finally {\n    await browser.close();\n  }\n}\n\nasync function autoScroll(page: Page): Promise\u003Cvoid> {\n  await page.evaluate(async () => {\n    await new Promise\u003Cvoid>((resolve) => {\n      let totalHeight = 0;\n      const distance = 300;\n      const timer = setInterval(() => {\n        window.scrollBy(0, distance);\n        totalHeight += distance;\n        if (totalHeight >= document.body.scrollHeight) {\n          clearInterval(timer);\n          resolve();\n        }\n      }, 200);\n    });\n  });\n}\n```\n\n### Step 4: Puppeteer Alternative\n\n```typescript\n\u002F\u002F scraping-browser-puppeteer.ts\nimport puppeteer from 'puppeteer-core';\n\nconst AUTH = `brd-customer-${process.env.BRIGHTDATA_CUSTOMER_ID}-zone-${process.env.BRIGHTDATA_ZONE}:${process.env.BRIGHTDATA_ZONE_PASSWORD}`;\n\nasync function scrapeWithPuppeteer(url: string) {\n  const browser = await puppeteer.connect({\n    browserWSEndpoint: `wss:\u002F\u002F${AUTH}@brd.superproxy.io:9222`,\n  });\n  const page = await browser.newPage();\n  await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 60000 });\n  const title = await page.title();\n  console.log('Page title:', title);\n  await browser.close();\n}\n```\n\n## Output\n\n- Browser connection through Bright Data's proxy network\n- Scraped structured data from JS-rendered pages\n- Automatic CAPTCHA solving and fingerprint management\n\n## Error Handling\n\n| Error | Cause | Solution |\n|-------|-------|----------|\n| `WebSocket connection failed` | Wrong zone or credentials | Verify Scraping Browser zone is active |\n| `Timeout 60000ms exceeded` | Slow page load | Increase timeout; use `domcontentloaded` instead of `networkidle` |\n| `Target closed` | Browser disconnected | Implement retry logic; browser sessions are ephemeral |\n| `Navigation failed` | Site blocked request | Scraping Browser handles this; increase timeout |\n\n## Resources\n\n- [Scraping Browser Docs](https:\u002F\u002Fdocs.brightdata.com\u002Fscraping-automation\u002Fscraping-browser\u002Foverview)\n- [Scraping Browser Code Examples](https:\u002F\u002Fdocs.brightdata.com\u002Fscraping-automation\u002Fscraping-browser\u002Fcode-examples)\n- [Playwright CDP Docs](https:\u002F\u002Fplaywright.dev\u002Fdocs\u002Fapi\u002Fclass-browsertype#browser-type-connect-over-cdp)\n\n## Next Steps\n\nFor SERP API scraping, see `brightdata-core-workflow-b`.\n\n",{"name":5,"tags":57,"author":60,"license":15,"version":61,"description":62,"allowed-tools":63,"compatible-with":64},[58,43,49,34,59,50],"saas","playwright","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Scrape structured data with Bright Data Scraping Browser using Playwright\u002FPuppeteer.\nUse when scraping JavaScript-rendered pages, SPAs, or sites requiring browser interaction.\nTrigger with phrases like \"brightdata scraping browser\", \"brightdata playwright\",\n\"brightdata puppeteer\", \"scrape SPA with brightdata\", \"browser scraping\".\n","Read, Write, Edit, Bash(npm:*), Bash(npx:*), Grep","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fbrightdata-core-workflow-a",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":75,"prompt":85,"zipAvailable":86},[76,79,82],{"tool":77,"command":78},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill brightdata-core-workflow-a",{"tool":80,"command":81},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill brightdata-core-workflow-a",{"tool":83,"command":84},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill brightdata-core-workflow-a","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fbrightdata-core-workflow-a\u002FSKILL.md",true,[],[89,99,109,118,124,131],{"skillNo":90,"name":91,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":95,"publishedAt":52},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[94],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[96,97,98],"model","model hierarchy","model hierarchy skill",{"skillNo":100,"name":101,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":105,"publishedAt":52},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[104],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[106,107,108],"MCP","zoom","zoom mcp",{"skillNo":110,"name":111,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":114,"publishedAt":52},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[115,116,117,107],"sdk","zoom apps sdk","apps",{"skillNo":119,"name":120,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":121,"categories":122,"keywords":123,"publishedAt":52},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[120],{"skillNo":125,"name":126,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":130,"publishedAt":52},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[129],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[126],{"skillNo":132,"name":133,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":134,"categories":135,"keywords":136,"publishedAt":52},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[133]]