DevConnectDevConnect
Sign up · Log in

webscraping

h@hafizdanishalimuhammadilyas

Shipped: An AI Job Matcher Agent — paste a job URL + your resume, get a match score, skill gaps, and a cover letter

Applying for jobs is the same loop every time: read the posting, compare it with your resume, guess your chances, then write a cover letter from scratch. I built an agent that does all of it in one request. Flow: paste a job posting URL → upload your resume PDF → get the analysis back. Output: - match score (0-100) — how well the profile fits the role - skill gaps — what the job asks for that the resume doesn't have - strengths — what actually lines up - cover letter — personalized, ready to send Stack: - FastAPI — async API, two endpoints: /analyze (JSON, local resume path) and /analyze-upload (multipart file upload). Auto Swagger docs at /docs . - OpenAI GPT — the reasoning layer. Single structured prompt, JSON-only output, validated with Pydantic before it ever reaches the response. - httpx + BeautifulSoup — scrapes the job page, pulls the title and hunts for requirement lists (looks for requirements / responsibilities / you will headings, falls back to the first bullet lists on the page). - pdfplumber — page-by-page text extraction from the resume PDF. - Jinja2 + vanilla CSS — drag-and-drop UI, no frontend framework. - Docker — python:3.12-slim , single container, runs anywhere. Two things I'd call out: 1. Graceful degradation. If there's no API key or the LLM call fails, it doesn't 500 — it falls back to a keyword-based scorer that intersects job skills with resume skills and returns a real score. The app is always usable. 2. Scraping is the hard part, not the AI. Every job board renders differently, and half of them are JS-heavy. The heuristic parser works on plain HTML postings but site-specific parsers (LinkedIn, Indeed) are the obvious next step. Next up: semantic matching with embeddings instead of keyword overlap, batch mode for multiple postings at once, and swapping temp-file handling for in-memory PDF parsing. Happy to answer anything about the scraping heuristics or the fallback design. I mostly build AI agents and automation for businesses — chatbots, workflow automation, the boring repetitive stuff that shouldn't be manual. If you're working on something similar, DMs are open. Portfolio: https://danish614.github.io/danish-portfolio/

4
h@hafizdanishalimuhammadilyas

Shipped: E-Commerce Price Tracker watches Amazon & Daraz, emails you when the price drops

Ever kept refreshing a product page waiting for a sale? I automated that. Paste any Amazon / Daraz product URL + your target price, and it scrapes the live price, stores the history, re-checks every few hours, and emails you the moment it hits your target. What it does - 🔎 Live price scraping (works behind bot protection) - 📉 Full price history per product - ⏰ Auto re-check every few hours (Celery Beat) - 📧 Email alert when target price is hit - 🌐 REST API + Web UI + CLI Tech stack - Backend: Python, FastAPI, Pydantic - Background jobs: Celery + Celery Beat + Redis - DB: PostgreSQL, SQLAlchemy, Alembic migrations - Scraping: Selenium, undetected-chromedriver, BeautifulSoup, cloudscraper - Alerts: SMTP + Jinja2 templates Hardest parts - Anti-bot protection — plain requests gets blocked instantly. Ended up with undetected-chromedriver in headless mode, cloudscraper as a lighter fallback. - HTML keeps changing — Daraz especially. Built multi-selector fallback logic so one broken selector doesn't kill the whole scrape. - Parallel checks — moved from a loop to a Celery task queue so hundreds of products get checked concurrently. - Proper schema — versioned Alembic migrations, not a throwaway script. Same architecture works for competitor price monitoring, stock/availability alerts, or any "watch a site and notify me" automation. 🔗 Code: https://github.com/danish614 🌐 Portfolio: https://lnkd.in/dXE58DgU

3