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