Web Scraping Projects With Code
Good web scraping projects use public data you actually care about and grow in difficulty: a practice sandbox or a Wikipedia table first, then a price tracker, a job-listing aggregator or a review monitor, and at the advanced end a multi-site crawler with scheduling, JavaScript pages and rotating proxies. Below are 15 project ideas by level, each with the skills it teaches and the tools it needs, plus a starter script and how to publish your project on GitHub. When a project outgrows your home IP, ProxyField residential proxies cost from $1.95/GB with no subscription; start with the Easy Trial: 1 GB for $2.95.
- residential IPs
- 412M+
- from, traffic never expires
- $1.95/GB
- Easy Trial
- 1 GB for $2.95
On this page 7 sections
How to pick a web scraping project
A project teaches you most when the data is public, the site is stable and you will use the result. Four questions narrow the list:
-
Is the data public and allowed?
No logins you are not entitled to, no personal data you have no reason to keep; check
robots.txtand the terms (is web scraping legal). -
Does the site offer an API or a download?
Many open-data sites, and GitHub, publish an API. Use it when it has what you need; scrape what it does not cover.
-
Is the HTML static or built by JavaScript?
Start with static pages; dynamic ones are a project level of their own.
-
How often does the data change?
A daily price is a scheduled job; a one-off dataset is a single run.
15 web scraping project ideas by level
| # | Project | Level | What you learn | Tools | Proxies? |
|---|---|---|---|---|---|
| 1 | Countries or teams from a practice sandbox into CSV | Beginner | Selectors, cleaning text into numbers, CSV | Requests, Beautiful Soup | No |
| 2 | A Wikipedia table into a spreadsheet | Beginner | HTML tables, pandas.read_html | pandas | No |
| 3 | A news site's headlines into a daily file | Beginner | Lists, links, dates, deduplication | Requests, Beautiful Soup | No |
| 4 | An RSS or sitemap reader | Beginner | XML parsing, finding pages without crawling | xml.etree, Requests | No |
| 5 | Your own site's broken links and missing alt text | Beginner | Crawling one domain, status codes | Requests, Beautiful Soup | No |
| 6 | Price tracker with an email alert | Intermediate | Scheduling, storing history, comparing runs | Requests, SQLite, cron | Often, once you track many products |
| 7 | Job-listing aggregator across 3 boards | Intermediate | Several layouts, one schema, deduplication | Scrapy | Yes at volume |
| 8 | Review monitor with sentiment scores | Intermediate | Pagination, text cleaning, simple NLP | Requests, a sentiment library | Sometimes |
| 9 | Search ranking checker by city | Intermediate | Location-dependent pages, geo-targeted IPs | Requests or the Google SERP API (Contact sales) | Yes, by city |
| 10 | Real-estate or rental listing tracker | Intermediate | Detail pages, images, maps of fields | Scrapy or Playwright | Yes at volume |
| 11 | Infinite-scroll catalog | Advanced | Hidden JSON APIs, headless browsers | Playwright | Often |
| 12 | Multi-site crawler with a URL frontier | Advanced | Queues, politeness, dedupe, storage | Scrapy or your own crawler | Yes |
| 13 | Price comparison across 5 countries | Advanced | Geo-targeted IPs, currency and format cleaning | Requests, proxies by country | Yes, by country |
| 14 | A scheduled pipeline into a database and dashboard | Advanced | Orchestration, retries, monitoring | Airflow or cron, Postgres | Depends on the sites |
| 15 | A text dataset for a machine-learning model | Advanced | Scale, cleaning, licensing questions | Scrapy, Crawlee | Yes |
How-tos for the harder parts: how to build a web crawler (project 12), scraping dynamic content (project 11), scheduling and deploying scrapers (projects 6 and 14), and web scraping for AI training (project 15).
Beginner projects
Start on pages built for practice or published as open data. The practice sandbox at scrapethissite.com has a single-page list of 250 countries and a paginated table of hockey teams; its robots.txt blocks only its lesson and FAQ pages. Wikipedia tables load straight into pandas, and project 5 on your own site teaches crawling with no permission question at all. The step-by-step script for project 1 is in how to build a web scraper.
Intermediate projects
These run more than once, so they need storage and a schedule. A price tracker is the classic one: scrape the price, compare with yesterday's, alert on a drop. The starter code below is that project's core. Projects 9 and 13 add location: the same page shows different results or prices by country or city, so the scraper needs an IP in each place.
Advanced projects
Advanced projects combine the hard parts: JavaScript pages, many sites, scale and reliability. Expect to spend more time on queues, retries and monitoring than on selectors, and decide early whether you will run browsers, call hidden APIs, or use a scraping API such as the ProxyField Web Scraping API for the pages that need rendering.
Starter code: a price tracker
The core of project 6: fetch a product page, read the price, store it with a timestamp, and report a drop. Replace the URL and the selector with a page and element you are allowed to scrape (find the selector with right-click, Inspect).
# pip install requests beautifulsoup4
import datetime, re, sqlite3
import requests
from bs4 import BeautifulSoup
URL = "https://example.com/product/123"
SELECTOR = "span.price" # from DevTools
PROXY = None # e.g. "http://<login>-country-us-city-new_york:<password>@gate.proxyfield.io:7000"
db = sqlite3.connect("prices.db")
db.execute("CREATE TABLE IF NOT EXISTS prices (url TEXT, price REAL, seen_at TEXT)")
r = requests.get(URL, headers={"User-Agent": "Mozilla/5.0"}, timeout=30,
proxies={"http": PROXY, "https": PROXY} if PROXY else None)
r.raise_for_status()
text = BeautifulSoup(r.text, "html.parser").select_one(SELECTOR).get_text()
price = float(re.sub(r"[^\d.]", "", text))
last = db.execute("SELECT price FROM prices WHERE url=? ORDER BY seen_at DESC LIMIT 1", (URL,)).fetchone()
db.execute("INSERT INTO prices VALUES (?, ?, ?)", (URL, price, datetime.datetime.now().isoformat()))
db.commit()
if last and price < last[0]:
print(f"Price drop: {last[0]} -> {price}")Run it once a day with cron or a scheduled GitHub Actions workflow (how to schedule web scrapers), and swap print for an email or chat message. Prices written as 1.299,00 need a locale-aware parser.
Web scraping projects on GitHub
GitHub is the largest library of open scrapers. To find good ones, browse the web-scraping topic and the scraper and crawler topics, then filter by language and sort by recently updated. Before you reuse a repository, check four things:
- License. No license file means no permission to reuse the code. MIT, BSD and Apache-2.0 allow reuse with attribution.
- Last commit. Scrapers break when sites change. A target-specific scraper untouched for a year probably no longer works.
- Issues. Open issues titled "not working" or "blocked" tell you more than the star count.
- Secrets. Never run code that asks for your passwords or tokens in a way you cannot read.
When you publish your own project:
- Write a README with what it scrapes, how to run it and an example of the output.
- Keep credentials out of the repository: read the proxy URL and any tokens from environment variables, and list
.envin.gitignore. If a key was ever committed, revoke it; deleting the file does not remove it from the history. - Pin your dependencies (
requirements.txtwith versions, orpyproject.toml). - Add a small test that parses a saved copy of the page, so you can tell a layout change from a bug.
import os
PROXY = os.environ.get("PROXY_URL") # set it in your shell or in your CI's secret settingsScraping GitHub itself: use the API
For repositories, issues, stars and users, GitHub's REST and GraphQL APIs return clean JSON and are the documented way in. Per GitHub's REST API rate limits, unauthenticated requests are limited to 60 per hour and requests with a personal access token to 5,000 per hour. Creating a token takes a minute and multiplies what a project can fetch, so use one. Scrape GitHub's HTML only for what the API does not return, at a gentle pace, and read GitHub's Acceptable Use Policies first.
When a project needs proxies
Most beginner projects never do. A project needs proxies when:
- it fetches thousands of pages a day from one site, and the site starts answering with 429 or 403;
- it needs the page as seen from another country or city (projects 9 and 13);
- it runs from a cloud server whose IP range the target site already treats with suspicion.
For a project, the cost is the traffic: plain HTML pages are small, while browser rendering and images use much more per page. ProxyField residential proxies cost $2.95/GB for 1-9 GB down to $1.95/GB from 1,000 GB, the traffic never expires, and you can buy just 1 GB to start; see proxies for web scraping for sizing a job. The gateway is gate.proxyfield.io:7000; <login>-country-us-city-new_york asks for an exit IP in New York. Region, session and session time go in the same username: -region-<region>, -session-<id> and -ttl-<seconds> (30 to 129,600 seconds, 20 minutes by default), as in <login>-country-us-region-new_york-city-new_york-session-he9f2qga-ttl-600; every part after the login is optional.
A project that needs other IPs? ProxyField residential proxies: 412M+ residential IPs in 195+ countries with country, region and city targeting. Pay per GB, no subscription; start with the Easy Trial (1 GB). Traffic never expires, and all purchases are final.
Web Scraping Projects With Code FAQ
What are good web scraping projects for beginners?
ProxyField residential proxies cost from $1.95/GB with no subscription, but none of these 5 web scraping projects for beginners needs them: a practice sandbox into CSV, a Wikipedia table into a spreadsheet, a daily headlines file, an RSS or sitemap reader, and a broken-link check of your own site. Add proxies once a project fetches thousands of pages a day from one site.
What are some web scraping project ideas?
A price tracker with alerts, a job-listing aggregator, a review monitor with sentiment scores, a search ranking checker by city, a rental listing tracker, and at the advanced end a multi-site crawler or a scheduled pipeline into a dashboard. Pick one whose data you will actually use.
What is a web scraping project?
A program, usually small, that collects specific data from one or more websites and stores it in a useful form, such as a CSV file, a database or a dashboard. A good project has a clear question, public data and a defined set of pages.
Is a web scraper a good project for a portfolio?
Yes, if it does more than fetch one page: a scraper that runs on a schedule, stores history, handles errors and shows the result in a chart or alert shows real engineering. Publish it with a README, an example of the output and a test against a saved page.
What is a GitHub scraper?
Either a scraper whose code is published on GitHub, or a tool that collects data from GitHub itself, such as repositories, stars or issues. For the second, GitHub's REST and GraphQL APIs are the documented route and return JSON.
How do I find web scraping projects on GitHub?
Browse the web-scraping, scraper and crawler topics, filter by your language and sort by recently updated. Before reusing one, check its license, its last commit and its open issues, because target-specific scrapers break when sites change.
How do I scrape GitHub?
Use the GitHub REST or GraphQL API for repositories, issues, users and stars: it returns JSON and has documented rate limits. Scrape the HTML only for what the API does not return, slowly, and read GitHub's Acceptable Use Policies first.
Do I need a GitHub token to collect GitHub data?
Not for small jobs, but it helps: GitHub's REST API allows 60 requests per hour without authentication and 5,000 per hour with a personal access token. Keep the token in an environment variable, never in the repository.
Related pages
Easy Trial: 1 GB for $2.95.
Try for the price of 1 GB, no subscription, traffic never expires.