A self-healing job scraper that tracks live tech roles on Instahyre and turns them into a queryable dataset — built with Bright Data Scraper Studio + Python + SQLite.
- Scrapes live job listings from Instahyre using an AI-generated extractor (no hand-written selectors)
- Cleans and deduplicates raw JSON output
- Loads structured data into a local SQLite database
- Reports top hiring companies and hottest locations instantly
- Self-heals broken extraction logic with a single CLI command — no code rewrite needed
| Tool | Purpose |
|---|---|
| Node.js + npm | Run the Bright Data CLI via npx |
| Python 3 | Run the data pipeline |
| Bright Data account | Scraper Studio access (use promo code wemakedevs for free credits) |
npx -p @brightdata/cli bdata loginOpens a browser for OAuth. On success, auto-creates the cli_unlocker and cli_browser zones needed for scraping.
To install permanently:
npm install -g @brightdata/cli, then usebdata ...directly.
bdata scraper create https://www.instahyre.com/search \
"job title, company name, salary range, experience level, location, posted date"Bright Data's AI reads the live page and builds extraction logic from your plain-language field list. Takes ~5–25 minutes.
You'll get back a Collector ID:
Collector ID: c_mt5evkhh7xjyn2fi0
bdata scraper run c_mt5evkhh7xjyn2fi0 https://www.instahyre.com/search --pretty > jobs.jsonReturns structured JSON, one object per listing:
{
"job_title": "Senior Software Engineer",
"company_name": "Toast",
"experience_level": "5-8 Years",
"location": "Bangalore",
"product_page_url": "https://www.instahyre.com/job-422225-..."
}Note: Some text fields come duplicated (e.g.
"Bangalore Bangalore") due to how the site renders DOM. The pipeline handles this automatically.
python pipeline.pyThis will:
- Load
jobs.json - Clean duplicated text fields
- Insert new rows into
jobs.db(SQLite), deduplicated by URL - Print a summary report
Sample output:
Inserted 200 new jobs
Open roles by company:
Infosys: 6
Deutsche Telekom Digital Labs: 6
Toast: 5
Arcana: 5
Nielsen: 4
Open roles by location:
Bangalore: 104
Gurgaon: 21
Work From Home: 20
Hyderabad: 9
Mumbai: 5
The pipeline is safe to re-run (e.g. on a cron schedule) — it only inserts new jobs, building a time series of hiring activity over time.
This is the core feature — the scraper survives real-world site changes without a rewrite.
- Open the scraper config:
https://brightdata.com/cp/scrapers/c_mt5evkhh7xjyn2fi0 - Deliberately break a field's extraction rule (e.g. point
job_titleat a wrong selector). Save. - Confirm the field returns empty:
bdata scraper run c_mt5evkhh7xjyn2fi0 https://www.instahyre.com/search --pretty
- Heal it with a plain-language description:
bdata scraper heal c_mt5evkhh7xjyn2fi0 "job_title field returning empty, extraction broke" - Re-run and confirm the field is populated again.
- Re-run
python pipeline.py— new data flows into the samejobs.db, zero schema changes needed.
.
├── pipeline.py # Cleans JSON → loads into SQLite → prints report
├── jobs.json # Raw scraper output (regenerated each run)
├── jobs.db # SQLite database (accumulates over time)
├── instructions.md # Detailed build log and notes
└── README.md
- Salary range comes back empty for all rows — Instahyre hides salary behind a login wall on the public search page. This is expected, not a scraper bug.
- Government domains (e.g.
eprocure.gov.in) are blocked by Bright Data's platform (returns400 Domain not allowed). - The Collector ID
c_mt5evkhh7xjyn2fi0is specific to this project's scraper instance.
- Demo video: create → run → break → heal → run → pipeline re-run
- Submit at: https://forms.gle/iQf2SjHQViSJaRAv7