udemy-crawler
Extract Udemy course content to markdown. Use when user asks to scrape/crawl Udemy course pages.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Extract Udemy course content to markdown. Use when user asks to scrape/crawl Udemy course pages.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Export Claude Code sessions to searchable markdown with QMD integration. Use when user says "sync sessions", "export sessions", "search sessions", "session history", or wants to backup/search past conversations. Don't use for live note-taking, meeting transcripts, or non-Claude-Code content.
Convert product briefs, websites, documents into structured product specs. Generates modular markdown files for landing pages, guides, marketing.
Generate step-by-step migration guides between tools, frameworks, or workflows. Outputs: Phase-by-phase migration plan, compatibility mapping, rollback strategy. Use when switching tools, upgrading frameworks, or adopting new workflows. Triggers: migrate from X to Y, switch to, upgrade from, moving from, /migrate
Generate complete project setup recipes combining Vibery templates, MCPs, and configurations. Outputs: Install commands, CLAUDE.md, folder structure, workflow setup. Use when starting new projects or adding major features to existing ones. Triggers: start new project, setup project, project blueprint, /blueprint
Transform conversations and ideas into structured technical specifications. Outputs: User stories, acceptance criteria, technical requirements, edge cases. Use when user wants to document requirements before coding. Triggers: write spec, create user stories, document requirements, /spec
Chain Vibery commands, skills, and agents into repeatable automated workflows. Outputs: Executable workflow files, hook configurations, CI/CD integration. Use when user has repetitive multi-step processes to automate. Triggers: create workflow, automate this process, chain these commands, /workflow
| name | udemy-crawler |
| description | Extract Udemy course content to markdown. Use when user asks to scrape/crawl Udemy course pages. |
Extract Udemy course data using Chrome DevTools skill.
cd .claude/skills/chrome-devtools/scripts && npm installcd .claude/skills/chrome-devtools/scripts
node evaluate.js \
--url "https://www.udemy.com/course/COURSE-SLUG/" \
--headless false \
--timeout 60000 \
--wait-until networkidle2 \
--script '(function() {
return {
title: document.querySelector("h1")?.textContent?.trim() || "",
headline: document.querySelector("[data-purpose=\"lead-headline\"]")?.textContent?.trim() || "",
rating: document.querySelector("[data-purpose=\"rating-number\"]")?.textContent?.trim() || "",
students: document.querySelector("[data-purpose=\"enrollment\"]")?.textContent?.trim() || "",
instructor: document.querySelector("[data-purpose=\"instructor-name-top\"] a")?.textContent?.trim() || "",
price: document.querySelector("[data-purpose=\"course-price-text\"] span span")?.textContent?.trim() || "",
lastUpdated: document.querySelector("[data-purpose=\"last-update-date\"]")?.textContent?.trim() || "",
language: document.querySelector("[data-purpose=\"lead-course-locale\"]")?.textContent?.trim() || "",
whatYouWillLearn: Array.from(document.querySelectorAll("[data-purpose=\"objective\"] span")).map(el => el.textContent?.trim()).filter(Boolean),
targetAudience: Array.from(document.querySelectorAll("[data-purpose=\"target-audience\"] li")).map(el => el.textContent?.trim()).filter(Boolean)
};
})()'
node evaluate.js \
--url "https://www.udemy.com/course/COURSE-SLUG/" \
--headless false \
--timeout 120000 \
--wait-until networkidle2 \
--script '(async function() {
window.scrollTo(0, 1200);
await new Promise(r => setTimeout(r, 1000));
const expandAll = Array.from(document.querySelectorAll("button")).find(b => b.textContent.includes("Expand all"));
if (expandAll) { expandAll.click(); await new Promise(r => setTimeout(r, 3000)); }
window.scrollTo(0, 5000);
await new Promise(r => setTimeout(r, 1000));
const mainContent = document.getElementById("main-content-anchor");
const parent = mainContent ? mainContent.closest("div") : document.body;
const fullText = parent.textContent;
const currStart = fullText.indexOf("Course content");
const currEnd = fullText.indexOf("Requirements") > currStart ? fullText.indexOf("Requirements") : fullText.indexOf("Who this course");
const descStart = fullText.indexOf("Description");
const descEnd = fullText.indexOf("Who this course");
const reqStart = fullText.indexOf("Requirements");
const reqEnd = fullText.indexOf("Description");
const targetStart = fullText.indexOf("Who this course is for");
return {
curriculum: fullText.substring(currStart, currEnd).replace(/\s+/g, " ").trim(),
requirements: fullText.substring(reqStart, reqEnd).replace(/\s+/g, " ").trim(),
description: fullText.substring(descStart, descEnd).replace(/\s+/g, " ").substring(0, 3000).trim(),
targetAudience: fullText.substring(targetStart, targetStart + 1500).replace(/\s+/g, " ").trim()
};
})()'
# {title}
**URL:** {url}
## Course Info
- **Instructor:** {instructor}
- **Rating:** {rating} ({students})
- **Language:** {language}
- **Price:** {price}
- **Last Updated:** {lastUpdated}
## What You'll Learn
{whatYouWillLearn as bullets}
## Course Content
{curriculum parsed into sections}
## Requirements
{requirements as bullets}
## Description
{description}
## Target Audience
{targetAudience as bullets}
data-purpose attributes stable for: rating, enrollment, objectives