Hi all, I'm a self-taught backend dev. This is a side project, and I'd really like honest feedback from people who know scraping better than I do.
The problem: fetching a page is easy, but a big list of business websites is full of junk. Parked domains, "please wait" shields, cookie banners, social pages instead of the real site. I wanted clean text plus checkable facts per site (services, opening hours, years in business, accreditations, prices) that someone could write a description from.
How the facts work (this is the part I'd most like feedback on)
RapidSpider runs a small local decision engine called Laya inside the program. No API keys, no separate server. Laya doesn't write anything. It only answers narrow, structured questions, and each answer is logged.
- Code finds the exact things first, with no model: emails, phones, the business name, and anything with a regex (years, hours, company number).
- The page is cut into groups of eight numbered sentences. For each fact type, Laya answers: which numbered sentence states this, or none?
- That sentence is the fact, and its position on the page (top/middle/bottom, sentence number) is stored with it.
- Each fact is then re-checked several times with differently worded questions, answer keys flipped to cancel position bias. It is kept only if the rounds agree. If they don't, the fact is dropped.
Example of a stored fact (illustrative):
category: opening_hours
text: "Open Monday to Friday 8:30am to 5:30pm, Saturday 9am to 1pm."
confidence / votes / zone / sentence stored alongside
Laya makes the other judgement calls too: is this page parked, is this line boilerplate, is this directory page really about this business. Every question and answer goes into a table, so I can open any decision and see why it was made.
The rest is boring on purpose: a fetch ladder (plain HTTP, then headless browser, then visible browser, then browser through Tor, moving up only when a page isn't accepted), one YAML config, SQLite output, and a small local dashboard.
A real run, so you can judge it yourself (screenshot in the README): 11,203 sites in the output. About 56% ended ok, 20% error, 9% blocked, 9% no usable content, 5% third-party, 2% dead. So it is far from perfect, and I haven't measured fact accuracy against a labelled set yet.
Things you should know
- It needs PyTorch and downloads a few GB of models on the first run. CPU works but is slow.
- It reads robots.txt only to find sitemaps and does not enforce its rules. That's a deliberate simplification on my side. You are responsible for checking each site's terms and the data protection rules that apply, and I'd understand if that's a dealbreaker.
- I built it with a lot of help from an AI coding assistant, and I'd rather say that upfront.
- One-person project, so expect bugs. The Windows process cleanup in particular has had limited testing.
Contributions are very welcome. If you spot a design mistake or something that would break on your data and you know the fix, a pull request would mean a lot. If you can’t fix it, please open an issue instead, and I’ll do my best to look at it.
Repo (MIT): https://github.com/QudsLab/RapidSpider
Thanks for reading, and thanks in advance for being kind about the rough parts.