Begin met verkenning, niet met bruut geweld
De slechtste scrapers crawlen blind. Ze bestoken een site, negeren crawl-delay-declaraties, doorkruisen elk pad op zoek naar data en breken zodra de structuur verandert door één enkele classnaam. De beste scrapers beginnen met het lezen van de site.
Elke website publiceert een contract op drie plaatsen: robots.txt (crawlbeleid), de sitemaps (wat de site zelf de moeite van het indexeren waard acht) en de linkgraaf (hoe pagina’s daadwerkelijk met elkaar verbonden zijn). Dit eerst lezen beantwoordt drie vragen voordat u ook maar één regel scrapingcode schrijft:
- Is deze site scrapebaar? Wat staat robots.txt toe, en in welk tempo?
- Waar staat de data? Wat brengen de sitemaps naar boven?
- Hoe is de site gestructureerd? Hoe ziet de linktopologie eruit?
Dat is wat sitemapper doet.
Passieve ontdekking: robots.txt + sitemaps
discover() haalt robots.txt op en elke sitemap die het kan vinden — inclusief
Sitemap:-directives, sitemap-indexen die naar sub-sitemaps verwijzen en met
gzip gecomprimeerde bestanden — zonder ook maar één HTML-pagina te crawlen:
from sitemapper import discover
info = discover("https://www.python.org")
print(info.summary())
# Base URL: https://www.python.org
# Blocked: False
# Sitemaps found: 1
# URLs in sitemaps: 342
# Crawl-delay: None
# Sitemap directives in robots.txt: 1
# What pace does the site ask for?
if info.robots.crawl_delay:
print(f"Wait {info.robots.crawl_delay}s between requests")
# May I fetch this path?
info.robots.is_allowed("/api/users") # True / False
info.robots.is_allowed("/admin", user_agent="MyBot/1.0")
# Every deduplicated URL the site's own sitemaps declare
for url in info.urls:
print(url.loc, url.lastmod, url.changefreq, url.priority)
Het detail per agent is aanwezig wanneer u het nodig hebt: info.robots.groups
bevat elk User-agent-blok met zijn allows, disallows en crawl_delay, in
documentvolgorde. Als een site helemaal geen robots.txt heeft, geeft
is_allowed() voor alles True terug — de afwezigheid van een beleid is zelf
het beleid.
De opbrengst van sitemap-gedreven scrapen: in plaats van URL’s te ontdekken door te crawlen (traag, luidruchtig, onvolledig), vertrekt u vanuit de eigen lijst van de beheerders. U scrapet wat de site belangrijk verklaart, in het tempo dat zij aanvaardbaar acht, in een fractie van de verzoeken.
Actieve ontdekking: de linkgraaf
Sommige sites publiceren geen sitemap. Voor die sites voert crawl() een
begrensde breedte-eerst-crawl uit vanaf de basis-URL en geeft het een
LinkGraph terug van interne pagina’s en uitgaande links:
from sitemapper import crawl
graph = crawl("https://example.com", max_pages=50, max_depth=2)
print(graph.summary())
# Pages crawled (internal): 50
# External URLs seen: 87
# Top external domains: ...
Dit vertelt u de werkelijke topologie — welke pagina’s naar wat verwijzen — zodat u kunt beslissen of de site überhaupt een gestructureerde scraper rechtvaardigt. Ontdekking en crawling zijn bewust afzonderlijke aanroepen: de passieve stap haalt nooit HTML op, zodat u altijd beleefd kunt verkennen voordat u besluit te crawlen.
Gebouwd op hetzelfde veerkrachtige transport
Siteverkenning is zinloos als de verkenning zelf door bot-muren wordt geblokkeerd.
Al het HTTP-verkeer van sitemapper loopt via
unblock_requests — het
TLS-impersonerende transport uit onze
post over anti-bot-transport —
zodat robots.txt en sitemaps ook op door Cloudflare afgeschermde sites
terugkomen. Een FlareSolverr-instantie of een terugval op de Wayback Machine kan
worden ingeschakeld met omgevingsvariabelen (SITEMAPPER_FLARESOLVERR_URL,
SITEMAPPER_WAYBACK_FALLBACK=1) of via de Sitemapper-klasse.
Waarom dit belangrijk is
Crawl-delay: een site die Crawl-delay: 2 declareert, vertelt u hoe snel ze
benaderd wil worden. Negeer het en u wordt geblokkeerd — of u degradeert de site
voor iedereen. Respecteer het en uw scraper speelt eerlijk.
Sitemaps boven crawlen: een sitemap somt op wat de site geïndexeerd wil zien. Blind links crawlen kan vijf keer zoveel URL’s aanraken om dezelfde inhoud te vinden. Begin bij de sitemap wanneer die er is; het is sneller voor u en lichter voor de server.
Bereik vóór code: sommige sites verbieden scrapen ronduit in robots.txt;
andere hebben sitemaps die al alles bevatten wat u nodig hebt. Tien seconden
discover() vertellen u in welke situatie u zich bevindt voordat u in een
parser investeert.
Het gereedschap
pip install sitemapper
pip install sitemapper[stealth] # adds curl_cffi TLS impersonation
Gebruik het als bibliotheek, of vanaf de commandoregel — --json FILE schrijft de
volledige ontdekking naar een bestand voor andere tools om te gebruiken, --crawl voegt
de linkgraaf-stap toe:
python -m sitemapper https://example.com
python -m sitemapper https://example.com --crawl --max-pages 50 --json out.json
Het is vrije software en draait op uw eigen hardware. Begin elke scraper met verkenning.