linkedout/job-search-parser/parsers/skipthedrive-demo.js

130 lines
3.9 KiB
JavaScript

#!/usr/bin/env node
/**
* SkipTheDrive Parser Demo
*
* Demonstrates the SkipTheDrive job parser functionality
*/
const { parseSkipTheDrive } = require("./skipthedrive");
const fs = require("fs");
const path = require("path");
const { logger } = require("../../ai-analyzer");
// Load environment variables
require("dotenv").config({ path: path.join(__dirname, "..", ".env") });
async function runDemo() {
logger.step("🚀 SkipTheDrive Parser Demo");
// Demo configuration
const options = {
// Search for QA automation jobs (from your example)
keywords: process.env.SEARCH_KEYWORDS?.split(",").map((k) => k.trim()) || [
"automation qa",
"qa engineer",
"test automation",
],
// Job type filters - can be: "part time", "full time", "contract"
jobTypes: process.env.JOB_TYPES?.split(",").map((t) => t.trim()) || [],
// Location filter (optional)
locationFilter: process.env.LOCATION_FILTER || "",
// Maximum pages to parse
maxPages: parseInt(process.env.MAX_PAGES) || 3,
// Browser headless mode
headless: process.env.HEADLESS !== "false",
// AI analysis
enableAI: process.env.ENABLE_AI_ANALYSIS !== "false",
aiContext: "remote QA and test automation job opportunities",
};
logger.info("Configuration:");
logger.info(`- Keywords: ${options.keywords.join(", ")}`);
logger.info(
`- Job Types: ${
options.jobTypes.length > 0 ? options.jobTypes.join(", ") : "All types"
}`
);
logger.info(`- Location Filter: ${options.locationFilter || "None"}`);
logger.info(`- Max Pages: ${options.maxPages}`);
logger.info(`- Headless: ${options.headless}`);
logger.info(`- AI Analysis: ${options.enableAI}`);
logger.info("\nStarting parser...");
try {
const startTime = Date.now();
const results = await parseSkipTheDrive(options);
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
// Save results
const timestamp = new Date()
.toISOString()
.replace(/[:.]/g, "-")
.slice(0, -5);
const resultsDir = path.join(__dirname, "..", "results");
if (!fs.existsSync(resultsDir)) {
fs.mkdirSync(resultsDir, { recursive: true });
}
const resultsFile = path.join(
resultsDir,
`skipthedrive-results-${timestamp}.json`
);
fs.writeFileSync(resultsFile, JSON.stringify(results, null, 2));
// Display summary
logger.step("\n📊 Parsing Summary:");
logger.info(`- Duration: ${duration} seconds`);
logger.info(`- Jobs Found: ${results.results.length}`);
logger.info(`- Jobs Rejected: ${results.rejectedResults.length}`);
logger.file(`- Results saved to: ${resultsFile}`);
// Show sample results
if (results.results.length > 0) {
logger.info("\n🔍 Sample Jobs Found:");
results.results.slice(0, 5).forEach((job, index) => {
logger.info(`\n${index + 1}. ${job.title}`);
logger.info(` Company: ${job.company}`);
logger.info(` Posted: ${job.daysAgo}`);
logger.info(` Featured: ${job.isFeatured ? "Yes" : "No"}`);
logger.info(` URL: ${job.jobUrl}`);
if (job.aiAnalysis) {
logger.ai(
` AI Relevant: ${job.aiAnalysis.isRelevant ? "Yes" : "No"} (${(
job.aiAnalysis.confidence * 100
).toFixed(0)}% confidence)`
);
}
});
}
// Show rejection reasons
if (results.rejectedResults.length > 0) {
const rejectionReasons = {};
results.rejectedResults.forEach((job) => {
rejectionReasons[job.reason] = (rejectionReasons[job.reason] || 0) + 1;
});
logger.info("\n❌ Rejection Reasons:");
Object.entries(rejectionReasons).forEach(([reason, count]) => {
logger.info(` ${reason}: ${count}`);
});
}
} catch (error) {
logger.error("\n❌ Demo failed:", error.message);
process.exit(1);
}
}
// Run the demo
runDemo().catch((err) => {
logger.error("Fatal error:", err);
process.exit(1);
});