@crawlee/linkedom

A web scraping and browser automation library
Crawlee covers your crawling and scraping end-to-end and helps you build reliable scrapers. Fast.
Your crawlers will appear human-like and fly under the radar of modern bot protections even with the default configuration. Crawlee gives you the tools to crawl the web for links, scrape data, and store it to disk or cloud while staying configurable to suit your project's needs.
Crawlee is available as the crawlee NPM package.
👉 View full documentation, guides and examples on the Crawlee project website 👈
Do you prefer 🐍 Python instead of JavaScript? 👉 Checkout Crawlee for Python 👈.
Installation
We recommend visiting the Introduction tutorial in Crawlee documentation for more information.
Crawlee requires Node.js 16 or higher.
With Crawlee CLI
The fastest way to try Crawlee out is to use the Crawlee CLI and choose the Getting started example. The CLI will install all the necessary dependencies and add boilerplate code for you to play with.
npx crawlee create my-crawler
cd my-crawler
npm start
Manual installation
If you prefer adding Crawlee into your own project, try the example below. Because it uses PlaywrightCrawler we also need to install Playwright. It's not bundled with Crawlee to reduce install size.
npm install crawlee playwright
import { PlaywrightCrawler, Dataset } from 'crawlee';
// PlaywrightCrawler crawls the web using a headless
// browser controlled by the Playwright library.
const crawler = new PlaywrightCrawler({
// Use the requestHandler to process each of the crawled pages.
async requestHandler({ request, page, enqueueLinks, log }) {
const title = await page.title();
log.info(`Title of ${request.loadedUrl} is '${title}'`);
// Save results as JSON to ./storage/datasets/default
await Dataset.pushData({ title, url: request.loadedUrl });
// Extract links from the current page
// and add them to the crawling queue.
await enqueueLinks();
},
// Uncomment this option to see the browser window.
// headless: false,
});
// Add first URL to the queue and start the crawl.
await crawler.run(['https://crawlee.dev']);
By default, Crawlee stores data to ./storage in the current working directory. You can override this directory via Crawlee configuration. For details, see Configuration guide, Request storage and Result storage.
Installing pre-release versions
We provide automated beta builds for every merged code change in Crawlee. You can find them in the npm list of releases. If you want to test new features or bug fixes before we release them, feel free to install a beta build like this:
npm install crawlee@next
If you also use the Apify SDK, you need to specify dependency overrides in your package.json file so that you don't end up with multiple versions of Crawlee installed:
{
"overrides": {
"apify": {
"@crawlee/core": "$crawlee",
"@crawlee/types": "$crawlee",
"@crawlee/utils": "$crawlee"
}
}
}
🛠 Features
- Single interface for HTTP and headless browser crawling
- Persistent queue for URLs to crawl (breadth & depth first)
- Pluggable storage of both tabular data and files
- Automatic scaling with available system resources
- Integrated proxy rotation and session management
- Lifecycles customizable with hooks
- CLI to bootstrap your projects
- Configurable routing, error handling and retries
- Dockerfiles ready to deploy
- Written in TypeScript with generics
👾 HTTP crawling
- Zero config HTTP2 support, even for proxies
- Automatic generation of browser-like headers
- Replication of browser TLS fingerprints
- Integrated fast HTML parsers. Cheerio and JSDOM
- Yes, you can scrape JSON APIs as well
💻 Real browser crawling
- JavaScript rendering and screenshots
- Headless and headful support
- Zero-config generation of human-like fingerprints
- Automatic browser management
- Use Playwright and Puppeteer with the same interface
- Chrome, Firefox, Webkit and many others
Usage on the Apify platform
Crawlee is open-source and runs anywhere, but since it's developed by Apify, it's easy to set up on the Apify platform and run in the cloud. Visit the Apify SDK website to learn more about deploying Crawlee to the Apify platform.
Support
If you find any bug or issue with Crawlee, please submit an issue on GitHub. For questions, you can ask on Stack Overflow, in GitHub Discussions or you can join our Discord server.
Contributing
Your code contributions are welcome, and you'll be praised to eternity! If you have any ideas for improvements, either submit an issue or create a pull request. For contribution guidelines and the code of conduct, see CONTRIBUTING.md.
License
This project is licensed under the Apache License 2.0 - see the LICENSE.md file for details.
Index
Crawlers
Other
- AddRequestsBatchedOptions
- AddRequestsBatchedResult
- AutoscaledPool
- AutoscaledPoolOptions
- BaseHttpClient
- BaseHttpResponseData
- BASIC_CRAWLER_TIMEOUT_BUFFER_SECS
- BasicCrawler
- BasicCrawlerOptions
- BasicCrawlingContext
- BLOCKED_STATUS_CODES
- ByteCounterStream
- checkStorageAccess
- Cheerio
- CheerioAPI
- CheerioRoot
- ClientInfo
- ClientLoadSignalOptions
- ClientSnapshot
- Configuration
- ConfigurationOptions
- Cookie
- CpuLoadSignalOptions
- CpuSnapshot
- CrawlerAddRequestsOptions
- CrawlerAddRequestsResult
- CrawlerExperiments
- CrawlerRunOptions
- CrawlingContext
- createBasicRouter
- createClientLoadSignal
- CreateContextOptions
- createCpuLoadSignal
- createEventLoopLoadSignal
- createFileRouter
- createHttpRouter
- CreateSession
- CriticalError
- Dataset
- DatasetConsumer
- DatasetContent
- DatasetDataOptions
- DatasetExportOptions
- DatasetExportToOptions
- DatasetIteratorOptions
- DatasetMapper
- DatasetOptions
- DatasetReducer
- Element
- enqueueLinks
- EnqueueLinksOptions
- EnqueueStrategy
- ErrnoException
- ErrorHandler
- ErrorSnapshotter
- ErrorTracker
- ErrorTrackerOptions
- evaluateLoadSignalSample
- EventLoopLoadSignalOptions
- EventLoopSnapshot
- EventManager
- EventType
- EventTypeName
- FileDownload
- FileDownloadCrawlingContext
- FileDownloadErrorHandler
- FileDownloadHook
- FileDownloadOptions
- FileDownloadRequestHandler
- filterRequestsByPatterns
- FinalStatistics
- GetUserDataFromRequest
- GlobInput
- GlobObject
- GotScrapingHttpClient
- HttpCrawler
- HttpCrawlerOptions
- HttpCrawlingContext
- HttpErrorHandler
- HttpHook
- HttpRequest
- HttpRequestHandler
- HttpRequestOptions
- HttpResponse
- IRequestList
- IRequestManager
- IStorage
- KeyConsumer
- KeyValueStore
- KeyValueStoreIteratorOptions
- KeyValueStoreOptions
- LoadedRequest
- LoadSignal
- LoadSnapshot
- LocalEventManager
- log
- Log
- Logger
- LoggerJson
- LoggerOptions
- LoggerText
- LogLevel
- MAX_POOL_SIZE
- MemoryLoadSignal
- MemoryLoadSignalOptions
- MemorySnapshot
- MinimumSpeedStream
- NonRetryableError
- PERSIST_STATE_KEY
- PersistenceOptions
- processHttpRequestOptions
- ProxyConfiguration
- ProxyConfigurationFunction
- ProxyConfigurationOptions
- ProxyInfo
- PseudoUrl
- PseudoUrlInput
- PseudoUrlObject
- purgeDefaultStorages
- PushErrorMessageOptions
- QueueOperationInfo
- RecordOptions
- RecoverableState
- RecoverableStateOptions
- RecoverableStatePersistenceOptions
- RedirectHandler
- RegExpInput
- RegExpObject
- Request
- RequestHandler
- RequestHandlerResult
- RequestList
- RequestListOptions
- RequestListSourcesFunction
- RequestListState
- RequestManagerTandem
- RequestOptions
- RequestProvider
- RequestProviderOptions
- RequestQueue
- RequestQueueOperationOptions
- RequestQueueOptions
- RequestQueueV1
- RequestQueueV2
- RequestsLike
- RequestState
- RequestTransform
- ResponseLike
- ResponseTypes
- RestrictedCrawlingContext
- RetryRequestError
- Router
- RouterHandler
- RouterRoutes
- Session
- SessionError
- SessionOptions
- SessionPool
- SessionPoolOptions
- SessionState
- SitemapRequestList
- SitemapRequestListOptions
- SkippedRequestCallback
- SkippedRequestReason
- SnapshotResult
- SnapshotStore
- Snapshotter
- SnapshotterOptions
- Source
- StatisticPersistedState
- Statistics
- StatisticsOptions
- StatisticState
- StatusMessageCallback
- StatusMessageCallbackParams
- StorageClient
- StorageManagerOptions
- StreamHandlerContext
- StreamingHttpResponse
- SystemInfo
- SystemStatus
- SystemStatusOptions
- TieredProxy
- tryAbsoluteURL
- UrlPatternObject
- useState
- UseStateOptions
- withCheckedStorageAccess
- LinkeDOMCrawlerEnqueueLinksOptions
- LinkeDOMCrawlerOptions
- LinkeDOMCrawlingContext
- LinkeDOMErrorHandler
- LinkeDOMHook
- LinkeDOMRequestHandler
- createLinkeDOMRouter
Other
AddRequestsBatchedOptions
AddRequestsBatchedResult
AutoscaledPool
AutoscaledPoolOptions
BaseHttpClient
BaseHttpResponseData
BASIC_CRAWLER_TIMEOUT_BUFFER_SECS
BasicCrawler
BasicCrawlerOptions
BasicCrawlingContext
BLOCKED_STATUS_CODES
ByteCounterStream
checkStorageAccess
Cheerio
CheerioAPI
CheerioRoot
ClientInfo
ClientLoadSignalOptions
ClientSnapshot
Configuration
ConfigurationOptions
Cookie
CpuLoadSignalOptions
CpuSnapshot
CrawlerAddRequestsOptions
CrawlerAddRequestsResult
CrawlerExperiments
CrawlerRunOptions
CrawlingContext
createBasicRouter
createClientLoadSignal
CreateContextOptions
createCpuLoadSignal
createEventLoopLoadSignal
createFileRouter
createHttpRouter
CreateSession
CriticalError
Dataset
DatasetConsumer
DatasetContent
DatasetDataOptions
DatasetExportOptions
DatasetExportToOptions
DatasetIteratorOptions
DatasetMapper
DatasetOptions
DatasetReducer
Element
enqueueLinks
EnqueueLinksOptions
EnqueueStrategy
ErrnoException
ErrorHandler
ErrorSnapshotter
ErrorTracker
ErrorTrackerOptions
evaluateLoadSignalSample
EventLoopLoadSignalOptions
EventLoopSnapshot
EventManager
EventType
EventTypeName
FileDownload
FileDownloadCrawlingContext
FileDownloadErrorHandler
FileDownloadHook
FileDownloadOptions
FileDownloadRequestHandler
filterRequestsByPatterns
FinalStatistics
GetUserDataFromRequest
GlobInput
GlobObject
GotScrapingHttpClient
HttpCrawler
HttpCrawlerOptions
HttpCrawlingContext
HttpErrorHandler
HttpHook
HttpRequest
HttpRequestHandler
HttpRequestOptions
HttpResponse
IRequestList
IRequestManager
IStorage
KeyConsumer
KeyValueStore
KeyValueStoreIteratorOptions
KeyValueStoreOptions
LoadedRequest
LoadSignal
LoadSnapshot
LocalEventManager
log
Log
Logger
LoggerJson
LoggerOptions
LoggerText
LogLevel
MAX_POOL_SIZE
MemoryLoadSignal
MemoryLoadSignalOptions
MemorySnapshot
MinimumSpeedStream
NonRetryableError
PERSIST_STATE_KEY
PersistenceOptions
processHttpRequestOptions
ProxyConfiguration
ProxyConfigurationFunction
ProxyConfigurationOptions
ProxyInfo
PseudoUrl
PseudoUrlInput
PseudoUrlObject
purgeDefaultStorages
PushErrorMessageOptions
QueueOperationInfo
RecordOptions
RecoverableState
RecoverableStateOptions
RecoverableStatePersistenceOptions
RedirectHandler
RegExpInput
RegExpObject
Request
RequestHandler
RequestHandlerResult
RequestList
RequestListOptions
RequestListSourcesFunction
RequestListState
RequestManagerTandem
RequestOptions
RequestProvider
RequestProviderOptions
RequestQueue
RequestQueueOperationOptions
RequestQueueOptions
RequestQueueV1
RequestQueueV2
RequestsLike
RequestState
RequestTransform
ResponseLike
ResponseTypes
RestrictedCrawlingContext
RetryRequestError
Router
RouterHandler
RouterRoutes
Session
SessionError
SessionOptions
SessionPool
SessionPoolOptions
SessionState
SitemapRequestList
SitemapRequestListOptions
SkippedRequestCallback
SkippedRequestReason
SnapshotResult
SnapshotStore
Snapshotter
SnapshotterOptions
Source
StatisticPersistedState
Statistics
StatisticsOptions
StatisticState
StatusMessageCallback
StatusMessageCallbackParams
StorageClient
StorageManagerOptions
StreamHandlerContext
StreamingHttpResponse
SystemInfo
SystemStatus
SystemStatusOptions
TieredProxy
tryAbsoluteURL
UrlPatternObject
useState
UseStateOptions
withCheckedStorageAccess
LinkeDOMErrorHandler
Type parameters
- UserData: Dictionary = any
- JSONData: Dictionary = any
LinkeDOMHook
Type parameters
- UserData: Dictionary = any
- JSONData: Dictionary = any
LinkeDOMRequestHandler
Type parameters
- UserData: Dictionary = any
- JSONData: Dictionary = any