130 lines
3.9 KiB
JavaScript
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);
|
|
});
|