@jomari-wp/linkedin-jobs-scraper
Version:
Scrape public available jobs on Linkedin using headless browser
78 lines (70 loc) • 2.24 kB
text/typescript
import { EventMap } from 'typed-emitter';
type BrowserEvent = "disconnected" | "targetchanged" | "targetcreated" | "targetdestroyed";
export interface IData {
query: string;
location: string;
jobId: string;
jobIndex: number; // Job index during search, only useful for debug
link: string;
applyLink?: string;
title: string;
company: string;
companyLink?: string;
companyImgLink?: string;
place: string;
date: string;
description: string;
descriptionHTML: string;
insights: string[];
}
export interface IMetrics {
processed: number; // Number of successfully processed jobs
failed: number; // Number of jobs failed to process (because of an error)
missed: number; // Number of missed jobs to load during scraping
}
interface IEvents {
scraper: {
data: "scraper:data";
error: "scraper:error";
metrics: "scraper:metrics";
invalidSession: "scraper:invalid-session",
end: "scraper:end";
},
puppeteer: {
browser: {
disconnected: BrowserEvent;
targetchanged: BrowserEvent;
targetcreated: BrowserEvent;
targetdestroyed: BrowserEvent;
},
},
}
const events: IEvents = {
scraper: {
data: "scraper:data",
error: "scraper:error",
metrics: "scraper:metrics",
invalidSession: "scraper:invalid-session",
end: "scraper:end",
},
puppeteer: {
browser: {
disconnected: "disconnected" as BrowserEvent,
targetchanged: "targetchanged" as BrowserEvent,
targetcreated: "targetcreated" as BrowserEvent,
targetdestroyed: "targetdestroyed" as BrowserEvent,
},
},
};
export type IEventListeners = {
["scraper:data"]: (data: IData) => void;
["scraper:error"]: (error: Error | string) => void;
["scraper:metrics"]: (data: IMetrics) => void;
["scraper:invalid-session"]: () => void;
["scraper:end"]: () => void;
["disconnected"]: (...args: any[]) => void;
["targetchanged"]: (...args: any[]) => void;
["targetcreated"]: (...args: any[]) => void;
["targetdestroyed"]: (...args: any[]) => void;
}
export { events };