Webcrawler voor WBSO - Google Search Scraper
Een eenvoudige Google search scraper gebouwd in Python om zoekresultaten te verzamelen voor WBSO-gerelateerd onderzoek.
- Eenvoudige Google zoekopdrachten: Verzamel zoekresultaten voor elke query
- Aanpasbare resultaten: Stel het aantal gewenste resultaten in
- Rate limiting: Instelbaar maximum aantal requests per minuut
- Exponentiële backoff + jitter: Automatische vertraging bij CAPTCHA- en netwerkfouten, met random jitter om detectie te bemoeilijken
- Metrics/logging: Activiteit en CAPTCHA-detectie worden gelogd
De GoogleScraper ondersteunt:
max_requests_per_minute: maximaal aantal requests per minuut (rolling window)max_backoff_seconds: maximale backoff-tijd bij retriesbackoff_jitter: maximale random jitter (in seconden) toegevoegd aan backoff
Deze parameters zijn instelbaar via de Python constructor of via een eigen wrapper.
Alle scraping-activiteit, rate limiting, CAPTCHA-detectie en parsingfouten worden gelogd via Python logging. Pas het logniveau aan voor meer of minder detail:
import logging
logging.basicConfig(level=logging.INFO)- Gestructureerde output: Krijg titel, link en snippet voor elk resultaat
- Foutafhandeling: Robuuste error handling voor netwerk- en parsing-problemen
- Clone deze repository:
git clone https://github.com/Rul1an/Gsearch.git
cd Gsearch- Installeer de vereiste dependencies (alleen pure-Python pakketten, dus geen native build stap nodig):
pip install -r requirements.txt- Start de API lokaal met Uvicorn:
uvicorn app:app --reload --host 0.0.0.0 --port 8000De interactieve documentatie is beschikbaar op http://localhost:8000/docs.
from gsearch import GoogleScraper
# Initialiseer de scraper
scraper = GoogleScraper(delay=1.0)
# Voer een zoekopdracht uit
results = scraper.search("WBSO subsidie Nederland", num_results=10)
# Print de resultaten
for result in results:
print(f"Titel: {result['title']}")
print(f"Link: {result['link']}")
print(f"Snippet: {result['snippet']}")
print("-" * 40)scraper = GoogleScraper()
scraper.search_and_print("WBSO voorwaarden", num_results=5)python3 example.pyVraag resultaten op via de FastAPI-endpoints. Bijvoorbeeld:
curl "http://localhost:8000/search?query=WBSO%20subsidie&num_results=5"Dit retourneert een JSON-payload met dezelfde structuur als de Python-interface.
Een eenvoudige healthcheck is beschikbaar via:
curl http://localhost:8000/healthDe FastAPI-service kan worden geconfigureerd zonder codewijzigingen:
GSEARCH_DELAY: basisvertraging (in seconden) tussen requests en als startpunt voor backoff. Standaard1.0.GSEARCH_PROXIES: kommagescheiden lijst met proxy-URL's (bijv.http://p1:8080,http://p2:8080).GSEARCH_USER_AGENTS: kommagescheiden lijst met user-agent strings die afwisselend worden gebruikt.GSEARCH_MAX_REQUESTS_PER_MINUTE: maximaal aantal requests per rollend minuutvenster (bijv.30).GSEARCH_MAX_BACKOFF_SECONDS: bovengrens voor backoff-slaap (bijv.20).GSEARCH_BACKOFF_JITTER: maximale jitter (in seconden) die aan backoff wordt toegevoegd (bijv.0.75).GSEARCH_LOG_LEVEL: logniveau voor de scraper en API (DEBUG,INFO,WARNING, ...). StandaardINFO.
Voorbeeld bij gebruik van Render of Docker:
export GSEARCH_DELAY=2.5
export GSEARCH_PROXIES="http://proxy1:8080,http://proxy2:8080"
export GSEARCH_USER_AGENTS="agent1,agent2,agent3"
export GSEARCH_MAX_REQUESTS_PER_MINUTE=30
export GSEARCH_MAX_BACKOFF_SECONDS=20
export GSEARCH_BACKOFF_JITTER=0.75
export GSEARCH_LOG_LEVEL=INFO
uvicorn app:app --reloadInitialiseer de Google scraper.
Parameters:
delay: Vertraging tussen requests in seconden (standaard: 1.0)
Voer een Google zoekopdracht uit.
Parameters:
query: De zoektermnum_results: Aantal gewenste resultaten (standaard: 10)
Returns:
- Lijst van dictionaries met keys: 'title', 'link', 'snippet'
Voer een zoekopdracht uit en print geformatteerde resultaten.
# WBSO-specifieke zoekopdrachten
scraper = GoogleScraper()
# Zoek naar WBSO subsidie informatie
wbso_results = scraper.search("WBSO subsidie aanvragen RVO", 5)
# Zoek naar WBSO voorwaarden
voorwaarden = scraper.search("WBSO voorwaarden 2024", 3)
# Zoek naar WBSO rapportage
rapportage = scraper.search("WBSO rapportage verplichtingen", 3)- Respectvol scrapen: De scraper heeft een ingebouwde vertraging tussen requests
- User-Agent: Gebruikt een browser user-agent om detectie te vermijden
- Rate limiting: Pas de delay aan op basis van je gebruik
- Robots.txt: Respecteer altijd de robots.txt van websites
- Legaal gebruik: Gebruik alleen voor legale doeleinden en onderzoek
pytest -qMaak een nieuwe Web Service aan en gebruik de volgende commando's:
-
Build Command
pip install -r requirements.txt
-
Start Command
gunicorn app:app -k uvicorn.workers.UvicornWorker --bind 0.0.0.0:${PORT}
Render injecteert automatisch de PORT-omgeving variabele. Zorg ervoor dat je service als runtime "Python 3" gebruikt.
Gsearch/
├── README.md # Deze documentatie
├── requirements.txt # Python dependencies
├── gsearch.py # Hoofd scraper module
├── example.py # Voorbeelden van gebruik
└── test_gsearch.py # Unit tests
requests- Voor HTTP requestsbeautifulsoup4- Voor HTML parsing
Dit project is ontwikkeld voor WBSO webcrawling doeleinden.