Generate complete, runnable web scraper projects using the PageObject pattern with Playwright and TypeScript. This skill produces site-specific scrapers with typed data extraction, Docker deployment, and optional agent-browser integration for automated site analysis.
Works with
AI-first code editor with Composer
Before installing skills in Cursor, ensure your development environment meets these requirements:
node --versionscraper-builderExecute the skills CLI command in your project's root directory to begin installation:
Fetches scraper-builder from jwynia/agent-skills and configures it for Cursor.
The CLI shows a list of agents. Use arrow keys and space to select Cursor:
Confirm successful installation by checking the skill directory location:
Restart Cursor to activate scraper-builder. Access via /scraper-builder in your agent's command palette.
We perform automated surface-level scans (Gen AI Scanner, Socket, Snyk) during installation. These checks detect common vulnerabilities but do not guarantee complete security. Always review skill source code and verify the publisher's reputation before production use.
Skills execute code in your environment. Always review source, verify the publisher, and test in isolation before production.
Submit your Claude Code skill and start earning
Automate repetitive workflows and reduce manual effort
Example
Generate reports, summarize documents, draft communications
Save 3-5 hours per week on routine tasks
Learn new skills, understand complex topics, get expert guidance
Example
Explain concepts, provide examples, suggest learning resources
Accelerate learning and skill development by 2x
Enhance output quality through reviews, suggestions, and refinements
Example
Review drafts, suggest improvements, catch errors
Improve work quality by 30-40% with less effort
0
total installs
0
this week
46
GitHub stars
0
upvotes
Run in your terminal
0
installs
0
this week
46
stars
Generate complete, runnable web scraper projects using the PageObject pattern with Playwright and TypeScript. This skill produces site-specific scrapers with typed data extraction, Docker deployment, and optional agent-browser integration for automated site analysis.
Use this skill when:
Do NOT use this skill when:
Each page on the target site maps to one PageObject class. Locators are defined in the constructor, and scraping logic lives in methods. Page objects never contain assertions or business logic — they extract and return data.
Prefer selectors in this order: data-testid > id > semantic HTML (role, aria-label) > structured CSS classes > text content. Avoid positional selectors (nth-child) and layout-dependent paths. See references/playwright-selectors.md for the full hierarchy.
Reusable UI patterns (pagination, data tables, search bars) are modeled as component classes that page objects compose via properties. Only BasePage uses inheritance — everything else composes.
All scraped data flows through Zod schemas for validation. This catches selector drift (when a site changes its markup) at extraction time rather than downstream. See assets/templates/data-schema.ts.md.
Generated projects include a Dockerfile using Microsoft's official Playwright images and a docker-compose.yml with volume mounts for output data and debug screenshots. This ensures consistent browser environments across machines.
Use agent-browser to navigate the target site, capture accessibility tree snapshots, and automatically discover selectors. This is the preferred mode when the agent has access to the agent-browser CLI.
Prerequisites: If agent-browser is not already installed, add it as a skill first:
npx skills add vercel-labs/agent-browser
Workflow:
# 1. Open the target page
agent-browser open https://example.com/products
# 2. Capture interactive snapshot with element references
agent-browser snapshot -i --json > snapshot.json
# 3. Capture scoped sections for focused analysis
agent-browser snapshot -i --json -s "main" > main-content.json
agent-browser snapshot -i --json -s "nav" > navigation.json
# 4. Test dynamic behavior (pagination, load-more)
agent-browser click @e3
agent-browser wait --load networkidle
agent-browser snapshot -i --json > after-click.json
# 5. Close when done
agent-browser close
What the agent does with snapshots:
@e1, @e2, etc.) and their rolesSee references/agent-browser-workflow.md for the complete workflow reference.
The user describes the target site's page structure and the agent maps it to page objects. The agent asks structured questions:
The agent then:
data/site-archetypes.jsonGenerate a complete runnable project in one operation using the scaffolder script:
deno run --allow-read --allow-write scripts/scaffold-scraper-project.ts \
--name "my-scraper" \
--url "https://example.com" \
--pages "ProductListing,ProductDetail" \
--fields "title,price,image_url,description"
This produces a project with all source files, configuration, Docker setup, and an entry point ready to run. See the Scripts Reference section for full options.
| Category | Approach | Details |
|---|---|---|
| Framework | Playwright | playwright package, not @playwright/test |
| Language | TypeScript | Strict mode, ES2022 target |
| Pattern | PageObject | One class per page, compose components |
| Selectors | Resilient | data-testid > id > role > CSS class > text |
| Wait strategy | Auto-wait | Playwright built-in, plus networkidle for navigation |
| Validation | Zod | Schema per page object's output type |
| Output | JSON + CSV | Configurable via storage utility |
| Docker | Official image | mcr.microsoft.com/playwright:v1.48.0-jammy |
| Retry | Exponential backoff | 3 attempts default, configurable |
| Screenshots | On error | Saved to screenshots/ for debugging |
Follow this sequence when generating a scraper:
Ask the user for:
Use Mode 1 (agent-browser) or Mode 2 (manual description) to understand:
Create a plan listing:
Show the user the page object map before generating code. Include class names, field names, and the execution flow. Wait for confirmation.
Use the templates in assets/templates/ as the foundation:
base-page.ts.md — BasePage abstract classpage-object.ts.md — Site-specific page objectcomponent.ts.md — Reusable componentsscraper-runner.ts.md — Orchestratordata-schema.ts.md — Zod validation schemasProvide the complete project with:
assets/configs/Abstract class providing navigate(), waitForPageLoad(), screenshot(), and getText() helpers. All page objects extend this.
export abstract class BasePage {
constructor(protected readonly page: Page) {}
async navigate(url: string): Promise<void> { /* ... */ }
async screenshot(name: string): Promise<void> { /* ... */ }
}
See: assets/templates/base-page.ts.md
Site-specific class with locators as readonly properties, scrape methods returning typed data, and navigation methods for multi-page flows.
export class ProductListingPage extends BasePage {
readonly productCards: Locator;
readonly nextButton: Locator;
async scrapeProducts(): Promise<Product[]> { /* ... */ }
async goToNextPage(): Promise<boolean> { /* ... */ }
}
See: assets/templates/page-object.ts.md
Reusable UI pattern (Pagination, DataTable) that receives a parent locator scope and provides extraction methods.
export class Pagination {
constructor(private page: Page, private scope: Locator) {}
async hasNextPage(): Promise<boolean> { /* ... */ }
async goToNext(): Promise<void> { /* ... */ }
}
See: assets/templates/component.ts.md
Orchestrator that launches the browser, creates page objects, iterates through pages, collects data, validates with schemas, and writes output.
export class SiteScraper {
async run(): Promise<void> {
const browser = await chromium.launch();
const page = await browser.newPage();
// navigate, scrape, validate, write
}
}
See: assets/templates/scraper-runner.ts.md
Zod schemas that validate scraped records, catching selector drift and malformed data at extraction time.
export const ProductSchema = z.object({
title: z.string().min(1),
price: z.number().positive(),
});
See: assets/templates/data-schema.ts.md
| Anti-Pattern | Problem | Solution |
|---|---|---|
| Monolith Scraper | All scraping logic in one file | Split into PageObject classes per page |
| Sleep Waiter | Using setTimeout/fixed delays |
Use Playwright auto-wait and networkidle |
| Unvalidated Pipeline | No schema validation on output | Add Zod schemas for every data type |
| Selector Lottery | Fragile positional selectors | Use resilient selector hierarchy |
| Silent Failure | Swallowing errors without logging | Log failures and save debug screenshots |
| Unthrottled Crawler | No delay between requests | Add configurable request delays |
| Hardcoded Config | URLs and selectors in code | Use environment variables and config files |
| No Retry Logic | Single attempt per request | Implement exponential backoff |
See references/anti-patterns.md for the extended catalog with examples and fixes.
Generate a complete scraper project:
deno run --allow-read --allow-write scripts/scaffold-scraper-project.ts [options]
Options:
--name <name> Project name (required)
--path <path> Target directory (default: ./)
--url <url> Target site base URL
--pages <pages> Comma-separated page names (e.g., ProductListing,ProductDetail)
--fields <fiePrerequisites
Time Estimate
15-45 minutes depending on use case complexity
Steps
Common Pitfalls
✓ Do
✗ Don't
💡 Pro Tips
✓ Use when
Use when skill capabilities match your task, clear ROI on time saved, and you can validate outputs. Best for repetitive tasks, learning, and quality improvement.
✗ Avoid when
Avoid when task requires deep expertise you can't validate, involves sensitive decisions, or when learning process is more valuable than speed of completion.
jwynia/agent-skills
anthropics/claude-code
mblode/agent-skills
github/awesome-copilot
sickn33/antigravity-awesome-skills
leonxlnx/taste-skill
scraper-builder reduced setup friction for our internal harness; good balance of opinion and flexibility.
I recommend scraper-builder for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
Registry listing for scraper-builder matched our evaluation — installs cleanly and behaves as described in the markdown.
We added scraper-builder from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
scraper-builder reduced setup friction for our internal harness; good balance of opinion and flexibility.
Useful defaults in scraper-builder — fewer surprises than typical one-off scripts, and it plays nicely with `npx skills` flows.
I recommend scraper-builder for anyone iterating fast on agent tooling; clear intent and a small, reviewable surface area.
We added scraper-builder from the explainx registry; install was straightforward and the SKILL.md answered most questions upfront.
scraper-builder fits our agent workflows well — practical, well scoped, and easy to wire into existing repos.
Registry listing for scraper-builder matched our evaluation — installs cleanly and behaves as described in the markdown.
showing 1-10 of 46