spatie/crawler
Crawl all internal links found on a website
9.4.2
20M downloads/mo
#769 most downloaded on Packagist
spatie/crawler
What this package is like to depend on
Last release 16 days ago
07 Aug 2026
Release timing varies
gaps range from 8 days to 5 months
Nearly every release is documented
notes for 119 of 129 stable releases
Nothing withdrawn
no release was ever pulled
11 years old
129 releases · first in 2015
16 releases in the last 12 months
see the full history below
Release timeline
129 releases · Nov 2015 to Aug 2026Releases
latest 60 of 129-
9.4.207 Aug 2026Release notes
Open source →What's Changed
- Fix SitemapUrlParser extracting no URLs from namespaced sitemaps by @witheez in https://github.com/spatie/crawler/pull/512
New Contributors
- @witheez made their first contribution in https://github.com/spatie/crawler/pull/512
Full Changelog: https://github.com/spatie/crawler/compare/9.4.1...9.4.2
-
9.4.122 Jul 2026Release notes
Open source →What's Changed
- Fix Guzzle 8 exception handling for responses and retries by @GrahamCampbell in #510
New Contributors
- @GrahamCampbell made their first contribution in #510
Full Changelog: 9.4.0...9.4.1
Release notes
Open source →What's Changed
- Fix Guzzle 8 exception handling for responses and retries by @GrahamCampbell in https://github.com/spatie/crawler/pull/510
New Contributors
- @GrahamCampbell made their first contribution in https://github.com/spatie/crawler/pull/510
Full Changelog: https://github.com/spatie/crawler/compare/9.4.0...9.4.1
-
9.4.020 Jul 2026 -
9.3.212 Jun 2026Release notes
Open source →What's Changed
- Skip signal handler registration when pcntl functions are disabled by @poldixd in https://github.com/spatie/crawler/pull/508
New Contributors
- @poldixd made their first contribution in https://github.com/spatie/crawler/pull/508
Full Changelog: https://github.com/spatie/crawler/compare/9.3.1...9.3.2
-
9.3.118 May 2026Release notes
Open source →What's Changed
- Skip fnmatch for URLs longer than FILENAME_MAX by @mattiasgeniar in #505
Full Changelog: 9.3.0...9.3.1
Release notes
Open source →What's Changed
- Skip fnmatch for URLs longer than FILENAME_MAX by @mattiasgeniar in https://github.com/spatie/crawler/pull/505
Full Changelog: https://github.com/spatie/crawler/compare/9.3.0...9.3.1
-
9.3.015 Apr 2026Release notes
Open source →What's Changed
- Add a shouldStopCallback hook for graceful external stops by @kissifrot in #504
Full Changelog: 9.2.1...9.3.0
Release notes
Open source →What's Changed
- Add a shouldStopCallback hook for graceful external stops by @kissifrot in https://github.com/spatie/crawler/pull/504
Full Changelog: https://github.com/spatie/crawler/compare/9.2.1...9.3.0
-
9.2.120 Mar 2026Release notes
Open source →What's Changed
- Close response body streams after processing by @freekmurze in #503
Full Changelog: 9.0.1...9.2.1
Release notes
Open source →What's Changed
- Close response body streams after processing by @freekmurze in https://github.com/spatie/crawler/pull/503
Full Changelog: https://github.com/spatie/crawler/compare/9.0.1...9.2.1
-
9.2.019 Mar 2026 -
9.1.018 Mar 2026Release notes
Open source →- Add urlParser() method to allow setting a custom URL parser
Co-Authored-By: Claude Opus 4.6 (1M context) [email protected]
- Fix styling
Co-authored-by: Claude Opus 4.6 (1M context) [email protected]
Co-authored-by: freekmurze [email protected] -
9.0.119 Mar 2026Release notes
Open source →What's fixed
When the crawler reached its time limit, crawl limit, or was interrupted via a signal, any HTTP requests that were still in-flight in the Guzzle pool would eventually fail (e.g. due to their per-request timeout) and get reported to
crawlFailed. These URLs were dispatched but never truly crawled, so reporting them as failures was misleading.The
CrawlRequestFailedhandler now checks whether the crawler has reached its limits before reporting a failure. If it has, the failure is silently ignored.Regular request failures (timeouts, connection errors, server errors) that happen during normal crawling are still reported as before.
Release notes
Open source →Fixed
- Fixed
allow_redirectsdefault: changed fromfalseto['track_redirects' => true]so redirects are followed and the redirect history header is populated correctly - Non-parseable responses (e.g. binary files filtered by
allowedMimeTypes) now notify observers viacrawled()with an empty body instead of being silently skipped - URLs containing control characters are now detected and reported as malformed
- Dot segments (
/../,/./) in extracted URLs are now normalized per RFC 3986 - Custom client options passed to
Crawler::create()now merge with defaults instead of replacing them (passnullto remove a default) CrawlRequestFailednow wraps non-RequestExceptionerrors so observers always receive aRequestException- Removed unused classes:
Url,ResponseWithCachedBody,InvalidUrl
Added
stream()method to opt-in to streaming HTTP responses for reduced memory usagematchWww()method to treatwww.example.comandexample.comas equivalent when usinginternalOnly()includeSubdomains()now works as a flag oninternalOnly()and composes withmatchWww()CrawlResponse::redirectHistory()andCrawlResponse::wasRedirected()for inspecting redirect chainsCrawlObserver::crawlFailed()now receives a?TransferStatisticsparameter for detecting timeoutsaddObserver()now accepts variadic arguments:addObserver($obs1, $obs2)CrawlRequestFailednow preserves the original request fromConnectException(retaining custom headers likeX-Started-At)
- Fixed
-
9.0.002 Mar 2026Release notes
Open source →Major rewrite. See UPGRADING.md for a full list of breaking changes.
Changed
- Replace
UriInterfacewith plainstringURLs throughout the API - Replace
ResponseInterfacewithCrawlResponsein observer callbacks CrawlProfileis now an interface instead of an abstract classCrawlObserverCollectionno longer implementsArrayAccessorIterator- Default scheme changed from
httptohttps - JavaScript rendering is now driver-based (Browsershot moved to
suggest) UrlParserinterface redesigned to returnExtractedUrl[]instead of adding to queue directlyCrawlQueue::has()now acceptsstringinstead ofCrawlUrl|UriInterfacestart()now returns aFinishReasonenum- URL is now required in
Crawler::create()
Added
CrawlResponseobject withstatus(),body(),dom(),header(),transferStats(), and moreCrawlProgresstracking withurlsCrawled,urlsFailed,urlsFound,urlsPendingFinishReasonenum:Completed,CrawlLimitReached,TimeLimitReached,Interrupted- Closure callbacks:
onCrawled(),onFailed(),onFinished(),onWillCrawl() foundUrls()to collect all URLs asCrawledUrlobjectsfake()for testing without HTTP requests- Scope helpers:
internalOnly(),includeSubdomains(),shouldCrawl() - Shorter method names:
depth(),concurrency(),delay(),limit(),userAgent() - Throttling:
FixedDelayThrottleandAdaptiveThrottle - Resource type extraction:
alsoExtract(),extractAll(),ResourceTypeenum - URL normalization in
ArrayCrawlQueue - Graceful shutdown via SIGINT/SIGTERM
alwaysCrawl()andneverCrawl()pattern overridesretry()for automatic retries on connection errors and 5xx responsesTransferStatisticswith typed timing accessorsCloudflareRendererfor JavaScript renderingJavaScriptRendererinterface for custom renderers- Request configuration:
basicAuth(),token(),withoutVerifying(),proxy(),cookies(),queryParameters(),middleware()
Removed
CrawlUrl::create()static factory (usenew CrawlUrl(...)instead)Spatie\Crawler\UrlclassResponseWithCachedBody(replaced byCrawlResponse)nicmart/treedependencyspatie/browsershotas a required dependency (moved tosuggest)setBrowsershot()andgetBrowsershot()methodsstartCrawling()method (usestart())setUrlParserClass()(useparseSitemaps()or pass aUrlParserdirectly)
- Replace
-
8.5.021 Feb 2026 -
8.4.726 Nov 2025Release notes
Open source →What's Changed
- Update nicmart/tree dependency version to ^0.10 by @robinmiau in https://github.com/spatie/crawler/pull/497
New Contributors
- @robinmiau made their first contribution in https://github.com/spatie/crawler/pull/497
Full Changelog: https://github.com/spatie/crawler/compare/8.4.6...8.4.7
-
8.4.626 Nov 2025Nothing published for this version
-
8.4.528 Oct 2025Release notes
Open source →What's Changed
- When fetching robots.txt, use the same User-Agent as defined by the user by @mattiasgeniar in https://github.com/spatie/crawler/pull/491
Full Changelog: https://github.com/spatie/crawler/compare/8.4.4...8.4.5
-
8.4.422 Oct 2025Release notes
Open source →What's Changed
- Update issue template by @AlexVanderbist in https://github.com/spatie/crawler/pull/488
- fix(CrawlUrl): Use before initialization is now impossible by @Voltra in https://github.com/spatie/crawler/pull/490
New Contributors
- @Voltra made their first contribution in https://github.com/spatie/crawler/pull/490
Full Changelog: https://github.com/spatie/crawler/compare/8.4.3...8.4.4
-
8.4.320 May 2025Release notes
Open source →What's Changed
- Do not try robots.txt when ignored by @kissifrot in https://github.com/spatie/crawler/pull/485
New Contributors
- @kissifrot made their first contribution in https://github.com/spatie/crawler/pull/485
Full Changelog: https://github.com/spatie/crawler/compare/8.4.2...8.4.3
-
8.4.224 Feb 2025Release notes
Open source →What's Changed
- set spatie/browsershot minimal version to 5.0.5 by @grafst in https://github.com/spatie/crawler/pull/484
New Contributors
- @grafst made their first contribution in https://github.com/spatie/crawler/pull/484
Full Changelog: https://github.com/spatie/crawler/compare/8.4.1...8.4.2
-
8.4.117 Feb 2025 -
8.4.016 Dec 2024Release notes
Open source →What's Changed
- Add execution time limit by @VincentLanglet in https://github.com/spatie/crawler/pull/480
New Contributors
- @VincentLanglet made their first contribution in https://github.com/spatie/crawler/pull/480
Full Changelog: https://github.com/spatie/crawler/compare/8.3.1...8.4.0
-
8.3.109 Dec 2024Release notes
Open source →What's Changed
- Upgrade spatie/browsershot to 5.0 by @hasansoyalan in https://github.com/spatie/crawler/pull/478
New Contributors
- @hasansoyalan made their first contribution in https://github.com/spatie/crawler/pull/478
Full Changelog: https://github.com/spatie/crawler/compare/8.3.0...8.3.1
-
8.3.002 Dec 2024Release notes
Open source →What's Changed
- Add support for PHP 8.4 by @pascalbaljet in https://github.com/spatie/crawler/pull/477
Full Changelog: https://github.com/spatie/crawler/compare/8.2.3...8.3.0
-
8.2.331 Jul 2024Release notes
Open source →What's Changed
- Fix setParsableMimeTypes() by @superpenguin612 in https://github.com/spatie/crawler/pull/470
Full Changelog: https://github.com/spatie/crawler/compare/8.2.2...8.2.3
-
8.2.231 Jul 2024Nothing published for this version
-
8.2.116 Jul 2024Release notes
Open source →What's Changed
- Check original URL against depth tree when visited link is a redirect by @superpenguin612 in https://github.com/spatie/crawler/pull/467
New Contributors
- @superpenguin612 made their first contribution in https://github.com/spatie/crawler/pull/467
Full Changelog: https://github.com/spatie/crawler/compare/8.2.0...8.2.1
-
8.2.015 Feb 2024Release notes
Open source →What's Changed
- Fix wording in documentation by @adamtomat in https://github.com/spatie/crawler/pull/460
- Add Laravel/Illuminate 11 Support by @Jubeki in https://github.com/spatie/crawler/pull/461
New Contributors
- @adamtomat made their first contribution in https://github.com/spatie/crawler/pull/460
- @Jubeki made their first contribution in https://github.com/spatie/crawler/pull/461
Full Changelog: https://github.com/spatie/crawler/compare/8.1.0...8.2.0
-
8.1.002 Jan 2024Release notes
Open source →What's Changed
- feat: custom link parser by @Velka-DEV in https://github.com/spatie/crawler/pull/458
New Contributors
- @Velka-DEV made their first contribution in https://github.com/spatie/crawler/pull/458
Full Changelog: https://github.com/spatie/crawler/compare/8.0.4...8.1.0
-
8.0.429 Dec 2023 -
8.0.322 Nov 2023Release notes
Open source →What's Changed
- Fix return type by @riesjart in https://github.com/spatie/crawler/pull/452
New Contributors
- @riesjart made their first contribution in https://github.com/spatie/crawler/pull/452
Full Changelog: https://github.com/spatie/crawler/compare/8.0.2...8.0.3
-
8.0.220 Nov 2023Release notes
Open source →What's Changed
- Define only needed methods in observer implementation by @buismaarten in https://github.com/spatie/crawler/pull/449
New Contributors
- @buismaarten made their first contribution in https://github.com/spatie/crawler/pull/449
Full Changelog: https://github.com/spatie/crawler/compare/8.0.1...8.0.2
-
8.0.119 Jul 2023Release notes
Open source →What's Changed
- Check if rel attribute contains nofollow by @robbinbenard in https://github.com/spatie/crawler/pull/445
New Contributors
- @robbinbenard made their first contribution in https://github.com/spatie/crawler/pull/445
Full Changelog: https://github.com/spatie/crawler/compare/8.0.0...8.0.1
-
8.0.004 Jun 2023 -
7.1.324 Jan 2023 -
7.1.230 May 2022Release notes
Open source →What's Changed
- Feat/convert phpunit tests to pest by @mansoorkhan96 in https://github.com/spatie/crawler/pull/401
- Add the ability to change the default baseUrl scheme by @arnissolle in https://github.com/spatie/crawler/pull/402
New Contributors
- @arnissolle made their first contribution in https://github.com/spatie/crawler/pull/402
Full Changelog: https://github.com/spatie/crawler/compare/7.1.1...7.1.2
-
7.1.120 Mar 2022Nothing published for this version
-
7.1.014 Jan 2022 -
7.0.515 Nov 2021Nothing published for this version
-
7.0.412 Nov 2021Nothing published for this version
-
7.0.311 Nov 2021Nothing published for this version
-
7.0.214 Sep 2021 -
7.0.101 Aug 2021 -
7.0.027 Apr 2021Release notes
Open source →- require PHP 8+
- drop support for PHP 7.x
- convert syntax to PHP 8
- no API changes have been made
-
6.0.214 Apr 2021Nothing published for this version
-
6.0.126 Feb 2021 -
6.0.002 Dec 2020 -
5.0.227 Nov 2020 -
5.0.109 Oct 2020 -
5.0.029 Sep 2020Release notes
Open source →- improve chucked reading of response
- move observer / profiles / queues to separate namespaces
- typehint all the things
- use laravel/collections instead of tightenco package
- remove support for anything below PHP 7.4
- remove all deprecated functions and classes
-
4.7.601 Dec 2020Nothing published for this version
-
4.7.513 Sep 2020 -
4.7.415 Jul 2020 -
4.7.315 Jul 2020 -
4.7.206 May 2020 -
4.7.114 Apr 2020 -
4.7.013 Apr 2020 -
4.6.911 Apr 2020 -
4.6.813 Mar 2020 -
4.6.709 Mar 2020 -
4.6.631 Jan 2020 -
4.6.523 Nov 2019