A chrome extension to scrape information from a LinkedIn job post. It's useful for bookkeeping, and theoretically for human-in-the-loop automation. It breaks sometimes due to obfuscation.
- Open Chrome and go to
chrome://extensions/ - Turn on Developer mode
- Click Load unpacked
- Pick this folder (
LinkedIn Extension) - Open a LinkedIn job page, then click the extension icon.
Use make build.
It creates:
build/unpacked/for Load unpackedbuild/LinkedIn-JD-Extractor-<version>.zipfor upload/distributionbuild/version.jsonwith the built artifact metadata
- Navigate to any LinkedIn job page (e.g.,
linkedin.com/jobs/...) - Click on a job listing to view its details
- Click the extension icon in your toolbar
- View extracted job information in the popup
- Use Copy to Clipboard or Download JSON to export the data
window.__linkedinJDExtractor.debug.testSelectors()
window.__linkedinJDExtractor.extract().then(console.log)
window.__linkedinJDExtractor.debug.findSalary()
window.__linkedinJDExtractor.debug.findDescription()
window.__linkedinJDExtractor.debug.findTitle()
window.__linkedinJDExtractor.debug.findCompany()- Open
content.js - Update the
SELECTORSobject - Reload the extension in
chrome://extensions/ - Test on a LinkedIn job page
Optional Playwright tooling is available if you need an authenticated DOM snapshot:
npm install
npm run auth:linkedin
npm run probe:linkedin -- --url "https://www.linkedin.com/jobs/search/" --wait-ms 8000This writes output to debug/linkedin-dom/<timestamp>/. Treat .auth/ and debug/linkedin-dom/ as sensitive.
After saving one or more probe snapshots, run the parser against those DOM fixtures:
npm run test:parser -- --fixtures debug/linkedin-dom-test --write-actualEach fixture may include an expected-export.json sidecar. When present, the runner compares the extracted fields against it and reports diffs. Without an expected sidecar, it prints the parsed result so you can inspect what would export.
Useful flow:
npm run probe:linkedin -- --url "https://www.linkedin.com/jobs/search-results/?currentJobId=4401764934" --wait-ms 8000 --out-dir debug/linkedin-dom-test
npm run test:parser -- --fixtures debug/linkedin-dom-test --write-actual- This extension only works on LinkedIn job pages
- Some fields break on some listing paths
- LinkedIn's structure may change; selectors may need updates
- Arc browser users may need to manually trigger extraction after page load