# Setting up the model and we're choosing the Gemini 1.5 flash 8b model, its the cheapest performant model available.
import google.generativeai as genai
=google_api_key)
genai.configure(api_key
# Create the model
= {
generation_config "temperature": 1,
"top_p": 0.95,
"top_k": 40,
"max_output_tokens": 8192,
"response_mime_type": "text/plain",
}
= genai.GenerativeModel(
model ="gemini-1.5-flash-8b",
model_name=generation_config,
generation_config )
Technology is rapidly evolving, and barriers to entry are lowering. This presents an excellent opportunity to tackle tasks that were previously too difficult, time-consuming, and expensive. Building data pipelines has become nearly free, offering enormous benefits. In the past, we could only automate numerical data, but now we can combine and shape information from various sources to create new, useful data formats for businesses and individuals.
In my opinion, companies and individuals face two main challenges (along with others):
- Many are unaware that this technology exists.
- For the small percentage who are aware, there’s uncertainty about how to build these new pipelines to deliver information to those who need it.
This blog post explores different web scraping techniques (data collection methods), how to pass data to Large Language Models (LLMs) for basic processing, and how to present the results in a useful format. The aim is to develop a good understanding of this workflow, identify potential issues, learn how to overcome them, and establish a solid approach to building these new pipelines. While not an exhaustive examination of each tool, this overview will give you an idea of the available options and what they offer.
According to experts I respect, Google’s Gemini models are considered the best LLMs for this task, so I’ll be putting them to the test. I’ll experiment with various scraping techniques, evaluate their performance, and explore how prompting techniques can be used to extract information from scraped data. As part of this process, I’ll be scraping data from my personal blog to see what insights I can gain.
Using Gemini models is incredibly cost-effective, with a generous free tier available. Check out Gemini pricing here for more details.
Google has some benefits over other LLMs, here are some key points:
- They have the largst context windows of any LLM and can take in a 2 million tokens in a single request.
- They have some of the cheapest models for there performance and industry experts say they are the best for summarising.
- They are reliable and have excellent track record for uptime.
- They can take in audio and video data and utilizes the long context window to process it.
The setup code
Tool 1 - Scrapingant
This is a API based scanning service from ScrapingAnt. You can use it to scrape websites and get the page source information. It has a free tier and a paid tier. The free tier is more than enough for testing but expensive. Its target audience is corporations but worth a look and compare to other services.
From reading the docs it says “Almost everything we provide is centered around our general Web Scraping API, which runs the cluster of hundreds Chrome browsers under the hood. With help of these browsers ScrapingAnt performs a web scraping task for you, so only the needed action to get the required data is just making the API call.”
Lets take it for a spin
scraping
# target url
= "https://alexkelly.world/" url
# import
import http.client
= http.client.HTTPSConnection("api.scrapingant.com")
conn
"GET", f"/v2/general?url={url}&x-api-key={api_key}&return_page_source=true")
conn.request(
= conn.getresponse()
res = res.read() data
lets take a peak at the data type, as you can see its a bytes object that will most likley need to be decoded for future operations
print(type(data))
<class 'bytes'>
Summarise the returned data
This is useful to get a quick overview of the blog site and understand what the site is about
Setting up the model and we’re choosing the Gemini 1.5 flash 8b model, its the cheapest performant model available.
import google.generativeai as genai
=google_api_key)
genai.configure(api_key
# Create the model
= {
generation_config "temperature": 1,
"top_p": 0.95,
"top_k": 40,
"max_output_tokens": 8192,
"response_mime_type": "text/plain",
}
= genai.GenerativeModel(
model ="gemini-1.5-flash-8b",
model_name=generation_config,
generation_config )
= """provide a summary of the blog post:
prompt
""" + data.decode("utf-8")
= model.generate_content(prompt) completion
shows the sumary of the blog posts
completion.text
"This blog post is a collection of previously published blog posts by Alex Paul Kelly, all related to AI and its applications in manufacturing and other fields. The posts cover a variety of topics, including:\n\n* **AI in Manufacturing:** Discussing the future of manufacturing and the role of AI and data analytics.\n* **Specific AI tools and techniques:** Exploring particular AI tools like FastHTML, HTMX, Cursor AI, and GPT4 vision, and examining papers on topics like TinyLLaVA and Retrieval-Augmented Generation (RAG).\n* **Data analysis and visualization:** Touching on tools like Apache Arrow and techniques like learning rate annealing for optimization in deep learning models.\n* **Ethics and regulation of AI:** Discussing the ethical and regulatory implications of AI.\n* **Practical applications and use cases:** Demonstrating how AI can be used in real-world scenarios, like building web applications, creating AI-powered industrial IoT systems, and incorporating voice assistants for daily tasks.\n\nThe collection highlights Alex Kelly's work in applying and understanding AI, covering various tools and applications from a practical perspective.\n"
Using just a prompt to get a list of links
using a prompt to get a list of links, as you can see it doesnt return the list in a nice format.
# Setting up the model and we're choosing the Gemini 1.5 flash 8b model, its the cheapest performant model available.
import google.generativeai as genai
=google_api_key)
genai.configure(api_key
# Create the model
= {
generation_config "temperature": 1,
"top_p": 0.95,
"top_k": 40,
"max_output_tokens": 8192,
"response_mime_type": "text/plain",
}
= genai.GenerativeModel(
model ="gemini-1.5-flash-8b",
model_name=generation_config,
generation_config )
# Get a number of links to documents on the site
= """give me a list of the blogs and their links in this website:
prompt
""" + data.decode("utf-8")
= model.generate_content(prompt) completion
You can see the list is not in a nice format that I can do some with with traditional programming without some further processing, I could get around this by prompting better but lets have a look at json made.
# as you can see the list is not in a nice format that i can do somewith with traditional programming, I could get around this by prompting better but lets have a look at json made
print(completion.text)
```
* FastHTML + AI: Building a Revenue-Ready Application from Scratch - ./posts/2024-11-11_FastHTML_app/fasthtml_app.html
* Robotics - ./posts/2024-10-03_robotics/robot.html
* Experimenting with FastHTML and HTMX - ./posts/2024-09-18_fast_html/fasthtml.html
* Cursor AI - The AI code editor - ./posts/2024-08-18_cursor_ai/cursor_ai.html
* Co-pilot studio initial thoughts - ./posts/2024-07-23_copilot_studio/copilot_studio.html
* Smart manufacturing expo 2024 - ./posts/2024-06-24_smart_factory_2024/smart_factory_2024.html
* Scaling Down to Scale Up: Exploring TinyLLaVA’s Multimodal Framework - ./posts/2024-04-22_tiny_llava/tiny_llava.html
* Paper reading group - Attention is All You Need - ./posts/transformers_paper/paper_explanation.html
* The rise of Apache Arrow - ./posts/apache_arrow/apache_arrow.html
* Weights and bias to keep track of training run - ./posts/WeightsAndBias/WeightsAndBias.html
* Leveraging Hugging Face for Deep Learning: A Guide to Datasets to Model Training - part 1 Eye-Tracking - ./posts/hugging_face_datasets_library/Hugging_face_datasets.html
* Eye-Tracking: quick overview of the project - ./posts/eye_tracking_start/eye_tracking.html
* Navigating the Evolving Landscape of AI Ethics and Regulation: Key Insights from a Recent Discussion with AI Tech North - ./posts/AI_ethics/index.html
* Adam optimizer with annealing learning rate - ./posts/adam_optimizer/index.html
* AI’s Evolution in Manufacturing: Shaping Jobs and the Workforce of Tomorrow. - ./posts/future_skills_in_ai/index.html
* The Power of Retrieval-Augmented Generation in AI Language Models - ./posts/all_things_RAG_paper_discussion/all_things_rag_paper_discussion.html
* The Importance of Proper Initialization. - ./posts/initialization_neural_networks/index.html
* Maximizing Your Commute: Learning on the Go with ChatGPT Voice - ./posts/chatGPT_audio_conversation/index.html
* Exploring GPT4 vision, fastai study hacks and what it means for industry 4.0 - ./posts/Exploring_GTP4V_paper/index.html
* Embracing IoT in Manufacturing: My Journey to Transforming Factory Operations - ./posts/iot_in_a_factory/index.html
* order PCB with surface mount components in under 15 minutes with easyEDA circuit design - ./posts/2020-09-09_pcb_in_15_minutes/pcb.html
* Integrating AI with LoRaWAN: A guide using edge impulse - ./posts/2021-01-27_exploring_wireless_spectrum/wirelss_spectrum.html
* Integrating AI with LoRaWAN: A guide using edge impulse - ./posts/2024-04-24_AI_LORAWAN_portenta/Arduino.html
* Nurturing Leadership Skills for Smart Futures: Insights from the EEUK Leadership Event 2020 - ./posts/developing_the_skils_for_smart_futures/index.html
* The Maker’s Journey: Discovering Innovation and Collaboration in Makerspaces - ./posts/the_makers_journey_unimaker/index.html
```
**Important Note:** The HTML you provided shows a listing of blog posts, not necessarily a complete list of *all* blog pages on the site. Some blogs might be linked to or embedded within the pages listed. To get a truly complete list, you would need to analyze the full website structure.
Return the links using json mode
Json mode is a way get structured format from the model, this is useful for extracting data that you need to use in a program for further processing. Json mode is provided by Google within their SDK.
JSON mode enforces a specific structured output format through a schema, unlike regular prompting which returns free-form text that may be harder to parse programmatically.
Setting up the model and we’re choosing the Gemini 1.5 pro, with json mode, lets see what response we get, intrestingly we only get one return.
from google.ai.generativelanguage_v1beta.types import content
# Create the model
= {
generation_config "temperature": 1,
"top_p": 0.95,
"top_k": 40,
"max_output_tokens": 8192,
"response_schema": content.Schema(
type = content.Type.OBJECT,
#enum = "[]",
= ["web post link", "post description"],
required = {
properties "web post link": content.Schema(
type = content.Type.STRING,
),"post description": content.Schema(
type = content.Type.STRING,
),
},
),"response_mime_type": "application/json",
}
= genai.GenerativeModel(
model ="gemini-1.5-pro",
model_name=generation_config,
generation_config
)
= model.start_chat(
chat_session =[
history
]
)
= chat_session.send_message(prompt)
response
print(response.text)
{"post description": "FastHTML + AI: Building a Revenue-Ready Application from Scratch", "web post link": "./posts/2024-11-11_FastHTML_app/fasthtml_app.html"}
Back to better prompting
Asking the model to return a list of links in a json format using justa prompt (not using googles json mode)
This is using the Gemini 1.5 pro model and prompting the model to return a list of links in a json format. I’ve also specified the content im feeding in is HTML, and what type of post it is and that i expect the output in json.
This is a much better response and i can do use traditional programming techniues to process the output.
= {
generation_config "temperature": 1,
"top_p": 0.95,
"top_k": 40,
"max_output_tokens": 8192,
}
= genai.GenerativeModel(
model ="gemini-1.5-pro",
model_name=generation_config,
generation_config
)
# Create a structured prompt
= """Extract blog post information from the following HTML content.
prompt For each blog post, provide:
1. The complete URL/link
2. A brief description of the post content
Format your response as a JSON array with objects containing 'url' and 'description' fields.
HTML Content:
""" + data.decode("utf-8")
# Send the message
= model.generate_content(prompt)
response print(response.text)
```json
[
{
"url": "./posts/2024-11-11_FastHTML_app/fasthtml_app.html",
"description": "The SafeFast Virtual Tours web app offers an immersive, AI-powered experience that transports you back to ancient Rome through interactive virtual tours. Using a…"
},
{
"url": "./posts/2024-10-03_robotics/robot.html",
"description": "I work for a manufacturing company where robots perform tasks like welding and transporting parts. I’m at an interesting intersection where both AI and robotics are my…"
},
{
"url": "./posts/2024-09-18_fast_html/fasthtml.html",
"description": "Welcome to my thoughts and learnings from developing a FastHTML app. I wanted to learn a web technology that is simple and fun, allowing me to focus on my main project. It…"
},
{
"url": "./posts/2024-08-18_cursor_ai/cursor_ai.html",
"description": "In this blog post, I’ve shared my experience with Cursor AI, a powerful AI-assisted code editor that I’ve been using for a few weeks. Here are the key points:"
},
{
"url": "./posts/2024-07-23_copilot_studio/copilot_studio.html",
"description": "Someone…"
},
{
"url": "./posts/2024-06-24_smart_factory_2024/smart_factory_2024.html",
"description": "First time out of the office in a while but I’ve finally…"
},
{
"url": "./posts/2024-04-22_tiny_llava/tiny_llava.html",
"description": "The TinyLLaVA paper shows the usual multimodeal model of image and text in and text out but there are many more modalities. One thing I keep asking myself is why am I still…"
},
{
"url": "./posts/transformers_paper/paper_explanation.html",
"description": "Every 2nd Saturday we have a paper reading group where we submit papers we are interested in reading and vote for our favorite paper to read together. This week we discussed…"
},
{
"url": "./posts/apache_arrow/apache_arrow.html",
"description": "I came across…"
},
{
"url": "./posts/WeightsAndBias/WeightsAndBias.html",
"description": "The blog will run you through a simple training loop and help understand how to intergrate weights and bias into your training loops using the mini ai from Fast AI."
},
{
"url": "./posts/hugging_face_datasets_library/Hugging_face_datasets.html",
"description": "This blog aims to provide a brief overview of the creation of a machine learning workflow from creating a dataset up to…"
},
{
"url": "./posts/eye_tracking_start/eye_tracking.html",
"description": "In the realm of human-computer interaction, the mouse has been a stalwart companion. However, with advancements in AI and computer vision and modern hardware…"
},
{
"url": "./posts/AI_ethics/index.html",
"description": "The world of Artificial Intelligence (AI) is witnessing a significant transformation, not just technologically, but also in terms of ethics, regulations, and legal…"
},
{
"url": "./posts/adam_optimizer/index.html",
"description": "The aim of this blog is to explain the role of a optimizer in a neural network training loop. I will explain what a neural network…"
},
{
"url": "./posts/future_skills_in_ai/index.html",
"description": "Manufacturing is a key sector for the UK economy, accounting for 10% of GDP and 44% of exports, the UK is the 8th largest exporter in the world, its important. In this article, we delve into the transformative impact of Artificial Intelligence (AI) on the manufacturing sector, a pivotal segment of the UK economy."
},
{
"url": "./posts/all_things_RAG_paper_discussion/all_things_rag_paper_discussion.html",
"description": "I’ve recently joined a discord group where we discuss deep learning papers and this week its about RAG (Retrieval-Augmented Generation). It consisted listening to the author…"
},
{
"url": "./posts/initialization_neural_networks/index.html",
"description": "I’m watching online videos series by Fast.ai where we are looking at re-creating neural networks from scratch using Python ensuring we fully understand the inner…"
},
{
"url": "./posts/chatGPT_audio_conversation/index.html",
"description": "I have 20 minute drive into work and back home everyday where I usually listen to a podcast, audio book or sometimes just stair at…"
},
{
"url": "./posts/Exploring_GTP4V_paper/index.html",
"description": "Hi, this is a explority view of GPT4 vision, study hacks and it’s uses in manufacturing and industry 4.0. Its a commentary of microsoft paper TheDawnofLMMs…"
},
{
"url": "./posts/iot_in_a_factory/index.html",
"description": "As someone deeply involved in factory operations, I’ve witnessed firsthand the remarkable transformation brought about by the Internet of…"
},
{
"url": "./posts/2020-09-09_pcb_in_15_minutes/pcb.html",
"description": "In this blog post, we delve into the world of electrical circuit design, particularly focusing on software that simplifies this complex task for…"
},
{
"url": "./posts/2021-01-27_exploring_wireless_spectrum/wirelss_spectrum.html",
"description": "I recently acquired a spectrum analyzer to help resolve a problem with wireless signals at the 2.4 GHz frequency. The specs show that it works at the 240 to 960 MHz range…"
},
{
"url": "./posts/2024-04-24_AI_LORAWAN_portenta/Arduino.html",
"description": "In this short video, we demonstrate how to use an Arduino Portenta Laura Board, equipped with a camera and AI capabilities. We’ll…"
},
{
"url": "./posts/developing_the_skils_for_smart_futures/index.html",
"description": "In an era where leadership skills are pivotal for success across various sectors, the EEUK Leadership Event 2020 provided a platform for vibrant discussions and shared…"
},
{
"url": "./posts/the_makers_journey_unimaker/index.html",
"description": "Here’s an article based on a talk I gave on 8th September 2020 for the Sheffield University. The talk was about my journey as a maker and how I’ve…"
}
]
```
Tool 2 - Crawlee
Crawlee is a comprehensive web scraping and browser automation library that was released for Python in July 2024. Some key features include:
- Unified interface for HTTP and headless browsers
- Automatic parallel crawling
- Integrated proxy rotation and session management
- Automatic error handling
It’s considered easy to set up and learn compared to other full-featured libraries like Scrapy. I couldn’t get his to work to scrape my blog, it would only scan the default test site even though i changed the site. I’ve left it in as I will come back to it, it has promise and is a young library. When you run this, it starts multiple browsers and starts scanning the website(s) in questions which you cant demostrate in jupyter notebook.
import asyncio
from crawlee.playwright_crawler import PlaywrightCrawler, PlaywrightCrawlingContext
ModuleNotFoundError: No module named 'crawlee'
url
'https://alexkelly.world/'
import asyncio
import nest_asyncio
from crawlee.playwright_crawler import PlaywrightCrawler, PlaywrightCrawlingContext
# Allow nested event loops
apply()
nest_asyncio.
async def main() -> None:
= PlaywrightCrawler(
crawler =5, # Limit the crawl to 5 requests.
max_requests_per_crawl=False, # Show the browser window.
headless='firefox', # Use the Firefox browser.
browser_type
)
# Define the default request handler, which will be called for every request.
@crawler.router.default_handler
async def request_handler(context: PlaywrightCrawlingContext) -> None:
f'Processing {context.request.url} ...')
context.log.info(
# Enqueue all links found on the page.
await context.enqueue_links()
# Extract data from the page using Playwright API.
= {
data 'url': context.request.url,
'title': await context.page.title(),
'content': (await context.page.content()),
}
# Push the extracted data to the default dataset.
await context.push_data(data)
# Run the crawler with the initial list of URLs.
await crawler.run(["https://alexkelly.world/"])
# Export the entire dataset to a JSON file.
await crawler.export_data('results.json')
# Or work with the data directly.
= await crawler.get_data()
data f'Extracted data: {data.items}')
crawler.log.info(
# Run the main coroutine
await main()
[crawlee._autoscaling.snapshotter] INFO Setting max_memory_size of this run to 1.92 GB.
[crawlee.playwright_crawler._playwright_crawler] INFO Current request statistics:
┌───────────────────────────────┬────────┐
│ requests_finished │ 0 │
│ requests_failed │ 0 │
│ retry_histogram │ [0] │
│ request_avg_failed_duration │ None │
│ request_avg_finished_duration │ None │
│ requests_finished_per_minute │ 0 │
│ requests_failed_per_minute │ 0 │
│ request_total_duration │ 0.0 │
│ requests_total │ 0 │
│ crawler_runtime │ 0.0832 │
└───────────────────────────────┴────────┘
[crawlee._autoscaling.autoscaled_pool] INFO current_concurrency = 0; desired_concurrency = 2; cpu = 0.0; mem = 0.0; event_loop = 0.0; client_info = 0.0
[crawlee.storages._request_queue] WARN The request queue seems to be stuck for 300.0s, resetting internal state. ({"queue_head_ids_pending": 9, "in_progress": ["dbcE178BxB6A0Zt", "S31bA6CFULqtMzg"]})
[crawlee.playwright_crawler._playwright_crawler] INFO Processing https://crawlee.dev/api/core ...
[crawlee.playwright_crawler._playwright_crawler] INFO Processing https://crawlee.dev/api/core/changelog ...
[crawlee._autoscaling.snapshotter] WARN Memory is critically overloaded. Using 1.88 GB of 1.92 GB (97%). Consider increasing available memory.
[crawlee._autoscaling.snapshotter] WARN Memory is critically overloaded. Using 1.85 GB of 1.92 GB (96%). Consider increasing available memory.
[crawlee.playwright_crawler._playwright_crawler] INFO Current request statistics:
┌───────────────────────────────┬────────────┐
│ requests_finished │ 2 │
│ requests_failed │ 0 │
│ retry_histogram │ [2] │
│ request_avg_failed_duration │ None │
│ request_avg_finished_duration │ 51.420878 │
│ requests_finished_per_minute │ 2 │
│ requests_failed_per_minute │ 0 │
│ request_total_duration │ 102.841757 │
│ requests_total │ 2 │
│ crawler_runtime │ 60.097431 │
└───────────────────────────────┴────────────┘
[crawlee._autoscaling.autoscaled_pool] INFO current_concurrency = 1; desired_concurrency = 1; cpu = 0.0; mem = 0.236; event_loop = 0.044; client_info = 0.0
[crawlee.playwright_crawler._playwright_crawler] INFO Processing https://crawlee.dev/docs/guides/avoid-blocking ...
[crawlee._autoscaling.snapshotter] WARN Memory is critically overloaded. Using 1.84 GB of 1.92 GB (96%). Consider increasing available memory.
[crawlee.playwright_crawler._playwright_crawler] INFO Processing https://crawlee.dev/docs/guides/cheerio-crawler-guide ...
[crawlee._autoscaling.snapshotter] WARN Memory is critically overloaded. Using 1.87 GB of 1.92 GB (97%). Consider increasing available memory.
[crawlee.playwright_crawler._playwright_crawler] INFO Processing https://crawlee.dev/docs/guides/jsdom-crawler-guide ...
[crawlee.playwright_crawler._playwright_crawler] INFO The crawler has reached its limit of 5 requests per crawl. All ongoing requests have now completed. Total requests processed: 5. The crawler will now shut down.
[crawlee._autoscaling.autoscaled_pool] INFO Waiting for remaining tasks to finish
[crawlee.playwright_crawler._playwright_crawler] INFO Final request statistics:
┌───────────────────────────────┬────────────┐
│ requests_finished │ 5 │
│ requests_failed │ 0 │
│ retry_histogram │ [5] │
│ request_avg_failed_duration │ None │
│ request_avg_finished_duration │ 32.870533 │
│ requests_finished_per_minute │ 3 │
│ requests_failed_per_minute │ 0 │
│ request_total_duration │ 164.352663 │
│ requests_total │ 5 │
│ crawler_runtime │ 111.093642 │
└───────────────────────────────┴────────────┘
[crawlee.playwright_crawler._playwright_crawler] INFO Extracted data: [{'url': 'https://crawlee.dev', 'title': 'Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="plugin-pages plugin-id-default" data-has-hydrated="t'}, {'url': 'https://crawlee.dev/python/', 'title': 'Crawlee for Python · Fast, reliable Python web crawlers.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="plugin-pages plugin-id-default" data-has-hydrated="t'}, {'url': 'https://crawlee.dev/docs/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/examples', 'title': 'Examples | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/blog', 'title': 'Crawlee Blog - learn how to build better scrapers | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="blog-wrapper blog-list-page plugin-blog plugin-id-de'}, {'url': 'https://crawlee.dev/docs/next/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.11/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.10/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.9/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.8/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.7/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.6/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.5/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.4/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.3/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.2/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.1/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/3.0/quick-start', 'title': 'Quick Start | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/introduction', 'title': 'Introduction | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/guides/javascript-rendering', 'title': 'JavaScript rendering | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/docs/guides/typescript-project', 'title': 'TypeScript Projects | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-vers'}, {'url': 'https://crawlee.dev/api/core', 'title': '@crawlee/core | API | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-typedoc-api plugin-id-default api-version-3.12 docs-doc-page" data-has-hydrated="true" data-theme="light" data-announcement-bar-initially-dismissed="false" data-rh="lang,dir,class,data-has-hydrated"><head><meta charset="UTF-8"><meta name="generator" content="Docusaurus v3.6.0"><title>@crawlee/core | API | Crawlee · Build reliable crawlers. Fast.</title><meta data-rh="true" name="twitter:card" content="summary_large_image"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Crawlee · Build reliable crawlers. Fast. RSS Feed"><link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Crawlee · Build reliable crawlers. Fast. Atom Feed"><link rel="search" type="application/opensearchdescription+xml" title="Crawlee · Build reliable crawlers. Fast." href="/opensearch.xml"><!-- Google Tag Manager --><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/identify_45dd5971.js"></script><script async="" src="https://www.clarity.ms/s/0.7.56/clarity.js"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/main.MWQ3ODVjY2ZhNQ.js" data-id="CQHNEL3C77U08RGLR00G"></script><script async="" src="https://www.clarity.ms/tag/uet/187137944"></script><script src="https://js.hsadspixel.net/fb.js" type="text/javascript" id="hs-ads-pixel-19497222" data-ads-portal-id="19497222" data-ads-env="prod" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-banner.com/v2/19497222/banner.js" type="text/javascript" id="cookieBanner-19497222" data-cookieconsent="ignore" data-hs-ignore="true" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hubspot.com/web-interactives-embed.js" type="text/javascript" id="hubspot-web-interactives-loader" crossorigin="anonymous" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-analytics.net/analytics/1732041000000/19497222.js" type="text/javascript" id="hs-analytics"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=CQHNEL3C77U08RGLR00G&lib=ttq"></script><script type="text/javascript" async="" src="https://a.quora.com/qevents.js"></script><script type="text/javascript" async="" src="https://static.ads-twitter.com/uwt.js"></script><script type="text/javascript" async="" src="https://www.redditstatic.com/ads/pixel.js"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://bat.bing.com/bat.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-62P18XN9NS&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-1MGJDMV8DX&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://widget.intercom.io/widget/kod1r788"></script><script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-5P7MCS7"></script><script>!function(e,t,a,n,r){e[n]=e[n]||[],e[n].push({"gtm.start":new Date().getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id="+r+("dataLayer"!=n?"&l="+n:""),g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer","GTM-5P7MCS7")</script><!-- End Google Tag Manager --><script>window.intercomSettings={api_base:"https://api-iam.intercom.io",app_id:"kod1r788"},function(){var t=window,e=t.Intercom;if("function"==typeof e)e("reattach_activator"),e("update",t.intercomSettings);else{var n=document,a=function(){a.c(arguments)};a.q=[],a.c=function(t){a.q.push(t)},t.Intercom=a;var i=function(){var t=n.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://widget.intercom.io/widget/kod1r788";var e=n.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)};"complete"===document.readyState?i():t.attachEvent?t.attachEvent("onload",i):t.addEventListener("load",i,!1)}}()</script><script src="/js/custom.js"></script><link rel="stylesheet" href="/assets/css/styles.ac465ac2.css"><script src="/assets/js/main.a0f1a072.js" defer=""></script><script src="/assets/js/runtime~main.b70d65a1.js" defer=""></script><meta name="viewport" content="width=device-width, initial-scale=1.0" data-rh="true"><link rel="canonical" href="https://crawlee.dev/api/core" data-rh="true"><meta property="og:image" content="https://crawlee.dev/img/crawlee-og.png" data-rh="true"><meta name="twitter:image" content="https://crawlee.dev/img/crawlee-og.png" data-rh="true"><meta property="og:url" content="https://crawlee.dev/api/core" data-rh="true"><link rel="alternate" href="https://crawlee.dev/api/core" hreflang="en" data-rh="true"><link rel="alternate" href="https://crawlee.dev/api/core" hreflang="x-default" data-rh="true"><meta property="og:locale" content="en" data-rh="true"><meta name="docusaurus_locale" content="en" data-rh="true"><meta name="docsearch:language" content="en" data-rh="true"><meta name="description" content="Crawlee helps you build and maintain your crawlers. It\'s open source, but built by developers who scrape millions of pages every day for a living." data-rh="true"><meta name="og:description" content="Crawlee helps you build and maintain your crawlers. It\'s open source, but built by developers who scrape millions of pages every day for a living." data-rh="true"><script src="https://bat.bing.com/p/action/187137944.js" type="text/javascript" async="" data-ueto="ueto_c1365c4299"></script><link rel="preconnect" href="https://5JC94MPMLY-dsn.algolia.net" crossorigin="anonymous" data-rh="true"><style id="_goober"> .go2933276541{position:fixed;display:block;width:100%;height:0px;margin:0px;padding:0px;overflow:visible;transform-style:preserve-3d;background:transparent;backface-visibility:hidden;pointer-events:none;left:0px;z-index:9998;}.go2369186930{top:0px;z-index:9999;height:100%;width:100%;}.go1348078617{bottom:0px;}.go2417249464{position:fixed;z-index:9989;}.go3921366393{left:0;bottom:0;}.go3967842156{right:0;bottom:0;}.go613305155{left:0;top:0;}.go471583506{right:0;top:0;}.go3670563033{position:relative;overflow:hidden;display:none;}.go1041095097{display:block;}.go1632949049{position:absolute;pointer-events:none;width:101vw;height:101vh;background:rgba(0,0,0,0.7);opacity:0;z-index:-1;}.go2512015367{z-index:99998;opacity:0.8;visibility:visible;pointer-events:all;cursor:pointer;}.go1432718904{overflow:hidden;}.go812842568{display:block !important;position:static !important;box-sizing:border-box !important;background:transparent !important;border:none;min-height:0px !important;max-height:none !important;margin:0px;padding:0px !important;height:100% !important;width:1px !important;max-width:100% !important;min-width:100% !important;}.go4194603687{z-index:99999;visibility:hidden;position:absolute;inset:50vh auto auto 50%;transform:translate(-50%,-50%);left:50%;top:150%;pointer-events:none;max-height:95%;max-width:95%;}.go4258295619{pointer-events:auto !important;visibility:visible;top:50%;transition:top 0.75s linear(0,0.006,0.023 2.2%,0.096 4.8%,0.532 15.4%,0.72 21%,0.793,0.853 26.7%,0.902,0.941,0.968 36.2%,0.987 39.7%,1 43.7%,1.007 48.3%,1.009 55.3%,1.002 78.2%,1 );}.go456419034{transition:opacity 0.3s ease-in;}.go3128134379{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transition:max-height 1s ease-in;}.go494047706{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;}.go2481764524{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;bottom:0px;}.go2685733372{visibility:hidden;}.go2985984737{visibility:visible !important;}.go3281949485{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transform:none !important;}.go3508454897{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;transition:transform 1s linear(0,0.006,0.022 2.3%,0.091 5.1%,0.18 7.6%,0.508 16.3%,0.607,0.691,0.762,0.822 28.4%,0.872,0.912 35.1%,0.944 38.9%,0.968 43%,0.985 47.6%,0.996 53.1%,1.001 58.4%,1.003 65.1%,1 );}.go988075951{z-index:9999;position:fixed;left:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go2699082514{z-index:9999;position:fixed;right:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1595992025{z-index:9999;position:fixed;left:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1222083472{z-index:9999;position:fixed;right:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go722322694{transition:none !important;}.go26732895{cursor:pointer;}.go2083580917{display:flex;justify-content:center;align-items:center;}</style><meta name="docusaurus_version" content="3.12" data-rh="true"><meta name="docusaurus_tag" content="docs-default-3.12" data-rh="true"><meta name="docsearch:version" content="3.12" data-rh="true"><meta name="docsearch:docusaurus_tag" content="docs-default-3.12" data-rh="true"><script async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971"></script><meta property="og:title" content="@crawlee/core | API | Crawlee · Build reliable crawlers. Fast." data-rh="true"><link rel="prefetch" href="/assets/js/c4f5d8e4.e74add4a.js"><link rel="prefetch" href="/assets/js/a7456010.2748ec17.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/fc6fe3c2.ca6fce44.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/14eb3368.22117ead.js"><link rel="prefetch" href="/assets/js/08fa83af.1e79e271.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/b22f5575.2fd431df.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/e4ef868e.c59f73f6.js"><link rel="prefetch" href="/assets/js/3f1bdb35.f55b4b21.js"><link rel="prefetch" href="/assets/js/a6aa9e1f.e11bbbf9.js"><link rel="prefetch" href="/assets/js/36994c47.c3291bce.js"><link rel="prefetch" href="/assets/js/814f3328.14399cf4.js"><link rel="prefetch" href="/assets/js/31276798.d914003a.js"><link rel="prefetch" href="/assets/js/ce44969a.a238b80f.js"><link rel="prefetch" href="/assets/js/9e1c89b6.640fdf1b.js"><link rel="prefetch" href="/assets/js/4ade9265.6073ce08.js"><link rel="prefetch" href="/assets/js/a6ac7fdc.7dc1b603.js"><link rel="prefetch" href="/assets/js/664c1011.5a64a880.js"><link rel="prefetch" href="/assets/js/e882a74a.647051f2.js"><link rel="prefetch" href="/assets/js/a3a97bb2.39475c55.js"><link rel="prefetch" href="/assets/js/80f9a068.d1f1c454.js"><link rel="prefetch" href="/assets/js/81508318.b7a58153.js"><link rel="prefetch" href="/assets/js/c15d9823.d72be663.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/96f87a9f.b0b6733d.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/57011b7b.148fd9a9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/d3155f31.3eec6f0f.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/c0529609.f51001e8.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/8f6ea93a.edd9cdf2.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/c8f99523.561e2525.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/cbb212ae.ce308f04.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/8aa7d115.a3a167fc.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/982ff309.e75e88c2.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/487257bc.0b8c5e6a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/7d775580.2481b4d2.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/b2295425.e837d25a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/6efd86d1.623d4eb8.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/d236e252.54a15f9b.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/9b8b8eb2.7b81a51a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/96002354.33fb5ac1.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/b1cfc6a8.cb18a842.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/6414f13f.2f7ad281.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/294e520c.054e1d5a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/21e04284.73c16035.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/1a188823.5ee6237d.js"><script type="text/javascript" async="" src="https://googleads.g.doubleclick.net/pagead/viewthroughconversion/695293971/?random=1732041270397&cv=11&fst=1732041270397&bg=ffffff&guid=ON&async=1&gtm=45be4be0v9178109438za200zb892235334&gcd=13t3t3t3t5l1&dma=0&tag_exp=101925629~102067555~102067808~102077855&u_w=1280&u_h=720&url=https%3A%2F%2Fcrawlee.dev%2Fapi%2Fcore&hn=www.googleadservices.com&frm=0&tiba=%40crawlee%2Fcore%20%7C%20API%20%7C%20Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&did=dZTQ1Zm&gdid=dZTQ1Zm&npa=0&pscdl=noapi&auid=32429968.1732041270&fdr=QA&data=event%3Dgtag.config&rfmt=3&fmt=4"></script></head><body class="navigation-with-keyboard" data-rh="class" style="overflow: visible;"><div id="hs-web-interactives-top-push-anchor" class="go3670563033"></div><script>!function(){var t,e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t=null!==e?e:window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":(window.matchMedia("(prefers-color-scheme: light)").matches,"light"),document.documentElement.setAttribute("data-theme",t)}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">🎉️ <b><a href="https://crawlee.dev/python/">Crawlee for Python is open to early adopters!</a></b> 🥳️</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"></div><b class="navbar__title text--truncate">Crawlee</b></a><a class="navbar__item navbar__link" href="/docs/quick-start">Docs</a><a class="navbar__item navbar__link" href="/docs/examples">Examples</a><a aria-current="page" class="navbar__item navbar__link navbar__link--active" href="/api/core">API</a><a class="navbar__item navbar__link changelog" href="/api/core/changelog">Changelog</a><a class="navbar__item navbar__link" href="/blog">Blog</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Node.js</a><ul class="dropdown__menu"><li><a href="#" class="dropdown__link api-version-bound" rel="dofollow">Node.js</a></li><li><a href="https://crawlee.dev/python" rel="dofollow" class="dropdown__link">Python<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a class="navbar__link" aria-haspopup="true" aria-expanded="false" role="button" href="/docs/quick-start">3.12</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/next/quick-start">Next</a></li><li><a class="dropdown__link" href="/docs/quick-start">3.12</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.11/quick-start">3.11</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.10/quick-start">3.10</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.9/quick-start">3.9</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.8/quick-start">3.8</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.7/quick-start">3.7</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.6/quick-start">3.6</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.5/quick-start">3.5</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.4/quick-start">3.4</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.3/quick-start">3.3</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.2/quick-start">3.2</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.1/quick-start">3.1</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.0/quick-start">3.0</a></li><li><a href="https://sdk.apify.com/docs/guides/getting-started?__hstc=7591405.6a07528923a27f84c18da26fd68f19ee.1732041259575.1732041259575.1732041259575.1&__hssc=7591405.1.1732041259575&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link">2.2<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://sdk.apify.com/docs/1.3.1/guides/getting-started?__hstc=7591405.6a07528923a27f84c18da26fd68f19ee.1732041259575.1732041259575.1732041259575.1&__hssc=7591405.1.1732041259575&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link api-version-bound">1.3<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="toggle_MW0i colorModeToggle_x44X"><button class="clean-btn toggleButton_yw5v" type="button" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><span><svg viewBox="0 0 13 12" fill="none" width="14" height="14" class="lightToggleIcon_SFTY"><g clip-path="url(#clip0_833_8168)"><path d="M6.59998 8.49999C7.98069 8.49999 9.09998 7.3807 9.09998 5.99999C9.09998 4.61928 7.98069 3.49999 6.59998 3.49999C5.21926 3.49999 4.09998 4.61928 4.09998 5.99999C4.09998 7.3807 5.21926 8.49999 6.59998 8.49999Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 0.5V1.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 10.5V11.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 2.11L3.4199 2.82" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 9.17999L10.4899 9.88999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1.09998 6H2.09998" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.0999 6H12.0999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 9.88999L3.4199 9.17999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 2.82L10.4899 2.11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></g><defs><clipPath id="clip0_833_8168"><rect width="12" height="12" fill="white" transform="translate(0.599976)"></rect></clipPath></defs></svg><svg viewBox="0 0 13 12" width="14" height="14" class="darkToggleIcon_ekgs"><path d="M10.7001 6.39501C10.6215 7.24611 10.3021 8.05721 9.77927 8.7334C9.25646 9.40959 8.55189 9.92291 7.748 10.2133C6.9441 10.5036 6.07414 10.5591 5.2399 10.3731C4.40565 10.187 3.64164 9.76728 3.03726 9.1629C2.43287 8.55851 2.01312 7.7945 1.8271 6.96026C1.64108 6.12602 1.6965 5.25605 1.98688 4.45216C2.27725 3.64826 2.79056 2.94369 3.46675 2.42088C4.14294 1.89808 4.95404 1.57866 5.80515 1.50001C5.30685 2.17414 5.06707 3.00473 5.12941 3.84071C5.19175 4.6767 5.55208 5.46254 6.14485 6.05531C6.73762 6.64808 7.52346 7.0084 8.35944 7.07074C9.19542 7.13308 10.026 6.8933 10.7001 6.39501Z" stroke="currentColor" fill="transparent" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button></div><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="View on GitHub">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="Chat on Discord">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"><svg width="15" height="15" class="DocSearch-Control-Key-Icon"><path d="M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953" stroke-width="1.2" stroke="currentColor" fill="none" stroke-linecap="square"></path></svg></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="apiPage"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"><b>Crawlee</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true">@crawlee/core</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/api/core">Overview</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Classes</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Enumerations</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Functions</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Interfaces</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">References</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Type Aliases</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Variables</a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/api/core/changelog">Changelog</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/cheerio</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/playwright</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/puppeteer</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/jsdom</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/linkedom</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/basic</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/http</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/browser</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/memory-storage</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/browser-pool</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/utils</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/types</a></div></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col apiItemCol"><div class="apiItemContainer"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">@crawlee/core</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Overview</span><meta itemprop="position" content="2"></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 3.12</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile apiTocMobile"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1><span class="tsd-header-flags"><span class="tsd-flag-group"></span></span>@crawlee/core<!-- --> </h1></header><section class="tsd-readme"><p>Core set of classes required for Crawlee.</p>\n<p>The <a href="https://www.npmjs.com/package/crawlee" target="_blank" rel="noopener noreferrer"><code>crawlee</code></a> package consists of several smaller packages, released separately under <code>@crawlee</code> namespace:</p>\n<ul>\n<li><a href="/api/core"><code>@crawlee/core</code></a>: the base for all the crawler implementations, also contains things like <code>Request</code>, <code>RequestQueue</code>, <code>RequestList</code> or <code>Dataset</code> classes</li>\n<li><a href="/api/cheerio-crawler"><code>@crawlee/cheerio</code></a>: exports <code>CheerioCrawler</code></li>\n<li><a href="/api/playwright-crawler"><code>@crawlee/playwright</code></a>: exports <code>PlaywrightCrawler</code></li>\n<li><a href="/api/puppeteer-crawler"><code>@crawlee/puppeteer</code></a>: exports <code>PuppeteerCrawler</code></li>\n<li><a href="/api/linkedom-crawler"><code>@crawlee/linkedom</code></a>: exports <code>LinkeDOMCrawler</code></li>\n<li><a href="/api/jsdom-crawler"><code>@crawlee/jsdom</code></a>: exports <code>JSDOMCrawler</code></li>\n<li><a href="/api/basic-crawler"><code>@crawlee/basic</code></a>: exports <code>BasicCrawler</code></li>\n<li><a href="/api/http-crawler"><code>@crawlee/http</code></a>: exports <code>HttpCrawler</code> (which is used for creating <a href="/api/jsdom-crawler"><code>@crawlee/jsdom</code></a> and <a href="/api/cheerio-crawler"><code>@crawlee/cheerio</code></a>)</li>\n<li><a href="/api/browser-crawler"><code>@crawlee/browser</code></a>: exports <code>BrowserCrawler</code> (which is used for creating <a href="/api/playwright-crawler"><code>@crawlee/playwright</code></a> and <a href="/api/puppeteer-crawler"><code>@crawlee/puppeteer</code></a>)</li>\n<li><a href="/api/memory-storage"><code>@crawlee/memory-storage</code></a>: <a href="https://npmjs.com/package/@apify/storage-local" target="_blank" rel="noopener noreferrer"><code>@apify/storage-local</code></a> alternative</li>\n<li><a href="/api/browser-pool"><code>@crawlee/browser-pool</code></a>: previously <a href="https://npmjs.com/package/browser-pool" target="_blank" rel="noopener noreferrer"><code>browser-pool</code></a> package</li>\n<li><a href="/api/utils"><code>@crawlee/utils</code></a>: utility methods</li>\n<li><a href="/api/types"><code>@crawlee/types</code></a>: holds TS interfaces mainly about the <a href="/api/core/interface/StorageClient"><code>StorageClient</code></a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="installing-crawlee">Installing Crawlee<a href="#installing-crawlee" class="hash-link" aria-label="Direct link to Installing Crawlee" title="Direct link to Installing Crawlee">\u200b</a></h2>\n<p>Most of the Crawlee packages are extending and reexporting each other, so it\'s enough to install just the one you plan on using, e.g. <code>@crawlee/playwright</code> if you plan on using <code>playwright</code> - it already contains everything from the <code>@crawlee/browser</code> package, which includes everything from <code>@crawlee/basic</code>, which includes everything from <code>@crawlee/core</code>.</p>\n<p>If we don\'t care much about additional code being pulled in, we can just use the <code>crawlee</code> meta-package, which contains (re-exports) most of the <code>@crawlee/*</code> packages, and therefore contains all the crawler classes.</p>\n<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token function" style="color: rgb(215, 58, 73);">npm</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">install</span><span class="token plain"> crawlee</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<p>Or if all we need is cheerio support, we can install only <code>@crawlee/cheerio</code>.</p>\n<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token function" style="color: rgb(215, 58, 73);">npm</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">install</span><span class="token plain"> @crawlee/cheerio</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<p>When using <code>playwright</code> or <code>puppeteer</code>, we still need to install those dependencies explicitly - this allows the users to be in control of which version will be used.</p>\n<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token function" style="color: rgb(215, 58, 73);">npm</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">install</span><span class="token plain"> crawlee playwright</span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;"># or npm install @crawlee/playwright playwright</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<p>Alternatively we can also use the <code>crawlee</code> meta-package which contains (re-exports) most of the <code>@crawlee/*</code> packages, and therefore contains all the crawler classes.</p>\n<blockquote>\n<p>Sometimes you might want to use some utility methods from <code>@crawlee/utils</code>, so you might want to install that as well. This package contains some utilities that were previously available under <code>Apify.utils</code>. Browser related utilities can be also found in the crawler packages (e.g. <code>@crawlee/playwright</code>).</p>\n</blockquote></section><section class="tsd-panel-group tsd-index-group"><h2>Index <a href="#Index" class="tsd-anchor"><span class="tsd-anchor-id" id="Index"></span><i class="codicon codicon-symbol-numeric"></i></a></h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section"><h3 class="tsd-panel-header">Crawlers</h3><div class="tsd-panel-content"><ul class="tsd-index-list"><li><a class="tsd-kind-icon" href="/api/core/class/Statistics"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Statistics</a></li></ul></div></section><section class="tsd-index-section"><h3 class="tsd-panel-header">Result Stores</h3><div class="tsd-panel-content"><ul class="tsd-index-list"><li><a class="tsd-kind-icon" href="/api/core/class/Dataset"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Dataset</a></li><li><a class="tsd-kind-icon" href="/api/core/class/KeyValueStore"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>KeyValueStore</a></li></ul></div></section><section class="tsd-index-section"><h3 class="tsd-panel-header">Scaling</h3><div class="tsd-panel-content"><ul class="tsd-index-list"><li><a class="tsd-kind-icon" href="/api/core/class/AutoscaledPool"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>AutoscaledPool</a></li><li><a class="tsd-kind-icon" href="/api/core/class/ProxyConfiguration"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>ProxyConfiguration</a></li><li><a class="tsd-kind-icon" href="/api/core/class/Session"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Session</a></li><li><a class="tsd-kind-icon" href="/api/core/class/SessionPool"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>SessionPool</a></li><li><a class="tsd-kind-icon" href="/api/core/class/Snapshotter"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Snapshotter</a></li><li><a class="tsd-kind-icon" href="/api/core/class/SystemStatus"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>SystemStatus</a></li></ul></div></section><section class="tsd-index-section"><h3 class="tsd-panel-header">Sources</h3><div class="tsd-panel-content"><ul class="tsd-index-list"><li><a class="tsd-kind-icon" href="/api/core/class/PseudoUrl"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>PseudoUrl</a></li><li><a class="tsd-kind-icon" href="/api/core/class/Request"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Request</a></li><li><a class="tsd-kind-icon" href="/api/core/class/RequestList"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>RequestList</a></li><li><a class="tsd-kind-icon" href="/api/core/class/RequestQueue"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>RequestQueue</a></li><li><a class="tsd-kind-icon" href="/api/core/class/RequestQueueV1"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>RequestQueueV1</a></li></ul></div></section><section class="tsd-index-section"><h3 class="tsd-panel-header">Other</h3><div class="tsd-panel-content"><ul class="tsd-index-list"><li><a class="tsd-kind-icon" href="/api/core#RequestQueueV2"><i class="codicon codicon-references" style="color:var(--ifm-color-danger)"></i>RequestQueueV2</a></li><li><a class="tsd-kind-icon" href="/api/core/enum/EnqueueStrategy"><i class="codicon codicon-symbol-enum" style="color:var(--ifm-color-danger)"></i>EnqueueStrategy</a></li><li><a class="tsd-kind-icon" href="/api/core/enum/EventType"><i class="codicon codicon-symbol-enum" style="color:var(--ifm-color-danger)"></i>EventType</a></li><li><a class="tsd-kind-icon" href="/api/core/enum/LogLevel"><i class="codicon codicon-symbol-enum" style="color:var(--ifm-color-danger)"></i>LogLevel</a></li><li><a class="tsd-kind-icon" href="/api/core/enum/RequestState"><i class="codicon codicon-symbol-enum" style="color:var(--ifm-color-danger)"></i>RequestState</a></li><li><a class="tsd-kind-icon" href="/api/core/class/Configuration"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Configuration</a></li><li><a class="tsd-kind-icon" href="/api/core/class/CriticalError"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>CriticalError</a></li><li><a class="tsd-kind-icon" href="/api/core/class/ErrorSnapshotter"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>ErrorSnapshotter</a></li><li><a class="tsd-kind-icon" href="/api/core/class/ErrorTracker"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>ErrorTracker</a></li><li><a class="tsd-kind-icon" href="/api/core/class/EventManager"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>EventManager</a></li><li><a class="tsd-kind-icon" href="/api/core/class/GotScrapingHttpClient"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>GotScrapingHttpClient</a></li><li><a class="tsd-kind-icon" href="/api/core/class/LocalEventManager"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>LocalEventManager</a></li><li><a class="tsd-kind-icon" href="/api/core/class/Log"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Log</a></li><li><a class="tsd-kind-icon" href="/api/core/class/Logger"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Logger</a></li><li><a class="tsd-kind-icon" href="/api/core/class/LoggerJson"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>LoggerJson</a></li><li><a class="tsd-kind-icon" href="/api/core/class/LoggerText"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>LoggerText</a></li><li><a class="tsd-kind-icon" href="/api/core/class/NonRetryableError"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>NonRetryableError</a></li><li><a class="tsd-kind-icon" href="/api/core/class/RequestHandlerResult"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>RequestHandlerResult</a></li><li><a class="tsd-kind-icon" href="/api/core/class/RequestProvider"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>RequestProvider</a></li><li><a class="tsd-kind-icon" href="/api/core/class/RetryRequestError"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>RetryRequestError</a></li><li><a class="tsd-kind-icon" href="/api/core/class/Router"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>Router</a></li><li><a class="tsd-kind-icon" href="/api/core/class/SessionError"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>SessionError</a></li><li><a class="tsd-kind-icon" href="/api/core/class/SitemapRequestList"><i class="codicon codicon-symbol-class" style="color:var(--ifm-color-warning)"></i>SitemapRequestList</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/AddRequestsBatchedOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>AddRequestsBatchedOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/AddRequestsBatchedResult"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>AddRequestsBatchedResult</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/AutoscaledPoolOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>AutoscaledPoolOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/BaseHttpClient"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>BaseHttpClient</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/BaseHttpResponseData"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>BaseHttpResponseData</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ClientInfo"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ClientInfo</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ConfigurationOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ConfigurationOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/Cookie"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>Cookie</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/CrawlingContext"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>CrawlingContext</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/CreateSession"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>CreateSession</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetConsumer"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetConsumer</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetContent"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetContent</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetDataOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetDataOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetExportOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetExportOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetExportToOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetExportToOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetIteratorOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetIteratorOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetMapper"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetMapper</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/DatasetReducer"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>DatasetReducer</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/EnqueueLinksOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>EnqueueLinksOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ErrnoException"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ErrnoException</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ErrorTrackerOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ErrorTrackerOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/FinalStatistics"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>FinalStatistics</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/HttpRequest"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>HttpRequest</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/HttpRequestOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>HttpRequestOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/HttpResponse"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>HttpResponse</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/IRequestList"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>IRequestList</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/IStorage"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>IStorage</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/KeyConsumer"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>KeyConsumer</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/KeyValueStoreIteratorOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>KeyValueStoreIteratorOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/KeyValueStoreOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>KeyValueStoreOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/LoggerOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>LoggerOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/PersistenceOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>PersistenceOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ProxyConfigurationFunction"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ProxyConfigurationFunction</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ProxyConfigurationOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ProxyConfigurationOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ProxyInfo"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ProxyInfo</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/PushErrorMessageOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>PushErrorMessageOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/QueueOperationInfo"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>QueueOperationInfo</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RecordOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RecordOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RequestListOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RequestListOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RequestListState"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RequestListState</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RequestOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RequestOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RequestProviderOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RequestProviderOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RequestQueueOperationOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RequestQueueOperationOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RequestQueueOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RequestQueueOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RequestTransform"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RequestTransform</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ResponseLike"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ResponseLike</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/ResponseTypes"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>ResponseTypes</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RestrictedCrawlingContext"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RestrictedCrawlingContext</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/RouterHandler"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>RouterHandler</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/SessionOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>SessionOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/SessionPoolOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>SessionPoolOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/SessionState"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>SessionState</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/SitemapRequestListOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>SitemapRequestListOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/SnapshotResult"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>SnapshotResult</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/SnapshotterOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>SnapshotterOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/StatisticPersistedState"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>StatisticPersistedState</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/StatisticState"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>StatisticState</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/StatisticsOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>StatisticsOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/StorageClient"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>StorageClient</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/StorageManagerOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>StorageManagerOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/StreamingHttpResponse"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>StreamingHttpResponse</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/SystemInfo"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>SystemInfo</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/SystemStatusOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>SystemStatusOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/TieredProxy"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>TieredProxy</a></li><li><a class="tsd-kind-icon" href="/api/core/interface/UseStateOptions"><i class="codicon codicon-symbol-interface" style="color:var(--ifm-color-danger)"></i>UseStateOptions</a></li><li><a class="tsd-kind-icon" href="/api/core#EventTypeName"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>EventTypeName</a></li><li><a class="tsd-kind-icon" href="/api/core#GetUserDataFromRequest"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>GetUserDataFromRequest</a></li><li><a class="tsd-kind-icon" href="/api/core#GlobInput"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>GlobInput</a></li><li><a class="tsd-kind-icon" href="/api/core#GlobObject"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>GlobObject</a></li><li><a class="tsd-kind-icon" href="/api/core#LoadedRequest"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>LoadedRequest</a></li><li><a class="tsd-kind-icon" href="/api/core#PseudoUrlInput"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>PseudoUrlInput</a></li><li><a class="tsd-kind-icon" href="/api/core#PseudoUrlObject"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>PseudoUrlObject</a></li><li><a class="tsd-kind-icon" href="/api/core#RedirectHandler"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RedirectHandler</a></li><li><a class="tsd-kind-icon" href="/api/core#RegExpInput"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RegExpInput</a></li><li><a class="tsd-kind-icon" href="/api/core#RegExpObject"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RegExpObject</a></li><li><a class="tsd-kind-icon" href="/api/core#RequestListSourcesFunction"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RequestListSourcesFunction</a></li><li><a class="tsd-kind-icon" href="/api/core#RouterRoutes"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RouterRoutes</a></li><li><a class="tsd-kind-icon" href="/api/core#Source"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>Source</a></li><li><a class="tsd-kind-icon" href="/api/core#UrlPatternObject"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>UrlPatternObject</a></li><li><a class="tsd-kind-icon" href="/api/core#BLOCKED_STATUS_CODES"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success)"></i>BLOCKED_STATUS_CODES</a></li><li><a class="tsd-kind-icon" href="/api/core#MAX_POOL_SIZE"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success)"></i>MAX_POOL_SIZE</a></li><li><a class="tsd-kind-icon" href="/api/core#PERSIST_STATE_KEY"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success)"></i>PERSIST_STATE_KEY</a></li><li><a class="tsd-kind-icon" href="/api/core#log"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success)"></i>log</a></li><li><a class="tsd-kind-icon" href="/api/core/function/checkStorageAccess"><i class="codicon codicon-symbol-function" style="color:var(--ifm-color-info)"></i>checkStorageAccess</a></li><li><a class="tsd-kind-icon" href="/api/core/function/enqueueLinks"><i class="codicon codicon-symbol-function" style="color:var(--ifm-color-info)"></i>enqueueLinks</a></li><li><a class="tsd-kind-icon" href="/api/core/function/filterRequestsByPatterns"><i class="codicon codicon-symbol-function" style="color:var(--ifm-color-info)"></i>filterRequestsByPatterns</a></li><li><a class="tsd-kind-icon" href="/api/core/function/processHttpRequestOptions"><i class="codicon codicon-symbol-function" style="color:var(--ifm-color-info)"></i>processHttpRequestOptions</a></li><li><a class="tsd-kind-icon" href="/api/core/function/purgeDefaultStorages"><i class="codicon codicon-symbol-function" style="color:var(--ifm-color-info)"></i>purgeDefaultStorages</a></li><li><a class="tsd-kind-icon" href="/api/core/function/tryAbsoluteURL"><i class="codicon codicon-symbol-function" style="color:var(--ifm-color-info)"></i>tryAbsoluteURL</a></li><li><a class="tsd-kind-icon" href="/api/core/function/useState"><i class="codicon codicon-symbol-function" style="color:var(--ifm-color-info)"></i>useState</a></li><li><a class="tsd-kind-icon" href="/api/core/function/withCheckedStorageAccess"><i class="codicon codicon-symbol-function" style="color:var(--ifm-color-info)"></i>withCheckedStorageAccess</a></li></ul></div></section></div></section></section><section class="tsd-panel-group tsd-member-group"><h2>Other<!-- --> <a href="#__CATEGORY__" class="tsd-anchor"><span class="tsd-anchor-id" id="__CATEGORY__"></span><i class="codicon codicon-symbol-numeric"></i></a></h2><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#RequestQueueV2" class="tsd-anchor"><span class="tsd-anchor-id" id="RequestQueueV2"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/storages/index.ts#L7" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>RequestQueueV2</h3><div class="tsd-panel-content">Renames and re-exports<!-- --> <a class="tsd-signature-type" href="/api/core/class/RequestQueue">RequestQueue</a></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#EventTypeName" class="tsd-anchor"><span class="tsd-anchor-id" id="EventTypeName"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/events/event_manager.ts#L16" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>EventTypeName</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>EventTypeName<span class="tsd-signature-symbol">: </span> <a class="tsd-signature-type" data-tsd-kind="8" href="/api/core/enum/EventType">EventType</a><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">systemInfo</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">persistState</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">migrating</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">aborting</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">exit</span></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#GetUserDataFromRequest" class="tsd-anchor"><span class="tsd-anchor-id" id="GetUserDataFromRequest"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/router.ts#L15" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>GetUserDataFromRequest</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>GetUserDataFromRequest<span class="tsd-generics"><span class="tsd-signature-symbol"><</span>T<span class="tsd-signature-symbol">></span></span><span class="tsd-signature-symbol">: </span> <span class="tsd-signature-type tsd-signature-type-generic">T</span><span class="tsd-signature-symbol"> extends </span><a class="tsd-signature-type" data-tsd-kind="128" href="/api/core/class/Request">Request</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-symbol">infer </span> <!-- -->Y<span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol"> ? </span><span class="tsd-signature-type">Y</span><span class="tsd-signature-symbol"> : </span><span class="tsd-signature-type">never</span></div></div><div class="tsd-panel-content"><div class="tds-type-parameters"><h4 class="tsd-type-parameters-title">Type parameters</h4><ul class="tsd-type-parameters"><li><strong>T</strong></li></ul></div></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#GlobInput" class="tsd-anchor"><span class="tsd-anchor-id" id="GlobInput"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/enqueue_links/shared.ts#L39" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>GlobInput</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>GlobInput<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><a class="tsd-signature-type" data-tsd-kind="2097152" href="/api/core#GlobObject">GlobObject</a></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#GlobObject" class="tsd-anchor"><span class="tsd-anchor-id" id="GlobObject"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/enqueue_links/shared.ts#L34" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>GlobObject</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>GlobObject<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-symbol">{ </span><span>glob<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> & </span><span class="tsd-signature-type">Pick</span><span class="tsd-signature-symbol"><</span><a class="tsd-signature-type" data-tsd-kind="256" href="/api/core/interface/RequestOptions">RequestOptions</a><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">method</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">payload</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">label</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">userData</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">headers</span><span class="tsd-signature-symbol">></span></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#LoadedRequest" class="tsd-anchor"><span class="tsd-anchor-id" id="LoadedRequest"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/crawlers/crawler_commons.ts#L21" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>LoadedRequest</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>LoadedRequest<span class="tsd-generics"><span class="tsd-signature-symbol"><</span>R<span class="tsd-signature-symbol">></span></span><span class="tsd-signature-symbol">: </span> <span class="tsd-signature-type">WithRequired</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type tsd-signature-type-generic">R</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">id</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">loadedUrl</span><span class="tsd-signature-symbol">></span></div></div><div class="tsd-panel-content"><div class="tds-type-parameters"><h4 class="tsd-type-parameters-title">Type parameters</h4><ul class="tsd-type-parameters"><li><strong>R</strong><span class="tsd-signature-symbol">:</span> <a class="tsd-signature-type" data-tsd-kind="128" href="/api/core/class/Request">Request</a></li></ul></div></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#PseudoUrlInput" class="tsd-anchor"><span class="tsd-anchor-id" id="PseudoUrlInput"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/enqueue_links/shared.ts#L32" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>PseudoUrlInput</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>PseudoUrlInput<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><a class="tsd-signature-type" data-tsd-kind="2097152" href="/api/core#PseudoUrlObject">PseudoUrlObject</a></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#PseudoUrlObject" class="tsd-anchor"><span class="tsd-anchor-id" id="PseudoUrlObject"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/enqueue_links/shared.ts#L27" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>PseudoUrlObject</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>PseudoUrlObject<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-symbol">{ </span><span>purl<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> & </span><span class="tsd-signature-type">Pick</span><span class="tsd-signature-symbol"><</span><a class="tsd-signature-type" data-tsd-kind="256" href="/api/core/interface/RequestOptions">RequestOptions</a><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">method</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">payload</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">label</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">userData</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">headers</span><span class="tsd-signature-symbol">></span></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#RedirectHandler" class="tsd-anchor"><span class="tsd-anchor-id" id="RedirectHandler"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/http_clients/base-http-client.ts#L171" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>RedirectHandler</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RedirectHandler<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-symbol">(</span><span>redirectResponse<span class="tsd-signature-symbol">: </span><a class="tsd-signature-type" data-tsd-kind="256" href="/api/core/interface/BaseHttpResponseData">BaseHttpResponseData</a></span><span class="tsd-signature-symbol">, </span><span>updatedRequest<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span><span>headers<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">SimpleHeaders</span></span><span class="tsd-signature-symbol">; </span><span>url<span class="tsd-signature-symbol">?<!-- -->: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">URL</span></span><span class="tsd-signature-symbol"> }</span></span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">void</span></div></div><div class="tsd-panel-content"><div class="tsd-comment tsd-typography"><div class="lead"><div class="tsd-markdown markdown"><p>Type of a function called when an HTTP redirect takes place. It is allowed to mutate the <code>updatedRequest</code> argument.</p></div></div></div><hr class="tsd-divider"><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-method" style="color:var(--ifm-color-info)"></i><span class="tsd-signature-symbol">(</span><span>redirectResponse<span class="tsd-signature-symbol">: </span><a class="tsd-signature-type" data-tsd-kind="256" href="/api/core/interface/BaseHttpResponseData">BaseHttpResponseData</a></span><span class="tsd-signature-symbol">, </span><span>updatedRequest<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">{ </span><span>headers<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">SimpleHeaders</span></span><span class="tsd-signature-symbol">; </span><span>url<span class="tsd-signature-symbol">?<!-- -->: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">URL</span></span><span class="tsd-signature-symbol"> }</span></span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5><span class="tsd-flag-group"></span>redirectResponse: <a class="tsd-signature-type" data-tsd-kind="256" href="/api/core/interface/BaseHttpResponseData">BaseHttpResponseData</a></h5></li><li><h5><span class="tsd-flag-group"></span>updatedRequest: <span class="tsd-signature-symbol">{ </span><span>headers<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">SimpleHeaders</span></span><span class="tsd-signature-symbol">; </span><span>url<span class="tsd-signature-symbol">?<!-- -->: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">URL</span></span><span class="tsd-signature-symbol"> }</span></h5></li><ul><li><h5><span class="tsd-flag-group"></span>headers: <span class="tsd-signature-type">SimpleHeaders</span></h5></li><li><h5><span class="tsd-flag-group"><span class="tsd-flag tsd-flag-optional">optional</span></span>url: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">URL</span></h5></li></ul></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></li></ul></div></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#RegExpInput" class="tsd-anchor"><span class="tsd-anchor-id" id="RegExpInput"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/enqueue_links/shared.ts#L46" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>RegExpInput</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RegExpInput<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-type">RegExp</span><span class="tsd-signature-symbol"> | </span><a class="tsd-signature-type" data-tsd-kind="2097152" href="/api/core#RegExpObject">RegExpObject</a></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#RegExpObject" class="tsd-anchor"><span class="tsd-anchor-id" id="RegExpObject"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/enqueue_links/shared.ts#L41" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>RegExpObject</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RegExpObject<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-symbol">{ </span><span>regexp<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">RegExp</span></span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> & </span><span class="tsd-signature-type">Pick</span><span class="tsd-signature-symbol"><</span><a class="tsd-signature-type" data-tsd-kind="256" href="/api/core/interface/RequestOptions">RequestOptions</a><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">method</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">payload</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">label</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">userData</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">headers</span><span class="tsd-signature-symbol">></span></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#RequestListSourcesFunction" class="tsd-anchor"><span class="tsd-anchor-id" id="RequestListSourcesFunction"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/storages/request_list.ts#L1006" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>RequestListSourcesFunction</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RequestListSourcesFunction<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">RequestListSource</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">></span></div></div><div class="tsd-panel-content"><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures"><li class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-method" style="color:var(--ifm-color-info)"></i><span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">RequestListSource</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">></span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">RequestListSource</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">></span></h4></li></ul></li></ul></div></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#RouterRoutes" class="tsd-anchor"><span class="tsd-anchor-id" id="RouterRoutes"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/router.ts#L17" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>RouterRoutes</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>RouterRoutes<span class="tsd-generics"><span class="tsd-signature-symbol"><</span>Context<span class="tsd-signature-symbol">, </span>UserData<span class="tsd-signature-symbol">></span></span><span class="tsd-signature-symbol">: </span> <span class="tsd-signature-symbol">{ </span><span class="tsd-signature-symbol">[ </span><span class="tsd-signature-type">label</span><span class="tsd-signature-symbol"> in </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">symbol</span><span class="tsd-signature-symbol"> ]</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span>ctx<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Omit</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type tsd-signature-type-generic">Context</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">request</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol"> & </span><span class="tsd-signature-symbol">{ </span><span>request<span class="tsd-signature-symbol">: </span><a class="tsd-signature-type" data-tsd-kind="128" href="/api/core/class/Request">Request</a><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type tsd-signature-type-generic">UserData</span><span class="tsd-signature-symbol">></span></span><span class="tsd-signature-symbol"> }</span></span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">Awaitable</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol"> }</span></div></div><div class="tsd-panel-content"><div class="tds-type-parameters"><h4 class="tsd-type-parameters-title">Type parameters</h4><ul class="tsd-type-parameters"><li><strong>Context</strong></li><li><strong>UserData</strong><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Dictionary</span></li></ul></div></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#Source" class="tsd-anchor"><span class="tsd-anchor-id" id="Source"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/request.ts#L539" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>Source</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>Source<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-symbol">(</span><span class="tsd-signature-type">Partial</span><span class="tsd-signature-symbol"><</span><a class="tsd-signature-type" data-tsd-kind="256" href="/api/core/interface/RequestOptions">RequestOptions</a><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol"> & </span><span class="tsd-signature-symbol">{ </span><span>regex<span class="tsd-signature-symbol">?<!-- -->: </span><span class="tsd-signature-type">RegExp</span></span><span class="tsd-signature-symbol">; </span><span>requestsFromUrl<span class="tsd-signature-symbol">?<!-- -->: </span><span class="tsd-signature-type">string</span></span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> | </span><a class="tsd-signature-type" data-tsd-kind="128" href="/api/core/class/Request">Request</a></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#UrlPatternObject" class="tsd-anchor"><span class="tsd-anchor-id" id="UrlPatternObject"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/enqueue_links/shared.ts#L22" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"></span>UrlPatternObject</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-parameter" style="color:inherit"></i>UrlPatternObject<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-symbol">{ </span><span>glob<span class="tsd-signature-symbol">?<!-- -->: </span><span class="tsd-signature-type">string</span></span><span class="tsd-signature-symbol">; </span><span>regexp<span class="tsd-signature-symbol">?<!-- -->: </span><span class="tsd-signature-type">RegExp</span></span><span class="tsd-signature-symbol"> }</span><span class="tsd-signature-symbol"> & </span><span class="tsd-signature-type">Pick</span><span class="tsd-signature-symbol"><</span><a class="tsd-signature-type" data-tsd-kind="256" href="/api/core/interface/RequestOptions">RequestOptions</a><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">method</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">payload</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">label</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">userData</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">headers</span><span class="tsd-signature-symbol">></span></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#BLOCKED_STATUS_CODES" class="tsd-anchor"><span class="tsd-anchor-id" id="BLOCKED_STATUS_CODES"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/session_pool/consts.ts#L1" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"><span class="tsd-flag tsd-flag-const">const</span></span>BLOCKED_STATUS_CODES</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success)"></i>BLOCKED_STATUS_CODES<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-type">number</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol tsd-signature-default-value"> = <!-- -->...</span></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#MAX_POOL_SIZE" class="tsd-anchor"><span class="tsd-anchor-id" id="MAX_POOL_SIZE"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/session_pool/consts.ts#L3" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"><span class="tsd-flag tsd-flag-const">const</span></span>MAX_POOL_SIZE</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success)"></i>MAX_POOL_SIZE<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-type">1000</span><span class="tsd-signature-symbol tsd-signature-default-value"> = <!-- -->1000</span></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#PERSIST_STATE_KEY" class="tsd-anchor"><span class="tsd-anchor-id" id="PERSIST_STATE_KEY"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://github.com/apify/crawlee/blob/master/packages/core/src/session_pool/consts.ts#L2" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"><span class="tsd-flag tsd-flag-const">const</span></span>PERSIST_STATE_KEY</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success)"></i>PERSIST_STATE_KEY<span class="tsd-signature-symbol">: </span> <span class="tsd-signature-type">SDK_SESSION_POOL_STATE</span><span class="tsd-signature-symbol tsd-signature-default-value"> = <!-- -->\'SDK_SESSION_POOL_STATE\'</span></div></div><div class="tsd-panel-content"></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-panel-header"><a href="#log" class="tsd-anchor"><span class="tsd-anchor-id" id="log"></span><i class="codicon codicon-symbol-numeric"></i></a><a class="tsd-anchor" href="https://undefined/apify/crawlee/blob/master/node_modules/@apify/log/src/index.d.ts#L252" rel="noreferrer" target="_blank"><i class="codicon codicon-file-code"></i></a><span class="tsd-flag-group"><span class="tsd-flag tsd-flag-external">external</span><span class="tsd-flag tsd-flag-const">const</span></span>log</h3><div class="tsd-panel-content"><div class="tsd-signature tsd-kind-icon"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success)"></i>log<span class="tsd-signature-symbol">: </span> <a class="tsd-signature-type" data-tsd-kind="128" href="/api/core/class/Log">Log</a></div></div><div class="tsd-panel-content"></div></section></section></div></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"></nav></div></div><div class="col col--3"><div class="tsd-api-options"><div><b>Page Options</b></div><label><input type="checkbox"><span>Hide Inherited</span></label><div></div></div><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#RequestQueueV2" class="table-of-contents__link toc-highlight"><i class="codicon codicon-references" style="color:var(--ifm-color-danger);"></i> RequestQueueV2</a></li><li><a href="#EventTypeName" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> EventTypeName</a></li><li><a href="#GetUserDataFromRequest" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> GetUserDataFromRequest</a></li><li><a href="#GlobInput" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> GlobInput</a></li><li><a href="#GlobObject" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> GlobObject</a></li><li><a href="#LoadedRequest" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> LoadedRequest</a></li><li><a href="#PseudoUrlInput" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> PseudoUrlInput</a></li><li><a href="#PseudoUrlObject" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> PseudoUrlObject</a></li><li><a href="#RedirectHandler" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> RedirectHandler</a></li><li><a href="#RegExpInput" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> RegExpInput</a></li><li><a href="#RegExpObject" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> RegExpObject</a></li><li><a href="#RequestListSourcesFunction" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> RequestListSourcesFunction</a></li><li><a href="#RouterRoutes" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> RouterRoutes</a></li><li><a href="#Source" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> Source</a></li><li><a href="#UrlPatternObject" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-parameter" style="color:inherit;"></i> UrlPatternObject</a></li><li><a href="#BLOCKED_STATUS_CODES" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success);"></i> BLOCKED_STATUS_CODES</a></li><li><a href="#MAX_POOL_SIZE" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success);"></i> MAX_POOL_SIZE</a></li><li><a href="#PERSIST_STATE_KEY" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success);"></i> PERSIST_STATE_KEY</a></li><li><a href="#log" class="table-of-contents__link toc-highlight"><i class="codicon codicon-symbol-variable" style="color:var(--ifm-color-success);"></i> log</a></li></ul></div></div></div></div></main></div></div></div></div><footer class="footer_J6tW light"><div class="container padding-horiz--lg"><div class="row"><div class="col col--5"><div class="row"><div class="col col--6"><div class="footerTitle_tbhc">Docs</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/guides">Guides</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/examples">Examples</a></li><li class="footer__item"><a class="footer__link-item" href="/api/core">API reference</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/upgrading/upgrading-to-v3">Upgrading to v3</a></li></ul></div><div class="col col--6"><div class="footerTitle_tbhc">Community</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/apify" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div><div class="col col--7"><div class="row"><div class="col col--3 col--offset-9"><div class="footerTitle_tbhc">More</div><ul class="clean-list"><li class="footer__item"><a href="https://apify.com/?__hstc=7591405.6a07528923a27f84c18da26fd68f19ee.1732041259575.1732041259575.1732041259575.1&__hssc=7591405.1.1732041259575&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="footer__link-item">Apify Platform<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://docusaurus.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Docusaurus<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div></div><div class="row padding-vert--md padding-top--lg"><div class="col padding-vert--md col--6"><div class="freeAndOpenSource_V9mY"><svg width="24" height="24" fill="none" viewBox="0 0 24 24" class="alignMiddle_ZeUO"><path fill="#B3B8D2" d="m23.85 21.426-1.78-2.91a.5.5 0 0 1-.07-.26v-4.13c0-1.78-1.71-3.07-3.52-4.45a.51.51 0 0 1-.2-.36.53.53 0 0 1 .14-.4 4.93 4.93 0 0 0 1.07-5.88 5.08 5.08 0 0 0-8.08-1.29l-1.06 1a.48.48 0 0 1-.67 0l-1.06-1a5.09 5.09 0 0 0-8.09 1.29 5 5 0 0 0 1 5.76l7.76 8a1.06 1.06 0 0 0 .77.32 1.08 1.08 0 0 0 .78-.32.64.64 0 0 0 .14-.66 3.8 3.8 0 0 1-.2-1.38 3.75 3.75 0 0 1 4.92-3.37.49.49 0 0 0 .51-.13l.15-.15a.5.5 0 0 1 .66-.05l.3.23c1.22.92 2.73 2.07 2.73 2.85v4.55a1 1 0 0 0 .15.53l2 3.26a1 1 0 1 0 1.7-1z"></path><path fill="#B3B8D2" d="M16.09 13.196a2.37 2.37 0 0 0-3.19 0 2.38 2.38 0 0 0-.18 3.39l1.63 1.77a.55.55 0 0 1 .13.34v1c0 1.3 1.52 2.59 2 2.95a.9.9 0 0 0 .54.19.88.88 0 0 0 .54-1.57 3.9 3.9 0 0 1-1.31-1.57v-1.57a.86.86 0 0 0-.23-.59l-2-2.18a.58.58 0 0 1-.17-.45.66.66 0 0 1 .21-.44.64.64 0 0 1 .85 0l2 1.86a.874.874 0 1 0 1.19-1.28z"></path></svg><span class="alignMiddle_ZeUO">Crawlee is free and open source</span></div></div><div class="col padding-vert--md col--6 text--right"><span class="builtBy_TvsZ"><span class="alignMiddle_ZeUO">Built by</span><a href="https://apify.com/?__hstc=7591405.6a07528923a27f84c18da26fd68f19ee.1732041259575.1732041259575.1732041259575.1&__hssc=7591405.1.1732041259575&__hsfp=317949576"><svg width="91" height="25" fill="none" viewBox="0 0 91 25" class="alignMiddle_ZeUO"><path fill="#97D700" d="M3.135 2.85A3.41 3.41 0 0 0 .227 6.699l2.016 14.398 8.483-19.304z"></path><path fill="#71C5E8" d="M23.604 14.847 22.811 3.78a3.414 3.414 0 0 0-3.64-3.154c-.077 0-.153.014-.228.025l-3.274.452 7.192 16.124c.54-.67.805-1.52.743-2.379"></path><path fill="#FF9013" d="M5.336 24.595c.58.066 1.169-.02 1.706-.248l12.35-5.211L13.514 5.97z"></path><path fill="#fff" d="M33.83 5.304h3.903l5.448 14.623h-3.494l-1.022-2.994h-5.877l-1.025 2.994h-3.384zm-.177 9.032h4.14l-2-5.994h-.086zM58.842 5.304h3.302v14.623h-3.302zM64.634 5.304h10.71v2.7h-7.4v4.101h5.962v2.632h-5.963v5.186h-3.309zM82.116 14.38l-5.498-9.076h3.748l3.428 6.016h.085l3.599-6.016H91l-5.56 9.054v5.569h-3.324zM51.75 5.304h-7.292v14.623h3.3v-4.634h3.993a4.995 4.995 0 1 0 0-9.99m-.364 7.417h-3.628V7.875h3.627a2.423 2.423 0 0 1 0 4.846"></path></svg></a></span></div></div></div></footer></div>\n<!-- Google Tag Manager (noscript) -->\n <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5P7MCS7" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript>\n <!-- End Google Tag Manager (noscript) -->\n<script id="hs-script-loader" text="" charset="" type="text/javascript" src="//js.hs-scripts.com/19497222.js"></script>\n<script type="text/javascript" id="" charset="">!function(d,g,e){d.TiktokAnalyticsObject=e;var a=d[e]=d[e]||[];a.methods="page track identify instances debug on off once ready alias group enableCookie disableCookie holdConsent revokeConsent grantConsent".split(" ");a.setAndDefer=function(b,c){b[c]=function(){b.push([c].concat(Array.prototype.slice.call(arguments,0)))}};for(d=0;d<a.methods.length;d++)a.setAndDefer(a,a.methods[d]);a.instance=function(b){b=a._i[b]||[];for(var c=0;c<a.methods.length;c++)a.setAndDefer(b,a.methods[c]);return b};a.load=\nfunction(b,c){var f="https://analytics.tiktok.com/i18n/pixel/events.js";a._i=a._i||{};a._i[b]=[];a._i[b]._u=f;a._t=a._t||{};a._t[b]=+new Date;a._o=a._o||{};a._o[b]=c||{};c=document.createElement("script");c.type="text/javascript";c.async=!0;c.src=f+"?sdkid\\x3d"+b+"\\x26lib\\x3d"+e;b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(c,b)};a.load("CQHNEL3C77U08RGLR00G");a.page()}(window,document,"ttq");</script>\n<iframe id="intercom-frame" style="position: absolute !important; opacity: 0 !important; width: 1px !important; height: 1px !important; top: 0 !important; left: 0 !important; border: none !important; display: block !important; z-index: -1 !important; pointer-events: none;" aria-hidden="true" tabindex="-1" title="Intercom"></iframe><img src="https://t.co/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=7a67d792-34ff-452c-a56b-0e7fc4aea993&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=43c5b8a7-ecbd-4f39-ae6f-010ddf0e1d72&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fapi%2Fcore&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;"><img src="https://analytics.twitter.com/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=7a67d792-34ff-452c-a56b-0e7fc4aea993&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=43c5b8a7-ecbd-4f39-ae6f-010ddf0e1d72&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fapi%2Fcore&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;">\n<div style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon932803236927"><img style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon736190518439" width="0" height="0" alt="" src="https://bat.bing.com/action/0?ti=187137944&tm=gtm002&Ver=2&mid=fd7697b3-3ed0-47a2-a98c-d0f7d4b7318a&bo=2&sid=e3566b30a6a411ef8c2ae743f1b50ca4&vid=e35684e0a6a411efa853a3de35a741ee&vids=1&msclkid=N&pi=0&lg=en-US&sw=1280&sh=720&sc=24&nwd=1&tl=Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&p=https%3A%2F%2Fcrawlee.dev%2Fapi%2Fcore&r=&lt=3845&evt=pageLoad&sv=1&asc=G&cdb=AQAQ&rn=641850"></div>\n<div class="go2933276541 go2369186930" id="hs-web-interactives-top-anchor"><div id="hs-interactives-modal-overlay" class="go1632949049"></div></div>\n<div class="go2933276541 go1348078617" id="hs-web-interactives-bottom-anchor"></div>\n<div id="hs-web-interactives-floating-container">\n <div id="hs-web-interactives-floating-top-left-anchor" class="go2417249464 go613305155">\n </div>\n <div id="hs-web-interactives-floating-top-right-anchor" class="go2417249464 go471583506">\n </div>\n <div id="hs-web-interactives-floating-bottom-left-anchor" class="go2417249464 go3921366393">\n </div>\n <div id="hs-web-interactives-floating-bottom-right-anchor" class="go2417249464 go3967842156">\n </div>\n</div>\n<iframe height="0" width="0" style="display: none; visibility: hidden;"></iframe><div class="intercom-lightweight-app"><style id="intercom-lightweight-app-style" type="text/css">\n @keyframes intercom-lightweight-app-launcher {\n from {\n opacity: 0;\n transform: scale(0.5);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes intercom-lightweight-app-gradient {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes intercom-lightweight-app-messenger {\n 0% {\n opacity: 0;\n transform: scale(0);\n }\n 40% {\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n }\n\n .intercom-lightweight-app {\n position: fixed;\n z-index: 2147483001;\n width: 0;\n height: 0;\n font-family: intercom-font, "Helvetica Neue", "Apple Color Emoji", Helvetica, Arial, sans-serif;\n }\n\n .intercom-lightweight-app-gradient {\n position: fixed;\n z-index: 2147483002;\n width: 500px;\n height: 500px;\n bottom: 0;\n right: 0;\n pointer-events: none;\n background: radial-gradient(\n ellipse at bottom right,\n rgba(29, 39, 54, 0.16) 0%,\n rgba(29, 39, 54, 0) 72%);\n animation: intercom-lightweight-app-gradient 200ms ease-out;\n }\n\n .intercom-lightweight-app-launcher {\n position: fixed;\n z-index: 2147483003;\n padding: 0 !important;\n margin: 0 !important;\n border: none;\n bottom: 20px;\n right: 20px;\n max-width: 48px;\n width: 48px;\n max-height: 48px;\n height: 48px;\n border-radius: 50%;\n background: #1480ff;\n cursor: pointer;\n box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.06), 0 2px 32px 0 rgba(0, 0, 0, 0.16);\n transition: transform 167ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n box-sizing: content-box;\n }\n\n\n .intercom-lightweight-app-launcher:hover {\n transition: transform 250ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n transform: scale(1.1)\n }\n\n .intercom-lightweight-app-launcher:active {\n transform: scale(0.85);\n transition: transform 134ms cubic-bezier(0.45, 0, 0.2, 1);\n }\n\n\n .intercom-lightweight-app-launcher:focus {\n outline: none;\n\n \n }\n\n .intercom-lightweight-app-launcher-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n left: 0;\n width: 48px;\n height: 48px;\n transition: transform 100ms linear, opacity 80ms linear;\n }\n\n .intercom-lightweight-app-launcher-icon-open {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-open svg {\n width: 24px;\n height: 24px;\n }\n\n .intercom-lightweight-app-launcher-icon-open svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg {\n height: 44px;\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-custom-icon-open {\n max-height: 24px;\n max-width: 24px;\n\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize {\n \n opacity: 0;\n transform: rotate(-60deg) scale(0);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-messenger {\n position: fixed;\n z-index: 2147483003;\n overflow: hidden;\n background-color: white;\n animation: intercom-lightweight-app-messenger 250ms cubic-bezier(0, 1, 1, 1);\n transform-origin: bottom right;\n\n \n width: 400px;\n height: calc(100% - 40px);\n max-height: 704px;\n min-height: 250px;\n right: 20px;\n bottom: 20px;\n box-shadow: 0 5px 40px rgba(0,0,0,0.16);\n \n\n border-radius: 16px;\n }\n\n .intercom-lightweight-app-messenger-header {\n height: 64px;\n border-bottom: none;\n background: #1480ff\n\n \n }\n\n .intercom-lightweight-app-messenger-footer{\n position:absolute;\n bottom:0;\n width: 100%;\n height: 80px;\n background: #fff;\n font-size: 14px;\n line-height: 21px;\n border-top: 1px solid rgba(0, 0, 0, 0.05);\n box-shadow: 0px 0px 25px rgba(0, 0, 0, 0.05);\n \n }\n\n @media print {\n .intercom-lightweight-app {\n display: none;\n }\n }\n</style></div></body></html>'}, {'url': 'https://crawlee.dev/api/core/changelog', 'title': 'Changelog | API | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-typedoc-api plugin-id-default api-version-3.12 docs-doc-page" data-has-hydrated="true" data-theme="light" data-announcement-bar-initially-dismissed="false" data-rh="lang,dir,class,data-has-hydrated"><head><meta charset="UTF-8"><meta name="generator" content="Docusaurus v3.6.0"><title>Changelog | API | Crawlee · Build reliable crawlers. Fast.</title><link data-rh="true" rel="icon" href="/img/favicon.ico"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Crawlee · Build reliable crawlers. Fast. RSS Feed"><link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Crawlee · Build reliable crawlers. Fast. Atom Feed"><link rel="search" type="application/opensearchdescription+xml" title="Crawlee · Build reliable crawlers. Fast." href="/opensearch.xml"><!-- Google Tag Manager --><script async="" src="https://www.clarity.ms/s/0.7.56/clarity.js"></script><script async="" src="https://www.clarity.ms/tag/uet/187137944"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://widget.intercom.io/widget/kod1r788"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/identify_45dd5971.js"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/main.MWQ3ODVjY2ZhNQ.js" data-id="CQHNEL3C77U08RGLR00G"></script><script src="https://js.hsadspixel.net/fb.js" type="text/javascript" id="hs-ads-pixel-19497222" data-ads-portal-id="19497222" data-ads-env="prod" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-banner.com/v2/19497222/banner.js" type="text/javascript" id="cookieBanner-19497222" data-cookieconsent="ignore" data-hs-ignore="true" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hubspot.com/web-interactives-embed.js" type="text/javascript" id="hubspot-web-interactives-loader" crossorigin="anonymous" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-analytics.net/analytics/1732041000000/19497222.js" type="text/javascript" id="hs-analytics"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=CQHNEL3C77U08RGLR00G&lib=ttq"></script><script type="text/javascript" async="" src="https://a.quora.com/qevents.js"></script><script type="text/javascript" async="" src="https://static.ads-twitter.com/uwt.js"></script><script type="text/javascript" async="" src="https://www.redditstatic.com/ads/pixel.js"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://bat.bing.com/bat.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-62P18XN9NS&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-1MGJDMV8DX&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-5P7MCS7"></script><script>!function(e,t,a,n,r){e[n]=e[n]||[],e[n].push({"gtm.start":new Date().getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id="+r+("dataLayer"!=n?"&l="+n:""),g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer","GTM-5P7MCS7")</script><!-- End Google Tag Manager --><script>window.intercomSettings={api_base:"https://api-iam.intercom.io",app_id:"kod1r788"},function(){var t=window,e=t.Intercom;if("function"==typeof e)e("reattach_activator"),e("update",t.intercomSettings);else{var n=document,a=function(){a.c(arguments)};a.q=[],a.c=function(t){a.q.push(t)},t.Intercom=a;var i=function(){var t=n.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://widget.intercom.io/widget/kod1r788";var e=n.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)};"complete"===document.readyState?i():t.attachEvent?t.attachEvent("onload",i):t.addEventListener("load",i,!1)}}()</script><script src="/js/custom.js"></script><link rel="stylesheet" href="/assets/css/styles.ac465ac2.css"><script src="/assets/js/main.a0f1a072.js" defer=""></script><script src="/assets/js/runtime~main.b70d65a1.js" defer=""></script><meta name="viewport" content="width=device-width, initial-scale=1.0" data-rh="true"><link rel="canonical" href="https://crawlee.dev/api/core/changelog" data-rh="true"><link rel="alternate" href="https://crawlee.dev/api/core/changelog" hreflang="en" data-rh="true"><link rel="alternate" href="https://crawlee.dev/api/core/changelog" hreflang="x-default" data-rh="true"><meta name="twitter:card" content="summary_large_image" data-rh="true"><meta property="og:image" content="https://crawlee.dev/img/crawlee-og.png" data-rh="true"><meta name="twitter:image" content="https://crawlee.dev/img/crawlee-og.png" data-rh="true"><meta property="og:url" content="https://crawlee.dev/api/core/changelog" data-rh="true"><meta property="og:locale" content="en" data-rh="true"><meta name="docusaurus_locale" content="en" data-rh="true"><meta name="docsearch:language" content="en" data-rh="true"><meta name="og:description" content="Crawlee helps you build and maintain your crawlers. It\'s open source, but built by developers who scrape millions of pages every day for a living." data-rh="true"><style id="_goober"> .go2933276541{position:fixed;display:block;width:100%;height:0px;margin:0px;padding:0px;overflow:visible;transform-style:preserve-3d;background:transparent;backface-visibility:hidden;pointer-events:none;left:0px;z-index:9998;}.go2369186930{top:0px;z-index:9999;height:100%;width:100%;}.go1348078617{bottom:0px;}.go2417249464{position:fixed;z-index:9989;}.go3921366393{left:0;bottom:0;}.go3967842156{right:0;bottom:0;}.go613305155{left:0;top:0;}.go471583506{right:0;top:0;}.go3670563033{position:relative;overflow:hidden;display:none;}.go1041095097{display:block;}.go1632949049{position:absolute;pointer-events:none;width:101vw;height:101vh;background:rgba(0,0,0,0.7);opacity:0;z-index:-1;}.go2512015367{z-index:99998;opacity:0.8;visibility:visible;pointer-events:all;cursor:pointer;}.go1432718904{overflow:hidden;}.go812842568{display:block !important;position:static !important;box-sizing:border-box !important;background:transparent !important;border:none;min-height:0px !important;max-height:none !important;margin:0px;padding:0px !important;height:100% !important;width:1px !important;max-width:100% !important;min-width:100% !important;}.go4194603687{z-index:99999;visibility:hidden;position:absolute;inset:50vh auto auto 50%;transform:translate(-50%,-50%);left:50%;top:150%;pointer-events:none;max-height:95%;max-width:95%;}.go4258295619{pointer-events:auto !important;visibility:visible;top:50%;transition:top 0.75s linear(0,0.006,0.023 2.2%,0.096 4.8%,0.532 15.4%,0.72 21%,0.793,0.853 26.7%,0.902,0.941,0.968 36.2%,0.987 39.7%,1 43.7%,1.007 48.3%,1.009 55.3%,1.002 78.2%,1 );}.go456419034{transition:opacity 0.3s ease-in;}.go3128134379{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transition:max-height 1s ease-in;}.go494047706{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;}.go2481764524{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;bottom:0px;}.go2685733372{visibility:hidden;}.go2985984737{visibility:visible !important;}.go3281949485{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transform:none !important;}.go3508454897{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;transition:transform 1s linear(0,0.006,0.022 2.3%,0.091 5.1%,0.18 7.6%,0.508 16.3%,0.607,0.691,0.762,0.822 28.4%,0.872,0.912 35.1%,0.944 38.9%,0.968 43%,0.985 47.6%,0.996 53.1%,1.001 58.4%,1.003 65.1%,1 );}.go988075951{z-index:9999;position:fixed;left:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go2699082514{z-index:9999;position:fixed;right:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1595992025{z-index:9999;position:fixed;left:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1222083472{z-index:9999;position:fixed;right:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go722322694{transition:none !important;}.go26732895{cursor:pointer;}.go2083580917{display:flex;justify-content:center;align-items:center;}</style><script async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971"></script><script src="https://bat.bing.com/p/action/187137944.js" type="text/javascript" async="" data-ueto="ueto_0b209803c4"></script><link rel="preconnect" href="https://5JC94MPMLY-dsn.algolia.net" crossorigin="anonymous" data-rh="true"><meta name="docusaurus_version" content="3.12" data-rh="true"><meta name="docusaurus_tag" content="docs-default-3.12" data-rh="true"><meta name="docsearch:version" content="3.12" data-rh="true"><meta name="docsearch:docusaurus_tag" content="docs-default-3.12" data-rh="true"><script type="text/javascript" async="" src="https://googleads.g.doubleclick.net/pagead/viewthroughconversion/695293971/?random=1732041265803&cv=11&fst=1732041265803&bg=ffffff&guid=ON&async=1&gtm=45be4be0v9178109438za200zb892235334&gcd=13t3t3t3t5l1&dma=0&tag_exp=101925629~102067555~102067808~102077855&u_w=1280&u_h=720&url=https%3A%2F%2Fcrawlee.dev%2Fapi%2Fcore%2Fchangelog&hn=www.googleadservices.com&frm=0&tiba=Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&did=dZTQ1Zm&gdid=dZTQ1Zm&npa=0&pscdl=noapi&auid=1557349439.1732041266&fdr=QA&data=event%3Dgtag.config&rfmt=3&fmt=4"></script><meta property="og:title" content="Changelog | API | Crawlee · Build reliable crawlers. Fast." data-rh="true"><meta name="description" content="3.12.0 (2024-11-04)" data-rh="true"><meta property="og:description" content="3.12.0 (2024-11-04)" data-rh="true"><link rel="prefetch" href="/assets/js/c4f5d8e4.e74add4a.js"><link rel="prefetch" href="/assets/js/a7456010.2748ec17.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/fc6fe3c2.ca6fce44.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/14eb3368.22117ead.js"><link rel="prefetch" href="/assets/js/08fa83af.1e79e271.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/b22f5575.2fd431df.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/e4ef868e.c59f73f6.js"><link rel="prefetch" href="/assets/js/3f1bdb35.f55b4b21.js"><link rel="prefetch" href="/assets/js/a6aa9e1f.e11bbbf9.js"><link rel="prefetch" href="/assets/js/36994c47.c3291bce.js"><link rel="prefetch" href="/assets/js/814f3328.14399cf4.js"><link rel="prefetch" href="/assets/js/31276798.d914003a.js"><link rel="prefetch" href="/assets/js/ce44969a.a238b80f.js"><link rel="prefetch" href="/assets/js/9e1c89b6.640fdf1b.js"><link rel="prefetch" href="/assets/js/4ade9265.6073ce08.js"><link rel="prefetch" href="/assets/js/a6ac7fdc.7dc1b603.js"><link rel="prefetch" href="/assets/js/664c1011.5a64a880.js"><link rel="prefetch" href="/assets/js/e882a74a.647051f2.js"><link rel="prefetch" href="/assets/js/a3a97bb2.39475c55.js"><link rel="prefetch" href="/assets/js/80f9a068.d1f1c454.js"><link rel="prefetch" href="/assets/js/81508318.b7a58153.js"><link rel="prefetch" href="/assets/js/c15d9823.d72be663.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/96f87a9f.b0b6733d.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/57011b7b.148fd9a9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/d3155f31.3eec6f0f.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/c0529609.f51001e8.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/8f6ea93a.edd9cdf2.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/c8f99523.561e2525.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/cbb212ae.ce308f04.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/8aa7d115.a3a167fc.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/982ff309.e75e88c2.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/487257bc.0b8c5e6a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/7d775580.2481b4d2.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/b2295425.e837d25a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/6efd86d1.623d4eb8.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/d236e252.54a15f9b.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/9b8b8eb2.7b81a51a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/96002354.33fb5ac1.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/b1cfc6a8.cb18a842.js"></head><body class="navigation-with-keyboard" data-rh="class" style="overflow: visible;"><div id="hs-web-interactives-top-push-anchor" class="go3670563033"></div><script>!function(){var t,e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t=null!==e?e:window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":(window.matchMedia("(prefers-color-scheme: light)").matches,"light"),document.documentElement.setAttribute("data-theme",t)}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">🎉️ <b><a href="https://crawlee.dev/python/">Crawlee for Python is open to early adopters!</a></b> 🥳️</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"></div><b class="navbar__title text--truncate">Crawlee</b></a><a class="navbar__item navbar__link" href="/docs/quick-start">Docs</a><a class="navbar__item navbar__link" href="/docs/examples">Examples</a><a class="navbar__item navbar__link" href="/api/core">API</a><a aria-current="page" class="navbar__item navbar__link changelog navbar__link--active" href="/api/core/changelog">Changelog</a><a class="navbar__item navbar__link" href="/blog">Blog</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Node.js</a><ul class="dropdown__menu"><li><a href="#" class="dropdown__link api-version-bound" rel="dofollow">Node.js</a></li><li><a href="https://crawlee.dev/python" rel="dofollow" class="dropdown__link">Python<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a class="navbar__link" aria-haspopup="true" aria-expanded="false" role="button" href="/docs/quick-start">3.12</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/next/quick-start">Next</a></li><li><a class="dropdown__link" href="/docs/quick-start">3.12</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.11/quick-start">3.11</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.10/quick-start">3.10</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.9/quick-start">3.9</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.8/quick-start">3.8</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.7/quick-start">3.7</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.6/quick-start">3.6</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.5/quick-start">3.5</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.4/quick-start">3.4</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.3/quick-start">3.3</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.2/quick-start">3.2</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.1/quick-start">3.1</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.0/quick-start">3.0</a></li><li><a href="https://sdk.apify.com/docs/guides/getting-started?__hstc=7591405.16082ab8013f181f2e08b1eb70b809bc.1732041264559.1732041264559.1732041264559.1&__hssc=7591405.1.1732041264559&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link">2.2<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://sdk.apify.com/docs/1.3.1/guides/getting-started?__hstc=7591405.16082ab8013f181f2e08b1eb70b809bc.1732041264559.1732041264559.1732041264559.1&__hssc=7591405.1.1732041264559&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link api-version-bound">1.3<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="toggle_MW0i colorModeToggle_x44X"><button class="clean-btn toggleButton_yw5v" type="button" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><span><svg viewBox="0 0 13 12" fill="none" width="14" height="14" class="lightToggleIcon_SFTY"><g clip-path="url(#clip0_833_8168)"><path d="M6.59998 8.49999C7.98069 8.49999 9.09998 7.3807 9.09998 5.99999C9.09998 4.61928 7.98069 3.49999 6.59998 3.49999C5.21926 3.49999 4.09998 4.61928 4.09998 5.99999C4.09998 7.3807 5.21926 8.49999 6.59998 8.49999Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 0.5V1.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 10.5V11.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 2.11L3.4199 2.82" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 9.17999L10.4899 9.88999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1.09998 6H2.09998" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.0999 6H12.0999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 9.88999L3.4199 9.17999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 2.82L10.4899 2.11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></g><defs><clipPath id="clip0_833_8168"><rect width="12" height="12" fill="white" transform="translate(0.599976)"></rect></clipPath></defs></svg><svg viewBox="0 0 13 12" width="14" height="14" class="darkToggleIcon_ekgs"><path d="M10.7001 6.39501C10.6215 7.24611 10.3021 8.05721 9.77927 8.7334C9.25646 9.40959 8.55189 9.92291 7.748 10.2133C6.9441 10.5036 6.07414 10.5591 5.2399 10.3731C4.40565 10.187 3.64164 9.76728 3.03726 9.1629C2.43287 8.55851 2.01312 7.7945 1.8271 6.96026C1.64108 6.12602 1.6965 5.25605 1.98688 4.45216C2.27725 3.64826 2.79056 2.94369 3.46675 2.42088C4.14294 1.89808 4.95404 1.57866 5.80515 1.50001C5.30685 2.17414 5.06707 3.00473 5.12941 3.84071C5.19175 4.6767 5.55208 5.46254 6.14485 6.05531C6.73762 6.64808 7.52346 7.0084 8.35944 7.07074C9.19542 7.13308 10.026 6.8933 10.7001 6.39501Z" stroke="currentColor" fill="transparent" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button></div><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="View on GitHub">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="Chat on Discord">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"><svg width="15" height="15" class="DocSearch-Control-Key-Icon"><path d="M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953" stroke-width="1.2" stroke="currentColor" fill="none" stroke-linecap="square"></path></svg></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="apiPage"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"><b>Crawlee</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role="button" aria-expanded="true">@crawlee/core</a></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/api/core">Overview</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Classes</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Enumerations</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Functions</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Interfaces</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">References</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Type Aliases</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false" tabindex="0">Variables</a></div></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/api/core/changelog">Changelog</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/cheerio</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/playwright</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/puppeteer</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/jsdom</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/linkedom</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/basic</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/http</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/browser</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/memory-storage</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/browser-pool</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/utils</a></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a href="#" class="menu__link menu__link--sublist menu__link--sublist-caret" role="button" aria-expanded="false">@crawlee/types</a></div></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col apiItemCol"><div class="apiItemContainer"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li class="breadcrumbs__item"><span class="breadcrumbs__link">@crawlee/core</span><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Changelog</span><meta itemprop="position" content="2"></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 3.12</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile apiTocMobile"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Changelog</h1></header><section class="tsd-readme"><p>All notable changes to this project will be documented in this file.\nSee <a href="https://conventionalcommits.org" target="_blank" rel="noopener noreferrer">Conventional Commits</a> for commit guidelines.</p>\n<header><h1><a href="https://github.com/apify/crawlee/compare/v3.11.5...v3.12.0" target="_blank" rel="noopener noreferrer">3.12.0</a> (2024-11-04)</h1></header>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes">Bug Fixes<a href="#bug-fixes" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> ensure correct column order in CSV export (<a href="https://github.com/apify/crawlee/issues/2734" target="_blank" rel="noopener noreferrer">#2734</a>) (<a href="https://github.com/apify/crawlee/commit/b66784f89f011c2f972d73ec9cd47235a0411d1c" target="_blank" rel="noopener noreferrer">b66784f</a>), closes <a href="https://github.com/apify/crawlee/issues/2718" target="_blank" rel="noopener noreferrer">#2718</a></li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features">Features<a href="#features" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>allow using other HTTP clients (<a href="https://github.com/apify/crawlee/issues/2661" target="_blank" rel="noopener noreferrer">#2661</a>) (<a href="https://github.com/apify/crawlee/commit/568c6556d79ce91654c8a715d1d1729d7d6ed8ef" target="_blank" rel="noopener noreferrer">568c655</a>), closes <a href="https://github.com/apify/crawlee/issues/2659" target="_blank" rel="noopener noreferrer">#2659</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3115-2024-10-04"><a href="https://github.com/apify/crawlee/compare/v3.11.4...v3.11.5" target="_blank" rel="noopener noreferrer">3.11.5</a> (2024-10-04)<a href="#3115-2024-10-04" class="hash-link" aria-label="Direct link to 3115-2024-10-04" title="Direct link to 3115-2024-10-04">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-1">Bug Fixes<a href="#bug-fixes-1" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><code>forefront</code> request fetching in RQv2 (<a href="https://github.com/apify/crawlee/issues/2689" target="_blank" rel="noopener noreferrer">#2689</a>) (<a href="https://github.com/apify/crawlee/commit/03951bdba8fb34f6bed00d1b68240ff7cd0bacbf" target="_blank" rel="noopener noreferrer">03951bd</a>), closes <a href="https://github.com/apify/crawlee/issues/2669" target="_blank" rel="noopener noreferrer">#2669</a></li>\n<li><strong>core:</strong> accept <code>UInt8Array</code> in <code>KVS.setValue()</code> (<a href="https://github.com/apify/crawlee/issues/2682" target="_blank" rel="noopener noreferrer">#2682</a>) (<a href="https://github.com/apify/crawlee/commit/8ef0e60ca6fb2f4ec1b0d1aec6dcd53fcfb398b3" target="_blank" rel="noopener noreferrer">8ef0e60</a>)</li>\n<li>decode special characters in proxy <code>username</code> and <code>password</code> (<a href="https://github.com/apify/crawlee/issues/2696" target="_blank" rel="noopener noreferrer">#2696</a>) (<a href="https://github.com/apify/crawlee/commit/0f0fcc594685a29472b407a7c39d48b21f24375a" target="_blank" rel="noopener noreferrer">0f0fcc5</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3114-2024-09-23"><a href="https://github.com/apify/crawlee/compare/v3.11.3...v3.11.4" target="_blank" rel="noopener noreferrer">3.11.4</a> (2024-09-23)<a href="#3114-2024-09-23" class="hash-link" aria-label="Direct link to 3114-2024-09-23" title="Direct link to 3114-2024-09-23">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-2">Bug Fixes<a href="#bug-fixes-2" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><code>SitemapRequestList.teardown()</code> doesn\'t break <code>persistState</code> calls (<a href="https://github.com/apify/crawlee/issues/2673" target="_blank" rel="noopener noreferrer">#2673</a>) (<a href="https://github.com/apify/crawlee/commit/fb2c5cdaa47e2d3a91ade726cfba3091917a0137" target="_blank" rel="noopener noreferrer">fb2c5cd</a>), closes <a href="https://github.com//github.com/apify/crawlee/blob/f3eb99d9fa9a7aa0ec1dcb9773e666a9ac14fb76/packages/core/src/storages/sitemap_request_list.ts/issues/L446" target="_blank" rel="noopener noreferrer">/github.com/apify/crawlee/blob/f3eb99d9fa9a7aa0ec1dcb9773e666a9ac14fb76/packages/core/src/storages/sitemap_request_list.ts#L446</a> <a href="https://github.com/apify/crawlee/issues/2672" target="_blank" rel="noopener noreferrer">#2672</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3113-2024-09-03"><a href="https://github.com/apify/crawlee/compare/v3.11.2...v3.11.3" target="_blank" rel="noopener noreferrer">3.11.3</a> (2024-09-03)<a href="#3113-2024-09-03" class="hash-link" aria-label="Direct link to 3113-2024-09-03" title="Direct link to 3113-2024-09-03">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-3">Bug Fixes<a href="#bug-fixes-3" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>RequestQueueV2:</strong> reset recently handled cache too if the queue is pending for too long (<a href="https://github.com/apify/crawlee/issues/2656" target="_blank" rel="noopener noreferrer">#2656</a>) (<a href="https://github.com/apify/crawlee/commit/51a69bc1f2084c4d7ef3b7bdab3695b77af29540" target="_blank" rel="noopener noreferrer">51a69bc</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3112-2024-08-28"><a href="https://github.com/apify/crawlee/compare/v3.11.1...v3.11.2" target="_blank" rel="noopener noreferrer">3.11.2</a> (2024-08-28)<a href="#3112-2024-08-28" class="hash-link" aria-label="Direct link to 3112-2024-08-28" title="Direct link to 3112-2024-08-28">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-4">Bug Fixes<a href="#bug-fixes-4" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>RequestQueueV2:</strong> remove <code>inProgress</code> cache, rely solely on locked states (<a href="https://github.com/apify/crawlee/issues/2601" target="_blank" rel="noopener noreferrer">#2601</a>) (<a href="https://github.com/apify/crawlee/commit/57fcb0804a9f1268039d1e2b246c515ceca7e405" target="_blank" rel="noopener noreferrer">57fcb08</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-1">Features<a href="#features-1" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><code>globs</code> & <code>regexps</code> for <code>SitemapRequestList</code> (<a href="https://github.com/apify/crawlee/issues/2631" target="_blank" rel="noopener noreferrer">#2631</a>) (<a href="https://github.com/apify/crawlee/commit/b5fd3a9e3f6b189b86c0fb89a37b66c08ff3fe5d" target="_blank" rel="noopener noreferrer">b5fd3a9</a>)</li>\n<li>resilient sitemap loading (<a href="https://github.com/apify/crawlee/issues/2619" target="_blank" rel="noopener noreferrer">#2619</a>) (<a href="https://github.com/apify/crawlee/commit/1dd76601e03de4541964116b3a77376e233ea22b" target="_blank" rel="noopener noreferrer">1dd7660</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3111-2024-07-24"><a href="https://github.com/apify/crawlee/compare/v3.11.0...v3.11.1" target="_blank" rel="noopener noreferrer">3.11.1</a> (2024-07-24)<a href="#3111-2024-07-24" class="hash-link" aria-label="Direct link to 3111-2024-07-24" title="Direct link to 3111-2024-07-24">\u200b</a></h2>\n<p><strong>Note:</strong> Version bump only for package @crawlee/core</p>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.10.5...v3.11.0" target="_blank" rel="noopener noreferrer">3.11.0</a> (2024-07-09)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-2">Features<a href="#features-2" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>Sitemap-based request list implementation (<a href="https://github.com/apify/crawlee/issues/2498" target="_blank" rel="noopener noreferrer">#2498</a>) (<a href="https://github.com/apify/crawlee/commit/7bf8f0bcd4cc81e02c7cc60e82dfe7a0cdd80938" target="_blank" rel="noopener noreferrer">7bf8f0b</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3105-2024-06-12"><a href="https://github.com/apify/crawlee/compare/v3.10.4...v3.10.5" target="_blank" rel="noopener noreferrer">3.10.5</a> (2024-06-12)<a href="#3105-2024-06-12" class="hash-link" aria-label="Direct link to 3105-2024-06-12" title="Direct link to 3105-2024-06-12">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-5">Bug Fixes<a href="#bug-fixes-5" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>mark <code>context.request.loadedUrl</code> and <code>id</code> as required inside the request handler (<a href="https://github.com/apify/crawlee/issues/2531" target="_blank" rel="noopener noreferrer">#2531</a>) (<a href="https://github.com/apify/crawlee/commit/2b546600691d84852a2f9ef42f273cecf818d66d" target="_blank" rel="noopener noreferrer">2b54660</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3104-2024-06-11"><a href="https://github.com/apify/crawlee/compare/v3.10.3...v3.10.4" target="_blank" rel="noopener noreferrer">3.10.4</a> (2024-06-11)<a href="#3104-2024-06-11" class="hash-link" aria-label="Direct link to 3104-2024-06-11" title="Direct link to 3104-2024-06-11">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-6">Bug Fixes<a href="#bug-fixes-6" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>add <code>waitForAllRequestsToBeAdded</code> option to <code>enqueueLinks</code> helper (<a href="https://github.com/apify/crawlee/commit/925546b31130076c2dec98a83a42d15c216589a0" target="_blank" rel="noopener noreferrer">925546b</a>), closes <a href="https://github.com/apify/crawlee/issues/2318" target="_blank" rel="noopener noreferrer">#2318</a></li>\n<li>respect <code>crawler.log</code> when creating child logger for <code>Statistics</code> (<a href="https://github.com/apify/crawlee/commit/0a0d75d40b5f78b329589535bbe3e0e84be76a7e" target="_blank" rel="noopener noreferrer">0a0d75d</a>), closes <a href="https://github.com/apify/crawlee/issues/2412" target="_blank" rel="noopener noreferrer">#2412</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3103-2024-06-07"><a href="https://github.com/apify/crawlee/compare/v3.10.2...v3.10.3" target="_blank" rel="noopener noreferrer">3.10.3</a> (2024-06-07)<a href="#3103-2024-06-07" class="hash-link" aria-label="Direct link to 3103-2024-06-07" title="Direct link to 3103-2024-06-07">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-7">Bug Fixes<a href="#bug-fixes-7" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>respect implicit router when no <code>requestHandler</code> is provided in <code>AdaptiveCrawler</code> (<a href="https://github.com/apify/crawlee/issues/2518" target="_blank" rel="noopener noreferrer">#2518</a>) (<a href="https://github.com/apify/crawlee/commit/31083aa27ddd51827f73c7ac4290379ec7a81283" target="_blank" rel="noopener noreferrer">31083aa</a>)</li>\n<li>revert the scaling steps back to 5% (<a href="https://github.com/apify/crawlee/commit/5bf32f855ad84037e68dd9053930fa7be4267cac" target="_blank" rel="noopener noreferrer">5bf32f8</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-3">Features<a href="#features-3" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>add <code>waitForSelector</code> context helper + <code>parseWithCheerio</code> in adaptive crawler (<a href="https://github.com/apify/crawlee/issues/2522" target="_blank" rel="noopener noreferrer">#2522</a>) (<a href="https://github.com/apify/crawlee/commit/6f88e738d43ab4774dc4ef3f78775a5d88728e0d" target="_blank" rel="noopener noreferrer">6f88e73</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3102-2024-06-03"><a href="https://github.com/apify/crawlee/compare/v3.10.1...v3.10.2" target="_blank" rel="noopener noreferrer">3.10.2</a> (2024-06-03)<a href="#3102-2024-06-03" class="hash-link" aria-label="Direct link to 3102-2024-06-03" title="Direct link to 3102-2024-06-03">\u200b</a></h2>\n<p><strong>Note:</strong> Version bump only for package @crawlee/core</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="3101-2024-05-23"><a href="https://github.com/apify/crawlee/compare/v3.10.0...v3.10.1" target="_blank" rel="noopener noreferrer">3.10.1</a> (2024-05-23)<a href="#3101-2024-05-23" class="hash-link" aria-label="Direct link to 3101-2024-05-23" title="Direct link to 3101-2024-05-23">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-8">Bug Fixes<a href="#bug-fixes-8" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>investigate and temp fix for possible 0-concurrency bug in RQv2 (<a href="https://github.com/apify/crawlee/issues/2494" target="_blank" rel="noopener noreferrer">#2494</a>) (<a href="https://github.com/apify/crawlee/commit/4ebe820573b269c2d0a6eff20cfd7787debc63c0" target="_blank" rel="noopener noreferrer">4ebe820</a>)</li>\n<li>provide URLs to the error snapshot (<a href="https://github.com/apify/crawlee/issues/2482" target="_blank" rel="noopener noreferrer">#2482</a>) (<a href="https://github.com/apify/crawlee/commit/7f64145308dfdb3909d4fcf945759a7d6344e2f5" target="_blank" rel="noopener noreferrer">7f64145</a>), closes <a href="https://github.com//github.com/apify/apify-sdk-js/blob/master/packages/apify/src/key_value_store.ts/issues/L25" target="_blank" rel="noopener noreferrer">/github.com/apify/apify-sdk-js/blob/master/packages/apify/src/key_value_store.ts#L25</a></li>\n</ul>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.9.2...v3.10.0" target="_blank" rel="noopener noreferrer">3.10.0</a> (2024-05-16)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-9">Bug Fixes<a href="#bug-fixes-9" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><code>EnqueueStrategy.All</code> erroring with links using unsupported protocols (<a href="https://github.com/apify/crawlee/issues/2389" target="_blank" rel="noopener noreferrer">#2389</a>) (<a href="https://github.com/apify/crawlee/commit/8db39080b7711ba3c27dff7fce1170ddb0ee3d05" target="_blank" rel="noopener noreferrer">8db3908</a>)</li>\n<li><strong>core:</strong> conversion between tough cookies and browser pool cookies (<a href="https://github.com/apify/crawlee/issues/2443" target="_blank" rel="noopener noreferrer">#2443</a>) (<a href="https://github.com/apify/crawlee/commit/74f73ab77a94ecd285d587b7b3532443deda07b4" target="_blank" rel="noopener noreferrer">74f73ab</a>)</li>\n<li><strong>core:</strong> fire local <code>SystemInfo</code> events every second (<a href="https://github.com/apify/crawlee/issues/2454" target="_blank" rel="noopener noreferrer">#2454</a>) (<a href="https://github.com/apify/crawlee/commit/1fa9a66388846505f84dcdea0393e7eaaebf84c3" target="_blank" rel="noopener noreferrer">1fa9a66</a>)</li>\n<li><strong>core:</strong> use createSessionFunction when loading Session from persisted state (<a href="https://github.com/apify/crawlee/issues/2444" target="_blank" rel="noopener noreferrer">#2444</a>) (<a href="https://github.com/apify/crawlee/commit/3c56b4ca1efe327138aeb32c39dfd9dd67b6aceb" target="_blank" rel="noopener noreferrer">3c56b4c</a>)</li>\n<li>double tier decrement in tiered proxy (<a href="https://github.com/apify/crawlee/issues/2468" target="_blank" rel="noopener noreferrer">#2468</a>) (<a href="https://github.com/apify/crawlee/commit/3a8204ba417936570ec5569dc4e4eceed79939c1" target="_blank" rel="noopener noreferrer">3a8204b</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-4">Features<a href="#features-4" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>implement ErrorSnapshotter for error context capture (<a href="https://github.com/apify/crawlee/issues/2332" target="_blank" rel="noopener noreferrer">#2332</a>) (<a href="https://github.com/apify/crawlee/commit/e861dfdb451ae32fb1e0c7749c6b59744654b303" target="_blank" rel="noopener noreferrer">e861dfd</a>), closes <a href="https://github.com/apify/crawlee/issues/2280" target="_blank" rel="noopener noreferrer">#2280</a></li>\n<li>make <code>RequestQueue</code> v2 the default queue, see more on <a href="https://blog.apify.com/new-apify-request-queue/?__hstc=7591405.16082ab8013f181f2e08b1eb70b809bc.1732041264559.1732041264559.1732041264559.1&__hssc=7591405.1.1732041264559&__hsfp=317949576" target="_blank" rel="noopener noreferrer">Apify blog</a> (<a href="https://github.com/apify/crawlee/issues/2390" target="_blank" rel="noopener noreferrer">#2390</a>) (<a href="https://github.com/apify/crawlee/commit/41ae8abec1da811ae0750ac2d298e77c1e3b7b55" target="_blank" rel="noopener noreferrer">41ae8ab</a>), closes <a href="https://github.com/apify/crawlee/issues/2388" target="_blank" rel="noopener noreferrer">#2388</a></li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="performance-improvements">Performance Improvements<a href="#performance-improvements" class="hash-link" aria-label="Direct link to Performance Improvements" title="Direct link to Performance Improvements">\u200b</a></h3>\n<ul>\n<li>improve scaling based on memory (<a href="https://github.com/apify/crawlee/issues/2459" target="_blank" rel="noopener noreferrer">#2459</a>) (<a href="https://github.com/apify/crawlee/commit/2d5d443da5fa701b21aec003d4d84797882bc175" target="_blank" rel="noopener noreferrer">2d5d443</a>)</li>\n<li>optimize <code>RequestList</code> memory footprint (<a href="https://github.com/apify/crawlee/issues/2466" target="_blank" rel="noopener noreferrer">#2466</a>) (<a href="https://github.com/apify/crawlee/commit/12210bd191b50c76ecca23ea18f3deda7b1517c6" target="_blank" rel="noopener noreferrer">12210bd</a>)</li>\n<li>optimize adding large amount of requests via <code>crawler.addRequests()</code> (<a href="https://github.com/apify/crawlee/issues/2456" target="_blank" rel="noopener noreferrer">#2456</a>) (<a href="https://github.com/apify/crawlee/commit/6da86a85d848cd1cf860a28e5f077b8b14cdb213" target="_blank" rel="noopener noreferrer">6da86a8</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="392-2024-04-17"><a href="https://github.com/apify/crawlee/compare/v3.9.1...v3.9.2" target="_blank" rel="noopener noreferrer">3.9.2</a> (2024-04-17)<a href="#392-2024-04-17" class="hash-link" aria-label="Direct link to 392-2024-04-17" title="Direct link to 392-2024-04-17">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-10">Bug Fixes<a href="#bug-fixes-10" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>break up growing stack in <code>AutoscaledPool.notify</code> (<a href="https://github.com/apify/crawlee/issues/2422" target="_blank" rel="noopener noreferrer">#2422</a>) (<a href="https://github.com/apify/crawlee/commit/6f2e6b0ccb404ae66be372e87d762eed67c053bb" target="_blank" rel="noopener noreferrer">6f2e6b0</a>), closes <a href="https://github.com/apify/crawlee/issues/2421" target="_blank" rel="noopener noreferrer">#2421</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="391-2024-04-11"><a href="https://github.com/apify/crawlee/compare/v3.9.0...v3.9.1" target="_blank" rel="noopener noreferrer">3.9.1</a> (2024-04-11)<a href="#391-2024-04-11" class="hash-link" aria-label="Direct link to 391-2024-04-11" title="Direct link to 391-2024-04-11">\u200b</a></h2>\n<p><strong>Note:</strong> Version bump only for package @crawlee/core</p>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.8.2...v3.9.0" target="_blank" rel="noopener noreferrer">3.9.0</a> (2024-04-10)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-11">Bug Fixes<a href="#bug-fixes-11" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>include actual key in error message of KVS\' <code>setValue</code> (<a href="https://github.com/apify/crawlee/issues/2411" target="_blank" rel="noopener noreferrer">#2411</a>) (<a href="https://github.com/apify/crawlee/commit/9089bf139b717fecc6e8220c65a4d389862bd073" target="_blank" rel="noopener noreferrer">9089bf1</a>)</li>\n<li>notify autoscaled pool about newly added requests (<a href="https://github.com/apify/crawlee/issues/2400" target="_blank" rel="noopener noreferrer">#2400</a>) (<a href="https://github.com/apify/crawlee/commit/a90177d5207794be1d6e401d746dd4c6e5961976" target="_blank" rel="noopener noreferrer">a90177d</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-5">Features<a href="#features-5" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><code>createAdaptivePlaywrightRouter</code> utility (<a href="https://github.com/apify/crawlee/issues/2415" target="_blank" rel="noopener noreferrer">#2415</a>) (<a href="https://github.com/apify/crawlee/commit/cee477814e4901d025c5376205ad884c2fe08e0e" target="_blank" rel="noopener noreferrer">cee4778</a>), closes <a href="https://github.com/apify/crawlee/issues/2407" target="_blank" rel="noopener noreferrer">#2407</a></li>\n<li><code>tieredProxyUrls</code> for ProxyConfiguration (<a href="https://github.com/apify/crawlee/issues/2348" target="_blank" rel="noopener noreferrer">#2348</a>) (<a href="https://github.com/apify/crawlee/commit/5408c7f60a5bf4dbdba92f2d7440e0946b94ea6e" target="_blank" rel="noopener noreferrer">5408c7f</a>)</li>\n<li>better <code>newUrlFunction</code> for ProxyConfiguration (<a href="https://github.com/apify/crawlee/issues/2392" target="_blank" rel="noopener noreferrer">#2392</a>) (<a href="https://github.com/apify/crawlee/commit/330598b348ad27bc7c73732294a14b655ccd3507" target="_blank" rel="noopener noreferrer">330598b</a>), closes <a href="https://github.com/apify/crawlee/issues/2348" target="_blank" rel="noopener noreferrer">#2348</a> <a href="https://github.com/apify/crawlee/issues/2065" target="_blank" rel="noopener noreferrer">#2065</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="382-2024-03-21"><a href="https://github.com/apify/crawlee/compare/v3.8.1...v3.8.2" target="_blank" rel="noopener noreferrer">3.8.2</a> (2024-03-21)<a href="#382-2024-03-21" class="hash-link" aria-label="Direct link to 382-2024-03-21" title="Direct link to 382-2024-03-21">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-12">Bug Fixes<a href="#bug-fixes-12" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> solve possible dead locks in <code>RequestQueueV2</code> (<a href="https://github.com/apify/crawlee/issues/2376" target="_blank" rel="noopener noreferrer">#2376</a>) (<a href="https://github.com/apify/crawlee/commit/ffba095c8a74075901268cc49d970af4271d7abf" target="_blank" rel="noopener noreferrer">ffba095</a>)</li>\n<li>use 0 (number) instead of false as default for sessionRotationCount (<a href="https://github.com/apify/crawlee/issues/2372" target="_blank" rel="noopener noreferrer">#2372</a>) (<a href="https://github.com/apify/crawlee/commit/667a3e7a2be31abb94adbdb6119c4a8f3a751d69" target="_blank" rel="noopener noreferrer">667a3e7</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-6">Features<a href="#features-6" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>implement global storage access checking and use it to prevent unwanted side effects in adaptive crawler (<a href="https://github.com/apify/crawlee/issues/2371" target="_blank" rel="noopener noreferrer">#2371</a>) (<a href="https://github.com/apify/crawlee/commit/fb3b7da402522ddff8c7394ac1253ba8aeac984c" target="_blank" rel="noopener noreferrer">fb3b7da</a>), closes <a href="https://github.com/apify/crawlee/issues/2364" target="_blank" rel="noopener noreferrer">#2364</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="381-2024-02-22"><a href="https://github.com/apify/crawlee/compare/v3.8.0...v3.8.1" target="_blank" rel="noopener noreferrer">3.8.1</a> (2024-02-22)<a href="#381-2024-02-22" class="hash-link" aria-label="Direct link to 381-2024-02-22" title="Direct link to 381-2024-02-22">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-13">Bug Fixes<a href="#bug-fixes-13" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>fix crawling context type in <code>router.addHandler()</code> (<a href="https://github.com/apify/crawlee/issues/2355" target="_blank" rel="noopener noreferrer">#2355</a>) (<a href="https://github.com/apify/crawlee/commit/d73c20240586aeeddaea99cd157771a01b61d917" target="_blank" rel="noopener noreferrer">d73c202</a>)</li>\n</ul>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.7.3...v3.8.0" target="_blank" rel="noopener noreferrer">3.8.0</a> (2024-02-21)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-14">Bug Fixes<a href="#bug-fixes-14" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><code>createRequests</code> works correctly with <code>exclude</code> (and nothing else) (<a href="https://github.com/apify/crawlee/issues/2321" target="_blank" rel="noopener noreferrer">#2321</a>) (<a href="https://github.com/apify/crawlee/commit/048db0964a57ac570320ad495425733128235491" target="_blank" rel="noopener noreferrer">048db09</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-7">Features<a href="#features-7" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><code>KeyValueStore.recordExists()</code> (<a href="https://github.com/apify/crawlee/issues/2339" target="_blank" rel="noopener noreferrer">#2339</a>) (<a href="https://github.com/apify/crawlee/commit/8507a65d1ad079f64c752a6ddb1d8fac9b494228" target="_blank" rel="noopener noreferrer">8507a65</a>)</li>\n<li>accessing crawler state, key-value store and named datasets via crawling context (<a href="https://github.com/apify/crawlee/issues/2283" target="_blank" rel="noopener noreferrer">#2283</a>) (<a href="https://github.com/apify/crawlee/commit/58dd5fcc25f31bb066402c46e48a9e5e91efd5c5" target="_blank" rel="noopener noreferrer">58dd5fc</a>)</li>\n<li>adaptive playwright crawler (<a href="https://github.com/apify/crawlee/issues/2316" target="_blank" rel="noopener noreferrer">#2316</a>) (<a href="https://github.com/apify/crawlee/commit/8e4218ada03cf485751def46f8c465b2d2a825c7" target="_blank" rel="noopener noreferrer">8e4218a</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="373-2024-01-30"><a href="https://github.com/apify/crawlee/compare/v3.7.2...v3.7.3" target="_blank" rel="noopener noreferrer">3.7.3</a> (2024-01-30)<a href="#373-2024-01-30" class="hash-link" aria-label="Direct link to 373-2024-01-30" title="Direct link to 373-2024-01-30">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-15">Bug Fixes<a href="#bug-fixes-15" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>enqueueLinks:</strong> filter out empty/nullish globs (<a href="https://github.com/apify/crawlee/issues/2286" target="_blank" rel="noopener noreferrer">#2286</a>) (<a href="https://github.com/apify/crawlee/commit/84319b39efb5a921d0d5ec785db0147ec47f1243" target="_blank" rel="noopener noreferrer">84319b3</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="372-2024-01-09"><a href="https://github.com/apify/crawlee/compare/v3.7.1...v3.7.2" target="_blank" rel="noopener noreferrer">3.7.2</a> (2024-01-09)<a href="#372-2024-01-09" class="hash-link" aria-label="Direct link to 372-2024-01-09" title="Direct link to 372-2024-01-09">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-16">Bug Fixes<a href="#bug-fixes-16" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>RequestQueue:</strong> always clear locks when a request is reclaimed (<a href="https://github.com/apify/crawlee/issues/2263" target="_blank" rel="noopener noreferrer">#2263</a>) (<a href="https://github.com/apify/crawlee/commit/0fafe290103655d450c61da78522491efde8a866" target="_blank" rel="noopener noreferrer">0fafe29</a>), closes <a href="https://github.com/apify/crawlee/issues/2262" target="_blank" rel="noopener noreferrer">#2262</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="371-2024-01-02"><a href="https://github.com/apify/crawlee/compare/v3.7.0...v3.7.1" target="_blank" rel="noopener noreferrer">3.7.1</a> (2024-01-02)<a href="#371-2024-01-02" class="hash-link" aria-label="Direct link to 371-2024-01-02" title="Direct link to 371-2024-01-02">\u200b</a></h2>\n<p><strong>Note:</strong> Version bump only for package @crawlee/core</p>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.6.2...v3.7.0" target="_blank" rel="noopener noreferrer">3.7.0</a> (2023-12-21)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-17">Bug Fixes<a href="#bug-fixes-17" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><code>retryOnBlocked</code> doesn\'t override the blocked HTTP codes (<a href="https://github.com/apify/crawlee/issues/2243" target="_blank" rel="noopener noreferrer">#2243</a>) (<a href="https://github.com/apify/crawlee/commit/81672c3d1db1dcdcffb868de5740addff82cf112" target="_blank" rel="noopener noreferrer">81672c3</a>)</li>\n<li>filter out empty globs (<a href="https://github.com/apify/crawlee/issues/2205" target="_blank" rel="noopener noreferrer">#2205</a>) (<a href="https://github.com/apify/crawlee/commit/41322ab32d7db7baf61638d00fd7eaec9e5330f1" target="_blank" rel="noopener noreferrer">41322ab</a>), closes <a href="https://github.com/apify/crawlee/issues/2200" target="_blank" rel="noopener noreferrer">#2200</a></li>\n<li>make SessionPool queue up getSession calls to prevent overruns (<a href="https://github.com/apify/crawlee/issues/2239" target="_blank" rel="noopener noreferrer">#2239</a>) (<a href="https://github.com/apify/crawlee/commit/0f5665c473371bff5a5d3abee3c3a9d23f2aeb23" target="_blank" rel="noopener noreferrer">0f5665c</a>), closes <a href="https://github.com/apify/crawlee/issues/1667" target="_blank" rel="noopener noreferrer">#1667</a></li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-8">Features<a href="#features-8" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>allow configuring crawler statistics (<a href="https://github.com/apify/crawlee/issues/2213" target="_blank" rel="noopener noreferrer">#2213</a>) (<a href="https://github.com/apify/crawlee/commit/9fd60e4036dce720c71f2d169a8eccbc4c813a96" target="_blank" rel="noopener noreferrer">9fd60e4</a>), closes <a href="https://github.com/apify/crawlee/issues/1789" target="_blank" rel="noopener noreferrer">#1789</a></li>\n<li>check enqueue link strategy post redirect (<a href="https://github.com/apify/crawlee/issues/2238" target="_blank" rel="noopener noreferrer">#2238</a>) (<a href="https://github.com/apify/crawlee/commit/3c5f9d6056158e042e12d75b2b1b21ef6c32e618" target="_blank" rel="noopener noreferrer">3c5f9d6</a>), closes <a href="https://github.com/apify/crawlee/issues/2173" target="_blank" rel="noopener noreferrer">#2173</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="362-2023-11-26"><a href="https://github.com/apify/crawlee/compare/v3.6.1...v3.6.2" target="_blank" rel="noopener noreferrer">3.6.2</a> (2023-11-26)<a href="#362-2023-11-26" class="hash-link" aria-label="Direct link to 362-2023-11-26" title="Direct link to 362-2023-11-26">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-18">Bug Fixes<a href="#bug-fixes-18" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>prevent race condition in KeyValueStore.getAutoSavedValue() (<a href="https://github.com/apify/crawlee/issues/2193" target="_blank" rel="noopener noreferrer">#2193</a>) (<a href="https://github.com/apify/crawlee/commit/e340e2b8764968d22a22bd67769676b9f2f1a2fb" target="_blank" rel="noopener noreferrer">e340e2b</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="361-2023-11-15"><a href="https://github.com/apify/crawlee/compare/v3.6.0...v3.6.1" target="_blank" rel="noopener noreferrer">3.6.1</a> (2023-11-15)<a href="#361-2023-11-15" class="hash-link" aria-label="Direct link to 361-2023-11-15" title="Direct link to 361-2023-11-15">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-19">Bug Fixes<a href="#bug-fixes-19" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>ts:</strong> specify type explicitly for logger (<a href="https://github.com/apify/crawlee/commit/aec355022eb13f2624eeba20aeeb42dc0ad8365c" target="_blank" rel="noopener noreferrer">aec3550</a>)</li>\n</ul>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.5.8...v3.6.0" target="_blank" rel="noopener noreferrer">3.6.0</a> (2023-11-15)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-20">Bug Fixes<a href="#bug-fixes-20" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>add <code>skipNavigation</code> option to <code>enqueueLinks</code> (<a href="https://github.com/apify/crawlee/issues/2153" target="_blank" rel="noopener noreferrer">#2153</a>) (<a href="https://github.com/apify/crawlee/commit/118515d2ba534b99be2f23436f6abe41d66a8e07" target="_blank" rel="noopener noreferrer">118515d</a>)</li>\n<li><strong>core:</strong> respect some advanced options for <code>RequestList.open()</code> + improve docs (<a href="https://github.com/apify/crawlee/issues/2158" target="_blank" rel="noopener noreferrer">#2158</a>) (<a href="https://github.com/apify/crawlee/commit/c5a1b07ad62957fbe2cf90938d1f27b1ca54534a" target="_blank" rel="noopener noreferrer">c5a1b07</a>)</li>\n<li>declare missing dependency on got-scraping in the core package (<a href="https://github.com/apify/crawlee/commit/cd2fd4d584c3c23ea4f74c9b2f363a55200594c9" target="_blank" rel="noopener noreferrer">cd2fd4d</a>)</li>\n<li>retry incorrect Content-Type when response has blocked status code (<a href="https://github.com/apify/crawlee/issues/2176" target="_blank" rel="noopener noreferrer">#2176</a>) (<a href="https://github.com/apify/crawlee/commit/b54fb8bb7bc3575195ee676d21e5feb8f898ef47" target="_blank" rel="noopener noreferrer">b54fb8b</a>), closes <a href="https://github.com/apify/crawlee/issues/1994" target="_blank" rel="noopener noreferrer">#1994</a></li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-9">Features<a href="#features-9" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> add <code>crawler.exportData()</code> helper (<a href="https://github.com/apify/crawlee/issues/2166" target="_blank" rel="noopener noreferrer">#2166</a>) (<a href="https://github.com/apify/crawlee/commit/c8c09a54a712689969ff1f6bddf70f12a2a22670" target="_blank" rel="noopener noreferrer">c8c09a5</a>)</li>\n<li>got-scraping v4 (<a href="https://github.com/apify/crawlee/issues/2110" target="_blank" rel="noopener noreferrer">#2110</a>) (<a href="https://github.com/apify/crawlee/commit/2f05ed22b203f688095300400bb0e6d03a03283c" target="_blank" rel="noopener noreferrer">2f05ed2</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="358-2023-10-17"><a href="https://github.com/apify/crawlee/compare/v3.5.7...v3.5.8" target="_blank" rel="noopener noreferrer">3.5.8</a> (2023-10-17)<a href="#358-2023-10-17" class="hash-link" aria-label="Direct link to 358-2023-10-17" title="Direct link to 358-2023-10-17">\u200b</a></h2>\n<p><strong>Note:</strong> Version bump only for package @crawlee/core</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="357-2023-10-05"><a href="https://github.com/apify/crawlee/compare/v3.5.6...v3.5.7" target="_blank" rel="noopener noreferrer">3.5.7</a> (2023-10-05)<a href="#357-2023-10-05" class="hash-link" aria-label="Direct link to 357-2023-10-05" title="Direct link to 357-2023-10-05">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-21">Bug Fixes<a href="#bug-fixes-21" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>RQ request count is consistent after migration (<a href="https://github.com/apify/crawlee/issues/2116" target="_blank" rel="noopener noreferrer">#2116</a>) (<a href="https://github.com/apify/crawlee/commit/9ab8c1874f52acc3f0337fdabd36321d0fb40b86" target="_blank" rel="noopener noreferrer">9ab8c18</a>), closes <a href="https://github.com/apify/crawlee/issues/1855" target="_blank" rel="noopener noreferrer">#1855</a> <a href="https://github.com/apify/crawlee/issues/1855" target="_blank" rel="noopener noreferrer">#1855</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="356-2023-10-04"><a href="https://github.com/apify/crawlee/compare/v3.5.5...v3.5.6" target="_blank" rel="noopener noreferrer">3.5.6</a> (2023-10-04)<a href="#356-2023-10-04" class="hash-link" aria-label="Direct link to 356-2023-10-04" title="Direct link to 356-2023-10-04">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-22">Bug Fixes<a href="#bug-fixes-22" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>types:</strong> re-export RequestQueueOptions as an alias to RequestProviderOptions (<a href="https://github.com/apify/crawlee/issues/2109" target="_blank" rel="noopener noreferrer">#2109</a>) (<a href="https://github.com/apify/crawlee/commit/0900f76742475c19a777733462e38c5a3a9b86b7" target="_blank" rel="noopener noreferrer">0900f76</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="355-2023-10-02"><a href="https://github.com/apify/crawlee/compare/v3.5.4...v3.5.5" target="_blank" rel="noopener noreferrer">3.5.5</a> (2023-10-02)<a href="#355-2023-10-02" class="hash-link" aria-label="Direct link to 355-2023-10-02" title="Direct link to 355-2023-10-02">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-23">Bug Fixes<a href="#bug-fixes-23" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>session pool leaks memory on multiple crawler runs (<a href="https://github.com/apify/crawlee/issues/2083" target="_blank" rel="noopener noreferrer">#2083</a>) (<a href="https://github.com/apify/crawlee/commit/b96582a200e25ec11124da1f7f84a2b16b64d133" target="_blank" rel="noopener noreferrer">b96582a</a>), closes <a href="https://github.com/apify/crawlee/issues/2074" target="_blank" rel="noopener noreferrer">#2074</a> <a href="https://github.com/apify/crawlee/issues/2031" target="_blank" rel="noopener noreferrer">#2031</a></li>\n<li><strong>types:</strong> make return type of RequestProvider.open and RequestQueue(v2).open strict and accurate (<a href="https://github.com/apify/crawlee/issues/2096" target="_blank" rel="noopener noreferrer">#2096</a>) (<a href="https://github.com/apify/crawlee/commit/dfaddb920d9772985e0b54e0ce029cc7d99b1efa" target="_blank" rel="noopener noreferrer">dfaddb9</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-10">Features<a href="#features-10" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>Request Queue v2 (<a href="https://github.com/apify/crawlee/issues/1975" target="_blank" rel="noopener noreferrer">#1975</a>) (<a href="https://github.com/apify/crawlee/commit/70a77ee15f984e9ae67cd584fc58ace7e55346db" target="_blank" rel="noopener noreferrer">70a77ee</a>), closes <a href="https://github.com/apify/crawlee/issues/1365" target="_blank" rel="noopener noreferrer">#1365</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="354-2023-09-11"><a href="https://github.com/apify/crawlee/compare/v3.5.3...v3.5.4" target="_blank" rel="noopener noreferrer">3.5.4</a> (2023-09-11)<a href="#354-2023-09-11" class="hash-link" aria-label="Direct link to 354-2023-09-11" title="Direct link to 354-2023-09-11">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-24">Bug Fixes<a href="#bug-fixes-24" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> allow explicit calls to <code>purgeDefaultStorage</code> to wipe the storage on each call (<a href="https://github.com/apify/crawlee/issues/2060" target="_blank" rel="noopener noreferrer">#2060</a>) (<a href="https://github.com/apify/crawlee/commit/4831f073e5639fdfb058588bc23c4b673be70929" target="_blank" rel="noopener noreferrer">4831f07</a>)</li>\n<li>various helpers opening KVS now respect Configuration (<a href="https://github.com/apify/crawlee/issues/2071" target="_blank" rel="noopener noreferrer">#2071</a>) (<a href="https://github.com/apify/crawlee/commit/59dbb164699774e5a6718e98d0a4e8f630f35323" target="_blank" rel="noopener noreferrer">59dbb16</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="353-2023-08-31"><a href="https://github.com/apify/crawlee/compare/v3.5.2...v3.5.3" target="_blank" rel="noopener noreferrer">3.5.3</a> (2023-08-31)<a href="#353-2023-08-31" class="hash-link" aria-label="Direct link to 353-2023-08-31" title="Direct link to 353-2023-08-31">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-25">Bug Fixes<a href="#bug-fixes-25" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>browser-pool:</strong> improve error handling when browser is not found (<a href="https://github.com/apify/crawlee/issues/2050" target="_blank" rel="noopener noreferrer">#2050</a>) (<a href="https://github.com/apify/crawlee/commit/282527f31bb366a4e52463212f652dcf6679b6c3" target="_blank" rel="noopener noreferrer">282527f</a>), closes <a href="https://github.com/apify/crawlee/issues/1459" target="_blank" rel="noopener noreferrer">#1459</a></li>\n<li>crawler instances with different StorageClients do not affect each other (<a href="https://github.com/apify/crawlee/issues/2056" target="_blank" rel="noopener noreferrer">#2056</a>) (<a href="https://github.com/apify/crawlee/commit/3f4c86352bdbad1c6a8dd10a2c49a1889ca206fa" target="_blank" rel="noopener noreferrer">3f4c863</a>)</li>\n<li>pin all internal dependencies (<a href="https://github.com/apify/crawlee/issues/2041" target="_blank" rel="noopener noreferrer">#2041</a>) (<a href="https://github.com/apify/crawlee/commit/d6f2b172d4a6776137c7893ca798d5b4a9408e79" target="_blank" rel="noopener noreferrer">d6f2b17</a>), closes <a href="https://github.com/apify/crawlee/issues/2040" target="_blank" rel="noopener noreferrer">#2040</a></li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-11">Features<a href="#features-11" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> add default dataset helpers to <code>BasicCrawler</code> (<a href="https://github.com/apify/crawlee/issues/2057" target="_blank" rel="noopener noreferrer">#2057</a>) (<a href="https://github.com/apify/crawlee/commit/e2a7544ddf775db023ca25553d21cb73484fcd8c" target="_blank" rel="noopener noreferrer">e2a7544</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="352-2023-08-21"><a href="https://github.com/apify/crawlee/compare/v3.5.1...v3.5.2" target="_blank" rel="noopener noreferrer">3.5.2</a> (2023-08-21)<a href="#352-2023-08-21" class="hash-link" aria-label="Direct link to 352-2023-08-21" title="Direct link to 352-2023-08-21">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-26">Bug Fixes<a href="#bug-fixes-26" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>make the <code>Request</code> constructor options typesafe (<a href="https://github.com/apify/crawlee/issues/2034" target="_blank" rel="noopener noreferrer">#2034</a>) (<a href="https://github.com/apify/crawlee/commit/75e7d6554a1875e80e5c54f3877bb6e3daf6cdd7" target="_blank" rel="noopener noreferrer">75e7d65</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="351-2023-08-16"><a href="https://github.com/apify/crawlee/compare/v3.5.0...v3.5.1" target="_blank" rel="noopener noreferrer">3.5.1</a> (2023-08-16)<a href="#351-2023-08-16" class="hash-link" aria-label="Direct link to 351-2023-08-16" title="Direct link to 351-2023-08-16">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-27">Bug Fixes<a href="#bug-fixes-27" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>add <code>Request.maxRetries</code> to the <code>RequestOptions</code> interface (<a href="https://github.com/apify/crawlee/issues/2024" target="_blank" rel="noopener noreferrer">#2024</a>) (<a href="https://github.com/apify/crawlee/commit/6433821a59538b1f1cb4f29addd83a259ddda74f" target="_blank" rel="noopener noreferrer">6433821</a>)</li>\n<li>log original error message on session rotation (<a href="https://github.com/apify/crawlee/issues/2022" target="_blank" rel="noopener noreferrer">#2022</a>) (<a href="https://github.com/apify/crawlee/commit/8a11ffbdaef6b2fe8603aac570c3038f84c2f203" target="_blank" rel="noopener noreferrer">8a11ffb</a>)</li>\n</ul>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.4.2...v3.5.0" target="_blank" rel="noopener noreferrer">3.5.0</a> (2023-07-31)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-28">Bug Fixes<a href="#bug-fixes-28" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> add requests from URL list (<code>requestsFromUrl</code>) to the queue in batches (<a href="https://github.com/apify/crawlee/commit/418fbf89d8680f8c460e37cfbf3e521f45770eb2" target="_blank" rel="noopener noreferrer">418fbf8</a>), closes <a href="https://github.com/apify/crawlee/issues/1995" target="_blank" rel="noopener noreferrer">#1995</a></li>\n<li><strong>core:</strong> support relative links in <code>enqueueLinks</code> explicitly provided via <code>urls</code> option (<a href="https://github.com/apify/crawlee/issues/2014" target="_blank" rel="noopener noreferrer">#2014</a>) (<a href="https://github.com/apify/crawlee/commit/cbd9d08065694b8c86e32c773875cecd41e5fcc9" target="_blank" rel="noopener noreferrer">cbd9d08</a>), closes <a href="https://github.com/apify/crawlee/issues/2005" target="_blank" rel="noopener noreferrer">#2005</a></li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-12">Features<a href="#features-12" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> use <code>RequestQueue.addBatchedRequests()</code> in <code>enqueueLinks</code> helper (<a href="https://github.com/apify/crawlee/commit/4d61ca934072f8bbb680c842d8b1c9a4452ee73a" target="_blank" rel="noopener noreferrer">4d61ca9</a>), closes <a href="https://github.com/apify/crawlee/issues/1995" target="_blank" rel="noopener noreferrer">#1995</a></li>\n<li>retire session on proxy error (<a href="https://github.com/apify/crawlee/issues/2002" target="_blank" rel="noopener noreferrer">#2002</a>) (<a href="https://github.com/apify/crawlee/commit/8c0928b24ceabefc454f8114ac30a27023709010" target="_blank" rel="noopener noreferrer">8c0928b</a>), closes <a href="https://github.com/apify/crawlee/issues/1912" target="_blank" rel="noopener noreferrer">#1912</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="342-2023-07-19"><a href="https://github.com/apify/crawlee/compare/v3.4.1...v3.4.2" target="_blank" rel="noopener noreferrer">3.4.2</a> (2023-07-19)<a href="#342-2023-07-19" class="hash-link" aria-label="Direct link to 342-2023-07-19" title="Direct link to 342-2023-07-19">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-13">Features<a href="#features-13" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> add <code>RequestQueue.addRequestsBatched()</code> that is non-blocking (<a href="https://github.com/apify/crawlee/issues/1996" target="_blank" rel="noopener noreferrer">#1996</a>) (<a href="https://github.com/apify/crawlee/commit/c85485d6ca2bb61cfebb24a2ad99e0b3ba5c069b" target="_blank" rel="noopener noreferrer">c85485d</a>), closes <a href="https://github.com/apify/crawlee/issues/1995" target="_blank" rel="noopener noreferrer">#1995</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="341-2023-07-13"><a href="https://github.com/apify/crawlee/compare/v3.4.0...v3.4.1" target="_blank" rel="noopener noreferrer">3.4.1</a> (2023-07-13)<a href="#341-2023-07-13" class="hash-link" aria-label="Direct link to 341-2023-07-13" title="Direct link to 341-2023-07-13">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-29">Bug Fixes<a href="#bug-fixes-29" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>http-crawler:</strong> replace <code>IncomingMessage</code> with <code>PlainResponse</code> for context\'s <code>response</code> (<a href="https://github.com/apify/crawlee/issues/1973" target="_blank" rel="noopener noreferrer">#1973</a>) (<a href="https://github.com/apify/crawlee/commit/2a1cc7f4f87f0b1c657759076a236a8f8d9b76ba" target="_blank" rel="noopener noreferrer">2a1cc7f</a>), closes <a href="https://github.com/apify/crawlee/issues/1964" target="_blank" rel="noopener noreferrer">#1964</a></li>\n</ul>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.3.3...v3.4.0" target="_blank" rel="noopener noreferrer">3.4.0</a> (2023-06-12)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-14">Features<a href="#features-14" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>add LinkeDOMCrawler (<a href="https://github.com/apify/crawlee/issues/1907" target="_blank" rel="noopener noreferrer">#1907</a>) (<a href="https://github.com/apify/crawlee/commit/1c69560fe7ef45097e6be1037b79a84eb9a06337" target="_blank" rel="noopener noreferrer">1c69560</a>), closes <a href="https://github.com//github.com/apify/crawlee/pull/1890/issues/issuecomment-1533271694" target="_blank" rel="noopener noreferrer">/github.com/apify/crawlee/pull/1890#issuecomment-1533271694</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="333-2023-05-31"><a href="https://github.com/apify/crawlee/compare/v3.3.2...v3.3.3" target="_blank" rel="noopener noreferrer">3.3.3</a> (2023-05-31)<a href="#333-2023-05-31" class="hash-link" aria-label="Direct link to 333-2023-05-31" title="Direct link to 333-2023-05-31">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-15">Features<a href="#features-15" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>add support for <code>requestsFromUrl</code> to <code>RequestQueue</code> (<a href="https://github.com/apify/crawlee/issues/1917" target="_blank" rel="noopener noreferrer">#1917</a>) (<a href="https://github.com/apify/crawlee/commit/7f2557cdbbdee177db7c5970ae5a4881b7bc9b35" target="_blank" rel="noopener noreferrer">7f2557c</a>)</li>\n<li><strong>core:</strong> add <code>Request.maxRetries</code> to allow overriding the <code>maxRequestRetries</code> (<a href="https://github.com/apify/crawlee/issues/1925" target="_blank" rel="noopener noreferrer">#1925</a>) (<a href="https://github.com/apify/crawlee/commit/c5592db0f8094de27c46ad993bea2c1ab1f61385" target="_blank" rel="noopener noreferrer">c5592db</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="332-2023-05-11"><a href="https://github.com/apify/crawlee/compare/v3.3.1...v3.3.2" target="_blank" rel="noopener noreferrer">3.3.2</a> (2023-05-11)<a href="#332-2023-05-11" class="hash-link" aria-label="Direct link to 332-2023-05-11" title="Direct link to 332-2023-05-11">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-30">Bug Fixes<a href="#bug-fixes-30" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>respect config object when creating <code>SessionPool</code> (<a href="https://github.com/apify/crawlee/issues/1881" target="_blank" rel="noopener noreferrer">#1881</a>) (<a href="https://github.com/apify/crawlee/commit/db069df80bc183c6b861c9ac82f1e278e57ea92b" target="_blank" rel="noopener noreferrer">db069df</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-16">Features<a href="#features-16" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>allow running single crawler instance multiple times (<a href="https://github.com/apify/crawlee/issues/1844" target="_blank" rel="noopener noreferrer">#1844</a>) (<a href="https://github.com/apify/crawlee/commit/9e6eb1e32f582a8837311aac12cc1d657432f3fa" target="_blank" rel="noopener noreferrer">9e6eb1e</a>), closes <a href="https://github.com/apify/crawlee/issues/765" target="_blank" rel="noopener noreferrer">#765</a></li>\n<li><strong>router:</strong> allow inline router definition (<a href="https://github.com/apify/crawlee/issues/1877" target="_blank" rel="noopener noreferrer">#1877</a>) (<a href="https://github.com/apify/crawlee/commit/2d241c9f88964ebd41a181069c378b6b7b5bf262" target="_blank" rel="noopener noreferrer">2d241c9</a>)</li>\n<li>support alternate storage clients when opening storages (<a href="https://github.com/apify/crawlee/issues/1901" target="_blank" rel="noopener noreferrer">#1901</a>) (<a href="https://github.com/apify/crawlee/commit/661e550dcf3609b75e2d7bc225c2f6914f45c93e" target="_blank" rel="noopener noreferrer">661e550</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="331-2023-04-11"><a href="https://github.com/apify/crawlee/compare/v3.3.0...v3.3.1" target="_blank" rel="noopener noreferrer">3.3.1</a> (2023-04-11)<a href="#331-2023-04-11" class="hash-link" aria-label="Direct link to 331-2023-04-11" title="Direct link to 331-2023-04-11">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-31">Bug Fixes<a href="#bug-fixes-31" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><strong>Storage:</strong> queue up opening storages to prevent issues in concurrent calls (<a href="https://github.com/apify/crawlee/issues/1865" target="_blank" rel="noopener noreferrer">#1865</a>) (<a href="https://github.com/apify/crawlee/commit/044c740101dd0acd2248dee3702aec769ce0c892" target="_blank" rel="noopener noreferrer">044c740</a>)</li>\n<li>try to detect stuck request queue and fix its state (<a href="https://github.com/apify/crawlee/issues/1837" target="_blank" rel="noopener noreferrer">#1837</a>) (<a href="https://github.com/apify/crawlee/commit/95a9f941836c020a3223fd309f11cff58bc50624" target="_blank" rel="noopener noreferrer">95a9f94</a>)</li>\n</ul>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.2.2...v3.3.0" target="_blank" rel="noopener noreferrer">3.3.0</a> (2023-03-09)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-32">Bug Fixes<a href="#bug-fixes-32" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>ignore invalid URLs in <code>enqueueLinks</code> in browser crawlers (<a href="https://github.com/apify/crawlee/issues/1803" target="_blank" rel="noopener noreferrer">#1803</a>) (<a href="https://github.com/apify/crawlee/commit/5ac336c5b83b212fd6281659b8ceee091e259ff1" target="_blank" rel="noopener noreferrer">5ac336c</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-17">Features<a href="#features-17" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><strong>core:</strong> add <code>exclude</code> option to <code>enqueueLinks</code> (<a href="https://github.com/apify/crawlee/issues/1786" target="_blank" rel="noopener noreferrer">#1786</a>) (<a href="https://github.com/apify/crawlee/commit/2e833dc4b0b82bb6741aa683f3fcba05244427df" target="_blank" rel="noopener noreferrer">2e833dc</a>), closes <a href="https://github.com/apify/crawlee/issues/1785" target="_blank" rel="noopener noreferrer">#1785</a></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="322-2023-02-08"><a href="https://github.com/apify/crawlee/compare/v3.2.1...v3.2.2" target="_blank" rel="noopener noreferrer">3.2.2</a> (2023-02-08)<a href="#322-2023-02-08" class="hash-link" aria-label="Direct link to 322-2023-02-08" title="Direct link to 322-2023-02-08">\u200b</a></h2>\n<p><strong>Note:</strong> Version bump only for package @crawlee/core</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="321-2023-02-07"><a href="https://github.com/apify/crawlee/compare/v3.2.0...v3.2.1" target="_blank" rel="noopener noreferrer">3.2.1</a> (2023-02-07)<a href="#321-2023-02-07" class="hash-link" aria-label="Direct link to 321-2023-02-07" title="Direct link to 321-2023-02-07">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-33">Bug Fixes<a href="#bug-fixes-33" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>add <code>QueueOperationInfo</code> export to the core package (<a href="https://github.com/apify/crawlee/commit/5ec6c24ba31c11c0ff4db49a6461f112a70071b3" target="_blank" rel="noopener noreferrer">5ec6c24</a>)</li>\n</ul>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.1.4...v3.2.0" target="_blank" rel="noopener noreferrer">3.2.0</a> (2023-02-07)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-34">Bug Fixes<a href="#bug-fixes-34" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>clone <code>request.userData</code> when creating new request object (<a href="https://github.com/apify/crawlee/issues/1728" target="_blank" rel="noopener noreferrer">#1728</a>) (<a href="https://github.com/apify/crawlee/commit/222ef59b646740ae46be011ea0bc3d11c51a553e" target="_blank" rel="noopener noreferrer">222ef59</a>), closes <a href="https://github.com/apify/crawlee/issues/1725" target="_blank" rel="noopener noreferrer">#1725</a></li>\n<li>declare missing dependency on <code>tslib</code> (<a href="https://github.com/apify/crawlee/commit/27e96c80c26e7fc31809a4b518d699573cb8c662" target="_blank" rel="noopener noreferrer">27e96c8</a>), closes <a href="https://github.com/apify/crawlee/issues/1747" target="_blank" rel="noopener noreferrer">#1747</a></li>\n<li>ensure CrawlingContext interface is inferred correctly in route handlers (<a href="https://github.com/apify/crawlee/commit/aa84633b1a2007c2e91bf012e944433b21243f2e" target="_blank" rel="noopener noreferrer">aa84633</a>)</li>\n<li><strong>utils:</strong> add missing dependency on <code>ow</code> (<a href="https://github.com/apify/crawlee/commit/bf0e03cc6ddc103c9337de5cd8dce9bc86c369a3" target="_blank" rel="noopener noreferrer">bf0e03c</a>), closes <a href="https://github.com/apify/crawlee/issues/1716" target="_blank" rel="noopener noreferrer">#1716</a></li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-18">Features<a href="#features-18" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><strong>enqueueLinks:</strong> add SameOrigin strategy and relax protocol matching for the other strategies (<a href="https://github.com/apify/crawlee/issues/1748" target="_blank" rel="noopener noreferrer">#1748</a>) (<a href="https://github.com/apify/crawlee/commit/4ba982a909a3c16004b24ef90c3da3ee4e075be0" target="_blank" rel="noopener noreferrer">4ba982a</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="313-2022-12-07"><a href="https://github.com/apify/crawlee/compare/v3.1.2...v3.1.3" target="_blank" rel="noopener noreferrer">3.1.3</a> (2022-12-07)<a href="#313-2022-12-07" class="hash-link" aria-label="Direct link to 313-2022-12-07" title="Direct link to 313-2022-12-07">\u200b</a></h2>\n<p><strong>Note:</strong> Version bump only for package @crawlee/core</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="312-2022-11-15"><a href="https://github.com/apify/crawlee/compare/v3.1.1...v3.1.2" target="_blank" rel="noopener noreferrer">3.1.2</a> (2022-11-15)<a href="#312-2022-11-15" class="hash-link" aria-label="Direct link to 312-2022-11-15" title="Direct link to 312-2022-11-15">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-35">Bug Fixes<a href="#bug-fixes-35" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>injectJQuery in context does not survive navs (<a href="https://github.com/apify/crawlee/issues/1661" target="_blank" rel="noopener noreferrer">#1661</a>) (<a href="https://github.com/apify/crawlee/commit/493a7cff569cb12cfd9aa5e0f4fcb9de686eb41f" target="_blank" rel="noopener noreferrer">493a7cf</a>)</li>\n<li>make router error message more helpful for undefined routes (<a href="https://github.com/apify/crawlee/issues/1678" target="_blank" rel="noopener noreferrer">#1678</a>) (<a href="https://github.com/apify/crawlee/commit/ab359d84f2ebdac69441ae84dcade1bca7714390" target="_blank" rel="noopener noreferrer">ab359d8</a>)</li>\n<li><strong>MemoryStorage:</strong> correctly respect the desc option (<a href="https://github.com/apify/crawlee/issues/1666" target="_blank" rel="noopener noreferrer">#1666</a>) (<a href="https://github.com/apify/crawlee/commit/b5f37f66a50b2d546eca24a699cf92cb683b7026" target="_blank" rel="noopener noreferrer">b5f37f6</a>)</li>\n<li>requestHandlerTimeout timing (<a href="https://github.com/apify/crawlee/issues/1660" target="_blank" rel="noopener noreferrer">#1660</a>) (<a href="https://github.com/apify/crawlee/commit/493ea0ce80e55ece5a8881a6aea6674918873b35" target="_blank" rel="noopener noreferrer">493ea0c</a>)</li>\n<li>shallow clone browserPoolOptions before normalization (<a href="https://github.com/apify/crawlee/issues/1665" target="_blank" rel="noopener noreferrer">#1665</a>) (<a href="https://github.com/apify/crawlee/commit/22467ca81ad9464d528495333f62a60f2ea0487c" target="_blank" rel="noopener noreferrer">22467ca</a>)</li>\n<li>support headfull mode in playwright js project template (<a href="https://github.com/apify/crawlee/commit/ea2e61bc3bfcc9a895a89ad6db415a398bd3b7db" target="_blank" rel="noopener noreferrer">ea2e61b</a>)</li>\n<li>support headfull mode in puppeteer js project template (<a href="https://github.com/apify/crawlee/commit/e6aceb81ed0762f25dde66ff94ccdf8c1a619f7d" target="_blank" rel="noopener noreferrer">e6aceb8</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-19">Features<a href="#features-19" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li><strong>jsdom-crawler:</strong> add runScripts option (<a href="https://github.com/apify/crawlee/issues/1668" target="_blank" rel="noopener noreferrer">#1668</a>) (<a href="https://github.com/apify/crawlee/commit/8ef90bc1c020ddee334dd9a9267f6b6298a27024" target="_blank" rel="noopener noreferrer">8ef90bc</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="311-2022-11-07"><a href="https://github.com/apify/crawlee/compare/v3.1.0...v3.1.1" target="_blank" rel="noopener noreferrer">3.1.1</a> (2022-11-07)<a href="#311-2022-11-07" class="hash-link" aria-label="Direct link to 311-2022-11-07" title="Direct link to 311-2022-11-07">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-36">Bug Fixes<a href="#bug-fixes-36" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li><code>utils.playwright.blockRequests</code> warning message (<a href="https://github.com/apify/crawlee/issues/1632" target="_blank" rel="noopener noreferrer">#1632</a>) (<a href="https://github.com/apify/crawlee/commit/76549eb250a39e961b7f567ad0610af136d1c79f" target="_blank" rel="noopener noreferrer">76549eb</a>)</li>\n<li>concurrency option override order (<a href="https://github.com/apify/crawlee/issues/1649" target="_blank" rel="noopener noreferrer">#1649</a>) (<a href="https://github.com/apify/crawlee/commit/7bbad0380cd6de3fdca79ba57e1fef1d22bd56f8" target="_blank" rel="noopener noreferrer">7bbad03</a>)</li>\n<li>handle non-error objects thrown gracefully (<a href="https://github.com/apify/crawlee/issues/1652" target="_blank" rel="noopener noreferrer">#1652</a>) (<a href="https://github.com/apify/crawlee/commit/c3a4e1a9b7d0b80a8e889bdcb394fc0be3905c6f" target="_blank" rel="noopener noreferrer">c3a4e1a</a>)</li>\n<li>mark session as bad on failed requests (<a href="https://github.com/apify/crawlee/issues/1647" target="_blank" rel="noopener noreferrer">#1647</a>) (<a href="https://github.com/apify/crawlee/commit/445ae4321816bc418a83c02fb52e64df96bfb0a9" target="_blank" rel="noopener noreferrer">445ae43</a>)</li>\n<li>support reloading of sessions with lots of retries (<a href="https://github.com/apify/crawlee/commit/ebc89d2d69d5a2da6eb4e37de59ea39daf81f8f8" target="_blank" rel="noopener noreferrer">ebc89d2</a>)</li>\n<li>fix type errors when <code>playwright</code> is not installed (<a href="https://github.com/apify/crawlee/issues/1637" target="_blank" rel="noopener noreferrer">#1637</a>) (<a href="https://github.com/apify/crawlee/commit/de9db0c2b24019d2e1dd43206dd7f149ecdc679a" target="_blank" rel="noopener noreferrer">de9db0c</a>)</li>\n<li>upgrade to <a href="mailto:puppeteer@19.x" target="_blank" rel="noopener noreferrer">puppeteer@19.x</a> (<a href="https://github.com/apify/crawlee/issues/1623" target="_blank" rel="noopener noreferrer">#1623</a>) (<a href="https://github.com/apify/crawlee/commit/ce36d6bd60c7adb113759126b3cb15ca222e94d0" target="_blank" rel="noopener noreferrer">ce36d6b</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-20">Features<a href="#features-20" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>add static <code>set</code> and <code>useStorageClient</code> shortcuts to <code>Configuration</code> (<a href="https://github.com/apify/crawlee/commit/2e66fa2fad84aee2dca08b386916b465a0c012a3" target="_blank" rel="noopener noreferrer">2e66fa2</a>)</li>\n<li>enable migration testing (<a href="https://github.com/apify/crawlee/issues/1583" target="_blank" rel="noopener noreferrer">#1583</a>) (<a href="https://github.com/apify/crawlee/commit/ee3a68fff1fcdf941c9a1d3734107635e9a12049" target="_blank" rel="noopener noreferrer">ee3a68f</a>)</li>\n<li><strong>playwright:</strong> disable animations when taking screenshots (<a href="https://github.com/apify/crawlee/issues/1601" target="_blank" rel="noopener noreferrer">#1601</a>) (<a href="https://github.com/apify/crawlee/commit/4e63034c7b87de405edbd84f9b1803aa101f5c78" target="_blank" rel="noopener noreferrer">4e63034</a>)</li>\n</ul>\n<h1><a href="https://github.com/apify/crawlee/compare/v3.0.4...v3.1.0" target="_blank" rel="noopener noreferrer">3.1.0</a> (2022-10-13)</h1>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-37">Bug Fixes<a href="#bug-fixes-37" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>add overload for <code>KeyValueStore.getValue</code> with defaultValue (<a href="https://github.com/apify/crawlee/issues/1541" target="_blank" rel="noopener noreferrer">#1541</a>) (<a href="https://github.com/apify/crawlee/commit/e3cb509cb433e72e058b08a323dc7564e858f547" target="_blank" rel="noopener noreferrer">e3cb509</a>)</li>\n<li>add retry attempts to methods in CLI (<a href="https://github.com/apify/crawlee/issues/1588" target="_blank" rel="noopener noreferrer">#1588</a>) (<a href="https://github.com/apify/crawlee/commit/9142e598de68cc86d82825823c87b82a52c7b305" target="_blank" rel="noopener noreferrer">9142e59</a>)</li>\n<li>allow <code>label</code> in <code>enqueueLinksByClickingElements</code> options (<a href="https://github.com/apify/crawlee/issues/1525" target="_blank" rel="noopener noreferrer">#1525</a>) (<a href="https://github.com/apify/crawlee/commit/18b7c25592eaaa4a9f97cacc6e7154528ce54bf6" target="_blank" rel="noopener noreferrer">18b7c25</a>)</li>\n<li><strong>basic-crawler:</strong> handle <code>request.noRetry</code> after <code>errorHandler</code> (<a href="https://github.com/apify/crawlee/issues/1542" target="_blank" rel="noopener noreferrer">#1542</a>) (<a href="https://github.com/apify/crawlee/commit/2a2040e13209aff5e64ee47194940182b686b3a7" target="_blank" rel="noopener noreferrer">2a2040e</a>)</li>\n<li>build storage classes by using <code>this</code> instead of the class (<a href="https://github.com/apify/crawlee/issues/1596" target="_blank" rel="noopener noreferrer">#1596</a>) (<a href="https://github.com/apify/crawlee/commit/2b14eb7240d10760518e047095766084a3d255e3" target="_blank" rel="noopener noreferrer">2b14eb7</a>)</li>\n<li>correct some typing exports (<a href="https://github.com/apify/crawlee/issues/1527" target="_blank" rel="noopener noreferrer">#1527</a>) (<a href="https://github.com/apify/crawlee/commit/4a136e59e128f0a80ad4a1b98b87449647f23f43" target="_blank" rel="noopener noreferrer">4a136e5</a>)</li>\n<li>do not hide stack trace of (retried) Type/Syntax/ReferenceErrors (<a href="https://github.com/apify/crawlee/commit/469b4b58f1c19699d05da84f5f09a95d682421f0" target="_blank" rel="noopener noreferrer">469b4b5</a>)</li>\n<li><strong>enqueueLinks:</strong> ensure the enqueue strategy is respected alongside user patterns (<a href="https://github.com/apify/crawlee/issues/1509" target="_blank" rel="noopener noreferrer">#1509</a>) (<a href="https://github.com/apify/crawlee/commit/2b0eeed3c5b0a69265f7d0567028e5707af4835b" target="_blank" rel="noopener noreferrer">2b0eeed</a>)</li>\n<li><strong>enqueueLinks:</strong> prevent useless request creations when filtering by user patterns (<a href="https://github.com/apify/crawlee/issues/1510" target="_blank" rel="noopener noreferrer">#1510</a>) (<a href="https://github.com/apify/crawlee/commit/cb8fe3664db1bd4cba9c2b2185e96bceddabb333" target="_blank" rel="noopener noreferrer">cb8fe36</a>)</li>\n<li>export <code>Cookie</code> from <code>crawlee</code> metapackage (<a href="https://github.com/apify/crawlee/commit/7b02cebc6920da9bd36d63802df0f7d6abec3887" target="_blank" rel="noopener noreferrer">7b02ceb</a>)</li>\n<li>handle redirect cookies (<a href="https://github.com/apify/crawlee/issues/1521" target="_blank" rel="noopener noreferrer">#1521</a>) (<a href="https://github.com/apify/crawlee/commit/2f7fc7cc1d27553d94a915667f0e6d2af599a80c" target="_blank" rel="noopener noreferrer">2f7fc7c</a>)</li>\n<li><strong>http-crawler:</strong> do not hang on POST without payload (<a href="https://github.com/apify/crawlee/issues/1546" target="_blank" rel="noopener noreferrer">#1546</a>) (<a href="https://github.com/apify/crawlee/commit/8c87390e0db1924f463019cc55dfc265b12db2a9" target="_blank" rel="noopener noreferrer">8c87390</a>)</li>\n<li>remove undeclared dependency on core package from puppeteer utils (<a href="https://github.com/apify/crawlee/commit/827ae60d6c77e8c7271408493c3750a67ef8a9b4" target="_blank" rel="noopener noreferrer">827ae60</a>)</li>\n<li>support TypeScript 4.8 (<a href="https://github.com/apify/crawlee/issues/1507" target="_blank" rel="noopener noreferrer">#1507</a>) (<a href="https://github.com/apify/crawlee/commit/4c3a5045931a7f270bf8eda8a6417466b32fc99b" target="_blank" rel="noopener noreferrer">4c3a504</a>)</li>\n<li>wait for persist state listeners to run when event manager closes (<a href="https://github.com/apify/crawlee/issues/1481" target="_blank" rel="noopener noreferrer">#1481</a>) (<a href="https://github.com/apify/crawlee/commit/aa550edf7e016497e8e0323e18b14bf32b416155" target="_blank" rel="noopener noreferrer">aa550ed</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-21">Features<a href="#features-21" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>add <code>Dataset.exportToValue</code> (<a href="https://github.com/apify/crawlee/issues/1553" target="_blank" rel="noopener noreferrer">#1553</a>) (<a href="https://github.com/apify/crawlee/commit/acc6344f0e52854b4c4c833dbf7aede2547c111e" target="_blank" rel="noopener noreferrer">acc6344</a>)</li>\n<li>add <code>Dataset.getData()</code> shortcut (<a href="https://github.com/apify/crawlee/commit/522ed6e209aea4aa8285ddbb336f027a36cfb6bc" target="_blank" rel="noopener noreferrer">522ed6e</a>)</li>\n<li>add <code>utils.downloadListOfUrls</code> to crawlee metapackage (<a href="https://github.com/apify/crawlee/commit/7b33b0a582a75758cfca53e3ed92d6d3e392b601" target="_blank" rel="noopener noreferrer">7b33b0a</a>)</li>\n<li>add <code>utils.parseOpenGraph()</code> (<a href="https://github.com/apify/crawlee/issues/1555" target="_blank" rel="noopener noreferrer">#1555</a>) (<a href="https://github.com/apify/crawlee/commit/059f85ebe577888d448b196f89d0f4ec1dff371e" target="_blank" rel="noopener noreferrer">059f85e</a>)</li>\n<li>add <code>utils.playwright.compileScript</code> (<a href="https://github.com/apify/crawlee/issues/1559" target="_blank" rel="noopener noreferrer">#1559</a>) (<a href="https://github.com/apify/crawlee/commit/2e141625f27aa58e2195ab37ed2e31691b58f4c0" target="_blank" rel="noopener noreferrer">2e14162</a>)</li>\n<li>add <code>utils.playwright.infiniteScroll</code> (<a href="https://github.com/apify/crawlee/issues/1543" target="_blank" rel="noopener noreferrer">#1543</a>) (<a href="https://github.com/apify/crawlee/commit/60c8289571f3b6bce908ef7d1636b59faebdbf87" target="_blank" rel="noopener noreferrer">60c8289</a>), closes <a href="https://github.com/apify/crawlee/issues/1528" target="_blank" rel="noopener noreferrer">#1528</a></li>\n<li>add <code>utils.playwright.saveSnapshot</code> (<a href="https://github.com/apify/crawlee/issues/1544" target="_blank" rel="noopener noreferrer">#1544</a>) (<a href="https://github.com/apify/crawlee/commit/a4ceef044f0c5afdfd964dd1163a260463a60f52" target="_blank" rel="noopener noreferrer">a4ceef0</a>)</li>\n<li>add global <code>useState</code> helper (<a href="https://github.com/apify/crawlee/issues/1551" target="_blank" rel="noopener noreferrer">#1551</a>) (<a href="https://github.com/apify/crawlee/commit/2b0317772a2bb0d29b73ff86719caf9db394d507" target="_blank" rel="noopener noreferrer">2b03177</a>)</li>\n<li>add static <code>Dataset.exportToValue</code> (<a href="https://github.com/apify/crawlee/issues/1564" target="_blank" rel="noopener noreferrer">#1564</a>) (<a href="https://github.com/apify/crawlee/commit/a7c17d434559785d66c1220d22ea79961bda2eec" target="_blank" rel="noopener noreferrer">a7c17d4</a>)</li>\n<li>allow disabling storage persistence (<a href="https://github.com/apify/crawlee/issues/1539" target="_blank" rel="noopener noreferrer">#1539</a>) (<a href="https://github.com/apify/crawlee/commit/f65e3c6a7e1efc02fac5f32046bb27da5a1c8e78" target="_blank" rel="noopener noreferrer">f65e3c6</a>)</li>\n<li>bump puppeteer support to 17.x (<a href="https://github.com/apify/crawlee/issues/1519" target="_blank" rel="noopener noreferrer">#1519</a>) (<a href="https://github.com/apify/crawlee/commit/b97a85282b64cfb6d48b0aa71f5cc79525a80295" target="_blank" rel="noopener noreferrer">b97a852</a>)</li>\n<li><strong>core:</strong> add <code>forefront</code> option to <code>enqueueLinks</code> helper (<a href="https://github.com/apify/crawlee/commit/f8755b633212138671a76a8d5e0af17c12d46e10" target="_blank" rel="noopener noreferrer">f8755b6</a>), closes <a href="https://github.com/apify/crawlee/issues/1595" target="_blank" rel="noopener noreferrer">#1595</a></li>\n<li>don\'t close page before calling errorHandler (<a href="https://github.com/apify/crawlee/issues/1548" target="_blank" rel="noopener noreferrer">#1548</a>) (<a href="https://github.com/apify/crawlee/commit/1c8cd82611e93e4991b49b8ba2f1842457875680" target="_blank" rel="noopener noreferrer">1c8cd82</a>)</li>\n<li>enqueue links by clicking for Playwright (<a href="https://github.com/apify/crawlee/issues/1545" target="_blank" rel="noopener noreferrer">#1545</a>) (<a href="https://github.com/apify/crawlee/commit/3d25adefa7570433a9fa636941684bc2701b8ddd" target="_blank" rel="noopener noreferrer">3d25ade</a>)</li>\n<li>error tracker (<a href="https://github.com/apify/crawlee/issues/1467" target="_blank" rel="noopener noreferrer">#1467</a>) (<a href="https://github.com/apify/crawlee/commit/6bfe1ce0161f1e26f97e2b8e5c02ec9ca608fe30" target="_blank" rel="noopener noreferrer">6bfe1ce</a>)</li>\n<li>make the CLI download directly from GitHub (<a href="https://github.com/apify/crawlee/issues/1540" target="_blank" rel="noopener noreferrer">#1540</a>) (<a href="https://github.com/apify/crawlee/commit/3ff398a2f114760d33c43b5bc0c2447e2e48a72e" target="_blank" rel="noopener noreferrer">3ff398a</a>)</li>\n<li><strong>router:</strong> add userdata generic to addHandler (<a href="https://github.com/apify/crawlee/issues/1547" target="_blank" rel="noopener noreferrer">#1547</a>) (<a href="https://github.com/apify/crawlee/commit/19cdf1380abdf9aa8f337a96a4666f8f650bad69" target="_blank" rel="noopener noreferrer">19cdf13</a>)</li>\n<li>use JSON5 for <code>INPUT.json</code> to support comments (<a href="https://github.com/apify/crawlee/issues/1538" target="_blank" rel="noopener noreferrer">#1538</a>) (<a href="https://github.com/apify/crawlee/commit/09133ffa744436b60fc452b4f97caf1a18ebfced" target="_blank" rel="noopener noreferrer">09133ff</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="304-2022-08-22"><a href="https://github.com/apify/crawlee/compare/v3.0.3...v3.0.4" target="_blank" rel="noopener noreferrer">3.0.4</a> (2022-08-22)<a href="#304-2022-08-22" class="hash-link" aria-label="Direct link to 304-2022-08-22" title="Direct link to 304-2022-08-22">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-22">Features<a href="#features-22" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>bump puppeteer support to 15.1</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="bug-fixes-38">Bug Fixes<a href="#bug-fixes-38" class="hash-link" aria-label="Direct link to Bug Fixes" title="Direct link to Bug Fixes">\u200b</a></h3>\n<ul>\n<li>key value stores emitting an error when multiple write promises ran in parallel (<a href="https://github.com/apify/crawlee/issues/1460" target="_blank" rel="noopener noreferrer">#1460</a>) (<a href="https://github.com/apify/crawlee/commit/f201cca4a99d1c8b3e87be0289d5b3b363048f09" target="_blank" rel="noopener noreferrer">f201cca</a>)</li>\n<li>fix dockerfiles in project templates</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="303-2022-08-11"><a href="https://github.com/apify/crawlee/compare/v3.0.2...v3.0.3" target="_blank" rel="noopener noreferrer">3.0.3</a> (2022-08-11)<a href="#303-2022-08-11" class="hash-link" aria-label="Direct link to 303-2022-08-11" title="Direct link to 303-2022-08-11">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="fixes">Fixes<a href="#fixes" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes">\u200b</a></h3>\n<ul>\n<li>add missing configuration to CheerioCrawler constructor (<a href="https://github.com/apify/crawlee/pull/1432" target="_blank" rel="noopener noreferrer">#1432</a>)</li>\n<li>sendRequest types (<a href="https://github.com/apify/crawlee/pull/1445" target="_blank" rel="noopener noreferrer">#1445</a>)</li>\n<li>respect <code>headless</code> option in browser crawlers (<a href="https://github.com/apify/crawlee/pull/1455" target="_blank" rel="noopener noreferrer">#1455</a>)</li>\n<li>make <code>CheerioCrawlerOptions</code> type more loose (<a href="https://github.com/apify/crawlee/commit/d871d8caf22bc8d8ca1041e4975f3c95eae4b487" target="_blank" rel="noopener noreferrer">d871d8c</a>)</li>\n<li>improve dockerfiles and project templates (<a href="https://github.com/apify/crawlee/commit/7c21a646360d10453f17380f9882ac52d06fedb6" target="_blank" rel="noopener noreferrer">7c21a64</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-23">Features<a href="#features-23" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>add <code>utils.playwright.blockRequests()</code> (<a href="https://github.com/apify/crawlee/pull/1447" target="_blank" rel="noopener noreferrer">#1447</a>)</li>\n<li>http-crawler (<a href="https://github.com/apify/crawlee/pull/1440" target="_blank" rel="noopener noreferrer">#1440</a>)</li>\n<li>prefer <code>/INPUT.json</code> files for <code>KeyValueStore.getInput()</code> (<a href="https://github.com/apify/crawlee/pull/1453" target="_blank" rel="noopener noreferrer">#1453</a>)</li>\n<li>jsdom-crawler (<a href="https://github.com/apify/crawlee/pull/1451" target="_blank" rel="noopener noreferrer">#1451</a>)</li>\n<li>add <code>RetryRequestError</code> + add error to the context for BC (<a href="https://github.com/apify/crawlee/pull/1443" target="_blank" rel="noopener noreferrer">#1443</a>)</li>\n<li>add <code>keepAlive</code> to crawler options (<a href="https://github.com/apify/crawlee/pull/1452" target="_blank" rel="noopener noreferrer">#1452</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="302-2022-07-28"><a href="https://github.com/apify/crawlee/compare/v3.0.1...v3.0.2" target="_blank" rel="noopener noreferrer">3.0.2</a> (2022-07-28)<a href="#302-2022-07-28" class="hash-link" aria-label="Direct link to 302-2022-07-28" title="Direct link to 302-2022-07-28">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="fixes-1">Fixes<a href="#fixes-1" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes">\u200b</a></h3>\n<ul>\n<li>regression in resolving the base url for enqueue link filtering (<a href="https://github.com/apify/crawlee/pull/1422" target="_blank" rel="noopener noreferrer">1422</a>)</li>\n<li>improve file saving on memory storage (<a href="https://github.com/apify/crawlee/pull/1421" target="_blank" rel="noopener noreferrer">1421</a>)</li>\n<li>add <code>UserData</code> type argument to <code>CheerioCrawlingContext</code> and related interfaces (<a href="https://github.com/apify/crawlee/pull/1424" target="_blank" rel="noopener noreferrer">1424</a>)</li>\n<li>always limit <code>desiredConcurrency</code> to the value of <code>maxConcurrency</code> (<a href="https://github.com/apify/crawlee/commit/bcb689d4cb90835136295d879e710969ebaf29fa" target="_blank" rel="noopener noreferrer">bcb689d</a>)</li>\n<li>wait for storage to finish before resolving <code>crawler.run()</code> (<a href="https://github.com/apify/crawlee/commit/9d62d565c2ff8d058164c22333b07b7d2bf79ee0" target="_blank" rel="noopener noreferrer">9d62d56</a>)</li>\n<li>using explicitly typed router with <code>CheerioCrawler</code> (<a href="https://github.com/apify/crawlee/commit/07b7e69e1a7b7c89b8a5538279eb6de8be0effde" target="_blank" rel="noopener noreferrer">07b7e69</a>)</li>\n<li>declare dependency on <code>ow</code> in <code>@crawlee/cheerio</code> package (<a href="https://github.com/apify/crawlee/commit/be59f992d2897ce5c02349bbcc62472d99bb2718" target="_blank" rel="noopener noreferrer">be59f99</a>)</li>\n<li>use <code>crawlee@^3.0.0</code> in the CLI templates (<a href="https://github.com/apify/crawlee/commit/6426f22ce53fcce91b1d8686577557bae09fc0e9" target="_blank" rel="noopener noreferrer">6426f22</a>)</li>\n<li>fix building projects with TS when puppeteer and playwright are not installed (<a href="https://github.com/apify/crawlee/pull/1404" target="_blank" rel="noopener noreferrer">1404</a>)</li>\n<li>enqueueLinks should respect full URL of the current request for relative link resolution (<a href="https://github.com/apify/crawlee/pull/1427" target="_blank" rel="noopener noreferrer">1427</a>)</li>\n<li>use <code>desiredConcurrency: 10</code> as the default for <code>CheerioCrawler</code> (<a href="https://github.com/apify/crawlee/pull/1428" target="_blank" rel="noopener noreferrer">1428</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-24">Features<a href="#features-24" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>feat: allow configuring what status codes will cause session retirement (<a href="https://github.com/apify/crawlee/pull/1423" target="_blank" rel="noopener noreferrer">1423</a>)</li>\n<li>feat: add support for middlewares to the <code>Router</code> via <code>use</code> method (<a href="https://github.com/apify/crawlee/pull/1431" target="_blank" rel="noopener noreferrer">1431</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="301-2022-07-26"><a href="https://github.com/apify/crawlee/compare/v3.0.0...v3.0.1" target="_blank" rel="noopener noreferrer">3.0.1</a> (2022-07-26)<a href="#301-2022-07-26" class="hash-link" aria-label="Direct link to 301-2022-07-26" title="Direct link to 301-2022-07-26">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="fixes-2">Fixes<a href="#fixes-2" class="hash-link" aria-label="Direct link to Fixes" title="Direct link to Fixes">\u200b</a></h3>\n<ul>\n<li>remove <code>JSONData</code> generic type arg from <code>CheerioCrawler</code> in (<a href="https://github.com/apify/crawlee/pull/1402" target="_blank" rel="noopener noreferrer">#1402</a>)</li>\n<li>rename default storage folder to just <code>storage</code> in (<a href="https://github.com/apify/crawlee/pull/1403" target="_blank" rel="noopener noreferrer">#1403</a>)</li>\n<li>remove trailing slash for proxyUrl in (<a href="https://github.com/apify/crawlee/pull/1405" target="_blank" rel="noopener noreferrer">#1405</a>)</li>\n<li>run browser crawlers in headless mode by default in (<a href="https://github.com/apify/crawlee/pull/1409" target="_blank" rel="noopener noreferrer">#1409</a>)</li>\n<li>rename interface <code>FailedRequestHandler</code> to <code>ErrorHandler</code> in (<a href="https://github.com/apify/crawlee/pull/1410" target="_blank" rel="noopener noreferrer">#1410</a>)</li>\n<li>ensure default route is not ignored in <code>CheerioCrawler</code> in (<a href="https://github.com/apify/crawlee/pull/1411" target="_blank" rel="noopener noreferrer">#1411</a>)</li>\n<li>add <code>headless</code> option to <code>BrowserCrawlerOptions</code> in (<a href="https://github.com/apify/crawlee/pull/1412" target="_blank" rel="noopener noreferrer">#1412</a>)</li>\n<li>processing custom cookies in (<a href="https://github.com/apify/crawlee/pull/1414" target="_blank" rel="noopener noreferrer">#1414</a>)</li>\n<li>enqueue link not finding relative links if the checked page is redirected in (<a href="https://github.com/apify/crawlee/pull/1416" target="_blank" rel="noopener noreferrer">#1416</a>)</li>\n<li>fix building projects with TS when puppeteer and playwright are not installed in (<a href="https://github.com/apify/crawlee/pull/1404" target="_blank" rel="noopener noreferrer">#1404</a>)</li>\n<li>calling <code>enqueueLinks</code> in browser crawler on page without any links in (<a href="https://github.com/apify/crawlee/commit/385ca27c4c50096f2e28bf0da369d6aaf849a73b" target="_blank" rel="noopener noreferrer">385ca27</a>)</li>\n<li>improve error message when no default route provided in (<a href="https://github.com/apify/crawlee/commit/04c3b6ac2fd151379d57e95bde085e2a098d1b76" target="_blank" rel="noopener noreferrer">04c3b6a</a>)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="features-25">Features<a href="#features-25" class="hash-link" aria-label="Direct link to Features" title="Direct link to Features">\u200b</a></h3>\n<ul>\n<li>feat: add parseWithCheerio for puppeteer & playwright in (<a href="https://github.com/apify/crawlee/pull/1418" target="_blank" rel="noopener noreferrer">#1418</a>)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="300-2022-07-13"><a href="https://github.com/apify/crawlee/compare/v2.3.2...v3.0.0" target="_blank" rel="noopener noreferrer">3.0.0</a> (2022-07-13)<a href="#300-2022-07-13" class="hash-link" aria-label="Direct link to 300-2022-07-13" title="Direct link to 300-2022-07-13">\u200b</a></h2>\n<p>This section summarizes most of the breaking changes between Crawlee (v3) and Apify SDK (v2). Crawlee is the spiritual successor to Apify SDK, so we decided to keep the versioning and release Crawlee as v3.</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="crawlee-vs-apify-sdk">Crawlee vs Apify SDK<a href="#crawlee-vs-apify-sdk" class="hash-link" aria-label="Direct link to Crawlee vs Apify SDK" title="Direct link to Crawlee vs Apify SDK">\u200b</a></h3>\n<p>Up until version 3 of <code>apify</code>, the package contained both scraping related tools and Apify platform related helper methods. With v3 we are splitting the whole project into two main parts:</p>\n<ul>\n<li>Crawlee, the new web-scraping library, available as <code>crawlee</code> package on NPM</li>\n<li>Apify SDK, helpers for the Apify platform, available as <code>apify</code> package on NPM</li>\n</ul>\n<p>Moreover, the Crawlee library is published as several packages under <code>@crawlee</code> namespace:</p>\n<ul>\n<li><code>@crawlee/core</code>: the base for all the crawler implementations, also contains things like <code>Request</code>, <code>RequestQueue</code>, <code>RequestList</code> or <code>Dataset</code> classes</li>\n<li><code>@crawlee/basic</code>: exports <code>BasicCrawler</code></li>\n<li><code>@crawlee/cheerio</code>: exports <code>CheerioCrawler</code></li>\n<li><code>@crawlee/browser</code>: exports <code>BrowserCrawler</code> (which is used for creating <code>@crawlee/playwright</code> and <code>@crawlee/puppeteer</code>)</li>\n<li><code>@crawlee/playwright</code>: exports <code>PlaywrightCrawler</code></li>\n<li><code>@crawlee/puppeteer</code>: exports <code>PuppeteerCrawler</code></li>\n<li><code>@crawlee/memory-storage</code>: <code>@apify/storage-local</code> alternative</li>\n<li><code>@crawlee/browser-pool</code>: previously <code>browser-pool</code> package</li>\n<li><code>@crawlee/utils</code>: utility methods</li>\n<li><code>@crawlee/types</code>: holds TS interfaces mainly about the <code>StorageClient</code></li>\n</ul>\n<h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="installing-crawlee">Installing Crawlee<a href="#installing-crawlee" class="hash-link" aria-label="Direct link to Installing Crawlee" title="Direct link to Installing Crawlee">\u200b</a></h4>\n<blockquote>\n<p>As Crawlee is not yet released as <code>latest</code>, we need to install from the <code>next</code> distribution tag!</p>\n</blockquote>\n<p>Most of the Crawlee packages are extending and reexporting each other, so it\'s enough to install just the one you plan on using, e.g. <code>@crawlee/playwright</code> if you plan on using <code>playwright</code> - it already contains everything from the <code>@crawlee/browser</code> package, which includes everything from <code>@crawlee/basic</code>, which includes everything from <code>@crawlee/core</code>.</p>\n<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token function" style="color: rgb(215, 58, 73);">npm</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">install</span><span class="token plain"> crawlee@next</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<p>Or if all we need is cheerio support, we can install only @crawlee/cheerio</p>\n<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token function" style="color: rgb(215, 58, 73);">npm</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">install</span><span class="token plain"> @crawlee/cheerio@next</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<p>When using <code>playwright</code> or <code>puppeteer</code>, we still need to install those dependencies explicitly - this allows the users to be in control of which version will be used.</p>\n<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token function" style="color: rgb(215, 58, 73);">npm</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">install</span><span class="token plain"> crawlee@next playwright</span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;"># or npm install @crawlee/playwright@next playwright</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<p>Alternatively we can also use the <code>crawlee</code> meta-package which contains (re-exports) most of the <code>@crawlee/*</code> packages, and therefore contains all the crawler classes.</p>\n<blockquote>\n<p>Sometimes you might want to use some utility methods from <code>@crawlee/utils</code>, so you might want to install that as well. This package contains some utilities that were previously available under <code>Apify.utils</code>. Browser related utilities can be also found in the crawler packages (e.g. <code>@crawlee/playwright</code>).</p>\n</blockquote>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="full-typescript-support">Full TypeScript support<a href="#full-typescript-support" class="hash-link" aria-label="Direct link to Full TypeScript support" title="Direct link to Full TypeScript support">\u200b</a></h3>\n<p>Both Crawlee and Apify SDK are full TypeScript rewrite, so they include up-to-date types in the package. For your TypeScript crawlers we recommend using our predefined TypeScript configuration from <code>@apify/tsconfig</code> package. Don\'t forget to set the <code>module</code> and <code>target</code> to <code>ES2022</code> or above to be able to use top level await.</p>\n<blockquote>\n<p>The <code>@apify/tsconfig</code> config has <a href="https://www.typescriptlang.org/tsconfig#noImplicitAny" target="_blank" rel="noopener noreferrer"><code>noImplicitAny</code></a> enabled, you might want to disable it during the initial development as it will cause build failures if you left some unused local variables in your code.</p>\n</blockquote>\n<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockTitle_Ktv7">tsconfig.json</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token property" style="color: rgb(54, 172, 170);">"extends"</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">"@apify/tsconfig"</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token property" style="color: rgb(54, 172, 170);">"compilerOptions"</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token property" style="color: rgb(54, 172, 170);">"module"</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">"ES2022"</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token property" style="color: rgb(54, 172, 170);">"target"</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">"ES2022"</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token property" style="color: rgb(54, 172, 170);">"outDir"</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">"dist"</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token property" style="color: rgb(54, 172, 170);">"lib"</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token string" style="color: rgb(227, 17, 108);">"DOM"</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token property" style="color: rgb(54, 172, 170);">"include"</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">"./src/**/*"</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="docker-build">Docker build<a href="#docker-build" class="hash-link" aria-label="Direct link to Docker build" title="Direct link to Docker build">\u200b</a></h4>\n<p>For <code>Dockerfile</code> we recommend using multi-stage build, so you don\'t install the dev dependencies like TypeScript in your final image:</p>\n<div class="language-dockerfile codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockTitle_Ktv7">Dockerfile</div><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-dockerfile codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;"># using multistage build, as we need dev deps to build the TS source code</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">FROM</span><span class="token instruction"> apify/actor-node:16 </span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">AS</span><span class="token instruction"> builder</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;"># copy all files, install all dependencies (including dev deps) and build the project</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">COPY</span><span class="token instruction"> . ./</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">RUN</span><span class="token instruction"> npm install --include=dev </span><span class="token instruction operator" style="color: rgb(57, 58, 52);">\\</span><span class="token instruction"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token instruction"> && npm run build</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;"># create final image</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">FROM</span><span class="token instruction"> apify/actor-node:16</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;"># copy only necessary files</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">COPY</span><span class="token instruction"> </span><span class="token instruction options property" style="color: rgb(54, 172, 170);">--from</span><span class="token instruction options punctuation" style="color: rgb(57, 58, 52);">=</span><span class="token instruction options string" style="color: rgb(227, 17, 108);">builder</span><span class="token instruction"> /usr/src/app/package*.json ./</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">COPY</span><span class="token instruction"> </span><span class="token instruction options property" style="color: rgb(54, 172, 170);">--from</span><span class="token instruction options punctuation" style="color: rgb(57, 58, 52);">=</span><span class="token instruction options string" style="color: rgb(227, 17, 108);">builder</span><span class="token instruction"> /usr/src/app/README.md ./</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">COPY</span><span class="token instruction"> </span><span class="token instruction options property" style="color: rgb(54, 172, 170);">--from</span><span class="token instruction options punctuation" style="color: rgb(57, 58, 52);">=</span><span class="token instruction options string" style="color: rgb(227, 17, 108);">builder</span><span class="token instruction"> /usr/src/app/dist ./dist</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">COPY</span><span class="token instruction"> </span><span class="token instruction options property" style="color: rgb(54, 172, 170);">--from</span><span class="token instruction options punctuation" style="color: rgb(57, 58, 52);">=</span><span class="token instruction options string" style="color: rgb(227, 17, 108);">builder</span><span class="token instruction"> /usr/src/app/apify.json ./apify.json</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">COPY</span><span class="token instruction"> </span><span class="token instruction options property" style="color: rgb(54, 172, 170);">--from</span><span class="token instruction options punctuation" style="color: rgb(57, 58, 52);">=</span><span class="token instruction options string" style="color: rgb(227, 17, 108);">builder</span><span class="token instruction"> /usr/src/app/INPUT_SCHEMA.json ./INPUT_SCHEMA.json</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;"># install only prod deps</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">RUN</span><span class="token instruction"> npm --quiet set progress=false </span><span class="token instruction operator" style="color: rgb(57, 58, 52);">\\</span><span class="token instruction"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token instruction"> && npm install --only=prod --no-optional </span><span class="token instruction operator" style="color: rgb(57, 58, 52);">\\</span><span class="token instruction"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token instruction"> && echo </span><span class="token instruction string" style="color: rgb(227, 17, 108);">"Installed NPM packages:"</span><span class="token instruction"> </span><span class="token instruction operator" style="color: rgb(57, 58, 52);">\\</span><span class="token instruction"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token instruction"> && (npm list --only=prod --no-optional --all || true) </span><span class="token instruction operator" style="color: rgb(57, 58, 52);">\\</span><span class="token instruction"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token instruction"> && echo </span><span class="token instruction string" style="color: rgb(227, 17, 108);">"Node.js version:"</span><span class="token instruction"> </span><span class="token instruction operator" style="color: rgb(57, 58, 52);">\\</span><span class="token instruction"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token instruction"> && node --version </span><span class="token instruction operator" style="color: rgb(57, 58, 52);">\\</span><span class="token instruction"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token instruction"> && echo </span><span class="token instruction string" style="color: rgb(227, 17, 108);">"NPM version:"</span><span class="token instruction"> </span><span class="token instruction operator" style="color: rgb(57, 58, 52);">\\</span><span class="token instruction"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token instruction"> && npm --version</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;"># run compiled code</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token instruction keyword" style="color: rgb(0, 0, 159);">CMD</span><span class="token instruction"> npm run start:prod</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="browser-fingerprints">Browser fingerprints<a href="#browser-fingerprints" class="hash-link" aria-label="Direct link to Browser fingerprints" title="Direct link to Browser fingerprints">\u200b</a></h3>\n<p>Previously we had a magical <code>stealth</code> option in the puppeteer crawler that enabled several tricks aiming to mimic the real users as much as possible. While this worked to a certain degree, we decided to replace it with generated browser fingerprints.</p>\n<p>In case we don\'t want to have dynamic fingerprints, we can disable this behaviour via <code>useFingerprints</code> in <code>browserPoolOptions</code>:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">PlaywrightCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> browserPoolOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> useFingerprints</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">false</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="session-cookie-method-renames">Session cookie method renames<a href="#session-cookie-method-renames" class="hash-link" aria-label="Direct link to Session cookie method renames" title="Direct link to Session cookie method renames">\u200b</a></h3>\n<p>Previously, if we wanted to get or add cookies for the session that would be used for the request, we had to call <code>session.getPuppeteerCookies()</code> or <code>session.setPuppeteerCookies()</code>. Since this method could be used for any of our crawlers, not just <code>PuppeteerCrawler</code>, the methods have been renamed to <code>session.getCookies()</code> and <code>session.setCookies()</code> respectively. Otherwise, their usage is exactly the same!</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="memory-storage">Memory storage<a href="#memory-storage" class="hash-link" aria-label="Direct link to Memory storage" title="Direct link to Memory storage">\u200b</a></h3>\n<p>When we store some data or intermediate state (like the one <code>RequestQueue</code> holds), we now use <code>@crawlee/memory-storage</code> by default. It is an alternative to the <code>@apify/storage-local</code>, that stores the state inside memory (as opposed to SQLite database used by <code>@apify/storage-local</code>). While the state is stored in memory, it also dumps it to the file system, so we can observe it, as well as respects the existing data stored in KeyValueStore (e.g. the <code>INPUT.json</code> file).</p>\n<p>When we want to run the crawler on Apify platform, we need to use <code>Actor.init</code> or <code>Actor.main</code>, which will automatically switch the storage client to <code>ApifyClient</code> when on the Apify platform.</p>\n<p>We can still use the <code>@apify/storage-local</code>, to do it, first install it pass it to the <code>Actor.init</code> or <code>Actor.main</code> options:</p>\n<blockquote>\n<p><code>@apify/storage-local</code> v2.1.0+ is required for Crawlee</p>\n</blockquote>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> Actor </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'apify\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> ApifyStorageLocal </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'@apify/storage-local\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> storage </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">ApifyStorageLocal</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">/* options like `enableWalMode` belong here */</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Actor</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">init</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> storage </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="purging-of-the-default-storage">Purging of the default storage<a href="#purging-of-the-default-storage" class="hash-link" aria-label="Direct link to Purging of the default storage" title="Direct link to Purging of the default storage">\u200b</a></h3>\n<p>Previously the state was preserved between local runs, and we had to use <code>--purge</code> argument of the <code>apify-cli</code>. With Crawlee, this is now the default behaviour, we purge the storage automatically on <code>Actor.init/main</code> call. We can opt out of it via <code>purge: false</code> in the <code>Actor.init</code> options.</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="renamed-crawler-options-and-interfaces">Renamed crawler options and interfaces<a href="#renamed-crawler-options-and-interfaces" class="hash-link" aria-label="Direct link to Renamed crawler options and interfaces" title="Direct link to Renamed crawler options and interfaces">\u200b</a></h3>\n<p>Some options were renamed to better reflect what they do. We still support all the old parameter names too, but not at the TS level.</p>\n<ul>\n<li><code>handleRequestFunction</code> -> <code>requestHandler</code></li>\n<li><code>handlePageFunction</code> -> <code>requestHandler</code></li>\n<li><code>handleRequestTimeoutSecs</code> -> <code>requestHandlerTimeoutSecs</code></li>\n<li><code>handlePageTimeoutSecs</code> -> <code>requestHandlerTimeoutSecs</code></li>\n<li><code>requestTimeoutSecs</code> -> <code>navigationTimeoutSecs</code></li>\n<li><code>handleFailedRequestFunction</code> -> <code>failedRequestHandler</code></li>\n</ul>\n<p>We also renamed the crawling context interfaces, so they follow the same convention and are more meaningful:</p>\n<ul>\n<li><code>CheerioHandlePageInputs</code> -> <code>CheerioCrawlingContext</code></li>\n<li><code>PlaywrightHandlePageFunction</code> -> <code>PlaywrightCrawlingContext</code></li>\n<li><code>PuppeteerHandlePageFunction</code> -> <code>PuppeteerCrawlingContext</code></li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="context-aware-helpers">Context aware helpers<a href="#context-aware-helpers" class="hash-link" aria-label="Direct link to Context aware helpers" title="Direct link to Context aware helpers">\u200b</a></h3>\n<p>Some utilities previously available under <code>Apify.utils</code> namespace are now moved to the crawling context and are <em>context aware</em>. This means they have some parameters automatically filled in from the context, like the current <code>Request</code> instance or current <code>Page</code> object, or the <code>RequestQueue</code> bound to the crawler.</p>\n<h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="enqueuing-links">Enqueuing links<a href="#enqueuing-links" class="hash-link" aria-label="Direct link to Enqueuing links" title="Direct link to Enqueuing links">\u200b</a></h4>\n<p>One common helper that received more attention is the <code>enqueueLinks</code>. As mentioned above, it is context aware - we no longer need pass in the <code>requestQueue</code> or <code>page</code> arguments (or the cheerio handle <code>$</code>). In addition to that, it now offers 3 enqueuing strategies:</p>\n<ul>\n<li><code>EnqueueStrategy.All</code> (<code>\'all\'</code>): Matches any URLs found</li>\n<li><code>EnqueueStrategy.SameHostname</code> (<code>\'same-hostname\'</code>) Matches any URLs that have the same subdomain as the base URL (default)</li>\n<li><code>EnqueueStrategy.SameDomain</code> (<code>\'same-domain\'</code>) Matches any URLs that have the same domain name. For example, <code>https://wow.an.example.com</code> and <code>https://example.com</code> will both be matched for a base url of <code>https://example.com</code>.</li>\n</ul>\n<p>This means we can even call <code>enqueueLinks()</code> without any parameters. By default, it will go through all the links found on current page and filter only those targeting the same subdomain.</p>\n<p>Moreover, we can specify patterns the URL should match via globs:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">PlaywrightCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">async</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">requestHandler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> enqueueLinks </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">enqueueLinks</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> globs</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token string" style="color: rgb(227, 17, 108);">\'https://apify.com/*/*\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// we can also use `regexps` and `pseudoUrls` keys here</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="implicit-requestqueue-instance">Implicit <code>RequestQueue</code> instance<a href="#implicit-requestqueue-instance" class="hash-link" aria-label="Direct link to implicit-requestqueue-instance" title="Direct link to implicit-requestqueue-instance">\u200b</a></h3>\n<p>All crawlers now have the <code>RequestQueue</code> instance automatically available via <code>crawler.getRequestQueue()</code> method. It will create the instance for you if it does not exist yet. This mean we no longer need to create the <code>RequestQueue</code> instance manually, and we can just use <code>crawler.addRequests()</code> method described underneath.</p>\n<blockquote>\n<p>We can still create the <code>RequestQueue</code> explicitly, the <code>crawler.getRequestQueue()</code> method will respect that and return the instance provided via crawler options.</p>\n</blockquote>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="crawleraddrequests"><code>crawler.addRequests()</code><a href="#crawleraddrequests" class="hash-link" aria-label="Direct link to crawleraddrequests" title="Direct link to crawleraddrequests">\u200b</a></h3>\n<p>We can now add multiple requests in batches. The newly added <code>addRequests</code> method will handle everything for us. It enqueues the first 1000 requests and resolves, while continuing with the rest in the background, again in a smaller 1000 items batches, so we don\'t fall into any API rate limits. This means the crawling will start almost immediately (within few seconds at most), something previously possible only with a combination of <code>RequestQueue</code> and <code>RequestList</code>.</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// will resolve right after the initial batch of 1000 requests is added</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> result </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> crawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">addRequests</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">/* many requests, can be even millions */</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// if we want to wait for all the requests to be added, we can await the `waitForAllRequestsToBeAdded` promise</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> result</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">waitForAllRequestsToBeAdded</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="less-verbose-error-logging">Less verbose error logging<a href="#less-verbose-error-logging" class="hash-link" aria-label="Direct link to Less verbose error logging" title="Direct link to Less verbose error logging">\u200b</a></h3>\n<p>Previously an error thrown from inside request handler resulted in full error object being logged. With Crawlee, we log only the error message as a warning as long as we know the request will be retried. If you want to enable verbose logging like in v2, use the <code>CRAWLEE_VERBOSE_LOG</code> env var.</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="removal-of-requestasbrowser">Removal of <code>requestAsBrowser</code><a href="#removal-of-requestasbrowser" class="hash-link" aria-label="Direct link to removal-of-requestasbrowser" title="Direct link to removal-of-requestasbrowser">\u200b</a></h3>\n<p>In v1 we replaced the underlying implementation of <code>requestAsBrowser</code> to be just a proxy over calling <a href="https://github.com/apify/got-scraping" target="_blank" rel="noopener noreferrer"><code>got-scraping</code></a> - our custom extension to <code>got</code> that tries to mimic the real browsers as much as possible. With v3, we are removing the <code>requestAsBrowser</code>, encouraging the use of <a href="https://github.com/apify/got-scraping" target="_blank" rel="noopener noreferrer"><code>got-scraping</code></a> directly.</p>\n<p>For easier migration, we also added <code>context.sendRequest()</code> helper that allows processing the context bound <code>Request</code> object through <a href="https://github.com/apify/got-scraping" target="_blank" rel="noopener noreferrer"><code>got-scraping</code></a>:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">BasicCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">async</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">requestHandler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> sendRequest</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> log </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// we can use the options parameter to override gotScraping options</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> res </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">sendRequest</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> responseType</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'json\'</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> log</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">info</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'received body\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> res</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">body</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-to-use-sendrequest">How to use <code>sendRequest()</code>?<a href="#how-to-use-sendrequest" class="hash-link" aria-label="Direct link to how-to-use-sendrequest" title="Direct link to how-to-use-sendrequest">\u200b</a></h4>\n<p>See <a href="/docs/guides/got-scraping">the Got Scraping guide</a>.</p>\n<h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="removed-options">Removed options<a href="#removed-options" class="hash-link" aria-label="Direct link to Removed options" title="Direct link to Removed options">\u200b</a></h4>\n<p>The <code>useInsecureHttpParser</code> option has been removed. It\'s permanently set to <code>true</code> in order to better mimic browsers\' behavior.</p>\n<p>Got Scraping automatically performs protocol negotiation, hence we removed the <code>useHttp2</code> option. It\'s set to <code>true</code> - 100% of browsers nowadays are capable of HTTP/2 requests. Oh, more and more of the web is using it too!</p>\n<h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="renamed-options">Renamed options<a href="#renamed-options" class="hash-link" aria-label="Direct link to Renamed options" title="Direct link to Renamed options">\u200b</a></h4>\n<p>In the <code>requestAsBrowser</code> approach, some of the options were named differently. Here\'s a list of renamed options:</p>\n<h5 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="payload"><code>payload</code><a href="#payload" class="hash-link" aria-label="Direct link to payload" title="Direct link to payload">\u200b</a></h5>\n<p>This options represents the body to send. It could be a <code>string</code> or a <code>Buffer</code>. However, there is no <code>payload</code> option anymore. You need to use <code>body</code> instead. Or, if you wish to send JSON, <code>json</code>. Here\'s an example:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Before:</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Apify</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">utils</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">requestAsBrowser</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> payload</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'Hello, world!\'</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Apify</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">utils</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">requestAsBrowser</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> payload</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">from</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'c0ffe\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'hex\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Apify</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">utils</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">requestAsBrowser</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> json</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> hello</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'world\'</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// After:</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">gotScraping</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> body</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'Hello, world!\'</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">gotScraping</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> body</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> Buffer</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">from</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'c0ffe\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'hex\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">gotScraping</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> json</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> hello</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'world\'</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h5 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="ignoresslerrors"><code>ignoreSslErrors</code><a href="#ignoresslerrors" class="hash-link" aria-label="Direct link to ignoresslerrors" title="Direct link to ignoresslerrors">\u200b</a></h5>\n<p>It has been renamed to <code>https.rejectUnauthorized</code>. By default, it\'s set to <code>false</code> for convenience. However, if you want to make sure the connection is secure, you can do the following:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Before:</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Apify</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">utils</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">requestAsBrowser</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> ignoreSslErrors</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">false</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// After:</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">gotScraping</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> https</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> rejectUnauthorized</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">true</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<p>Please note: the meanings are opposite! So we needed to invert the values as well.</p>\n<h5 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="header-generator-options"><code>header-generator</code> options<a href="#header-generator-options" class="hash-link" aria-label="Direct link to header-generator-options" title="Direct link to header-generator-options">\u200b</a></h5>\n<p><code>useMobileVersion</code>, <code>languageCode</code> and <code>countryCode</code> no longer exist. Instead, you need to use <code>headerGeneratorOptions</code> directly:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Before:</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Apify</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">utils</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">requestAsBrowser</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> useMobileVersion</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">true</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> languageCode</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'en\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> countryCode</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'US\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// After:</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">gotScraping</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> headerGeneratorOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> devices</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token string" style="color: rgb(227, 17, 108);">\'mobile\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// or [\'desktop\']</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> locales</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token string" style="color: rgb(227, 17, 108);">\'en-US\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h5 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="timeoutsecs"><code>timeoutSecs</code><a href="#timeoutsecs" class="hash-link" aria-label="Direct link to timeoutsecs" title="Direct link to timeoutsecs">\u200b</a></h5>\n<p>In order to set a timeout, use <code>timeout.request</code> (which is <strong>milliseconds</strong> now).</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Before:</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Apify</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">utils</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">requestAsBrowser</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> timeoutSecs</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token number" style="color: rgb(54, 172, 170);">30</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// After:</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">gotScraping</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> …</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> timeout</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> request</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token number" style="color: rgb(54, 172, 170);">30</span><span class="token plain"> </span><span class="token operator" style="color: rgb(57, 58, 52);">*</span><span class="token plain"> </span><span class="token number" style="color: rgb(54, 172, 170);">1000</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h5 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="throwonhttperrors"><code>throwOnHttpErrors</code><a href="#throwonhttperrors" class="hash-link" aria-label="Direct link to throwonhttperrors" title="Direct link to throwonhttperrors">\u200b</a></h5>\n<p><code>throwOnHttpErrors</code> → <code>throwHttpErrors</code>. This options throws on unsuccessful HTTP status codes, for example <code>404</code>. By default, it\'s set to <code>false</code>.</p>\n<h5 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="decodebody"><code>decodeBody</code><a href="#decodebody" class="hash-link" aria-label="Direct link to decodebody" title="Direct link to decodebody">\u200b</a></h5>\n<p><code>decodeBody</code> → <code>decompress</code>. This options decompresses the body. Defaults to <code>true</code> - please do not change this or websites will break (unless you know what you\'re doing!).</p>\n<h5 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="abortfunction"><code>abortFunction</code><a href="#abortfunction" class="hash-link" aria-label="Direct link to abortfunction" title="Direct link to abortfunction">\u200b</a></h5>\n<p>This function used to make the promise throw on specific responses, if it returned <code>true</code>. However, it wasn\'t that useful.</p>\n<p>You probably want to cancel the request instead, which you can do in the following way:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> promise </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">gotScraping</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token plain">…</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain">promise</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">on</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'request\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> request </span><span class="token operator" style="color: rgb(57, 58, 52);">=></span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Please note this is not a Got Request instance, but a ClientRequest one.</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// https://nodejs.org/api/http.html#class-httpclientrequest</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">if</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token plain">request</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">protocol </span><span class="token operator" style="color: rgb(57, 58, 52);">!==</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'https:\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Unsecure request, abort.</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> promise</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">cancel</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// If you set `isStream` to `true`, please use `stream.destroy()` instead.</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> response </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> promise</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="removal-of-browser-pool-plugin-mixing">Removal of browser pool plugin mixing<a href="#removal-of-browser-pool-plugin-mixing" class="hash-link" aria-label="Direct link to Removal of browser pool plugin mixing" title="Direct link to Removal of browser pool plugin mixing">\u200b</a></h3>\n<p>Previously, you were able to have a browser pool that would mix Puppeteer and Playwright plugins (or even your own custom plugins if you\'ve built any). As of this version, that is no longer allowed, and creating such a browser pool will cause an error to be thrown (it\'s expected that all plugins that will be used are of the same type).</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="handling-requests-outside-of-browser">Handling requests outside of browser<a href="#handling-requests-outside-of-browser" class="hash-link" aria-label="Direct link to Handling requests outside of browser" title="Direct link to Handling requests outside of browser">\u200b</a></h3>\n<p>One small feature worth mentioning is the ability to handle requests with browser crawlers outside the browser. To do that, we can use a combination of <code>Request.skipNavigation</code> and <code>context.sendRequest()</code>.</p>\n<p>Take a look at how to achieve this by checking out the <a href="/docs/examples/skip-navigation">Skipping navigation for certain requests</a> example!</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="logging">Logging<a href="#logging" class="hash-link" aria-label="Direct link to Logging" title="Direct link to Logging">\u200b</a></h3>\n<p>Crawlee exports the default <code>log</code> instance directly as a named export. We also have a scoped <code>log</code> instance provided in the crawling context - this one will log messages prefixed with the crawler name and should be preferred for logging inside the request handler.</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">CheerioCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">async</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">requestHandler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> log</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> request </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> log</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">info</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token template-string template-punctuation string" style="color: rgb(227, 17, 108);">`</span><span class="token template-string string" style="color: rgb(227, 17, 108);">Opened </span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color: rgb(57, 58, 52);">${</span><span class="token template-string interpolation">request</span><span class="token template-string interpolation punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token template-string interpolation">loadedUrl</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token template-string template-punctuation string" style="color: rgb(227, 17, 108);">`</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="auto-saved-crawler-state">Auto-saved crawler state<a href="#auto-saved-crawler-state" class="hash-link" aria-label="Direct link to Auto-saved crawler state" title="Direct link to Auto-saved crawler state">\u200b</a></h3>\n<p>Every crawler instance now has <code>useState()</code> method that will return a state object we can use. It will be automatically saved when <code>persistState</code> event occurs. The value is cached, so we can freely call this method multiple times and get the exact same reference. No need to worry about saving the value either, as it will happen automatically.</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">CheerioCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">async</span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">requestHandler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> crawler </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> state </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> crawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">useState</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> foo</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">as</span><span class="token plain"> </span><span class="token builtin">number</span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// just change the value, no need to care about saving it</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> state</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">foo</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">push</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token number" style="color: rgb(54, 172, 170);">123</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="apify-sdk">Apify SDK<a href="#apify-sdk" class="hash-link" aria-label="Direct link to Apify SDK" title="Direct link to Apify SDK">\u200b</a></h3>\n<p>The Apify platform helpers can be now found in the Apify SDK (<code>apify</code> NPM package). It exports the <code>Actor</code> class that offers following static helpers:</p>\n<ul>\n<li><code>ApifyClient</code> shortcuts: <code>addWebhook()</code>, <code>call()</code>, <code>callTask()</code>, <code>metamorph()</code></li>\n<li>helpers for running on Apify platform: <code>init()</code>, <code>exit()</code>, <code>fail()</code>, <code>main()</code>, <code>isAtHome()</code>, <code>createProxyConfiguration()</code></li>\n<li>storage support: <code>getInput()</code>, <code>getValue()</code>, <code>openDataset()</code>, <code>openKeyValueStore()</code>, <code>openRequestQueue()</code>, <code>pushData()</code>, <code>setValue()</code></li>\n<li>events support: <code>on()</code>, <code>off()</code></li>\n<li>other utilities: <code>getEnv()</code>, <code>newClient()</code>, <code>reboot()</code></li>\n</ul>\n<p><code>Actor.main</code> is now just a syntax sugar around calling <code>Actor.init()</code> at the beginning and <code>Actor.exit()</code> at the end (plus wrapping the user function in try/catch block). All those methods are async and should be awaited - with node 16 we can use the top level await for that. In other words, following is equivalent:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> Actor </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'apify\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Actor</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">init</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// your code</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Actor</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">exit</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'Crawling finished!\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> Actor </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'apify\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">await</span><span class="token plain"> Actor</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">main</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token keyword" style="color: rgb(0, 0, 159);">async</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token operator" style="color: rgb(57, 58, 52);">=></span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// your code</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"> statusMessage</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'Crawling finished!\'</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<p><code>Actor.init()</code> will conditionally set the storage implementation of Crawlee to the <code>ApifyClient</code> when running on the Apify platform, or keep the default (memory storage) implementation otherwise. It will also subscribe to the websocket events (or mimic them locally). <code>Actor.exit()</code> will handle the tear down and calls <code>process.exit()</code> to ensure our process won\'t hang indefinitely for some reason.</p>\n<h4 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="events">Events<a href="#events" class="hash-link" aria-label="Direct link to Events" title="Direct link to Events">\u200b</a></h4>\n<p>Apify SDK (v2) exports <code>Apify.events</code>, which is an <code>EventEmitter</code> instance. With Crawlee, the events are managed by <a href="/api/core/class/EventManager"><code>EventManager</code></a> class instead. We can either access it via <code>Actor.eventManager</code> getter, or use <code>Actor.on</code> and <code>Actor.off</code> shortcuts instead.</p>\n<div class="language-diff codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-diff codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token deleted-sign deleted prefix deleted" style="color: rgb(215, 58, 73);">-</span><span class="token deleted-sign deleted line" style="color: rgb(215, 58, 73);">Apify.events.on(...);</span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token deleted-sign deleted line" style="color: rgb(215, 58, 73);"></span><span class="token inserted-sign inserted prefix inserted" style="color: rgb(54, 172, 170);">+</span><span class="token inserted-sign inserted line" style="color: rgb(54, 172, 170);">Actor.on(...);</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<blockquote>\n<p>We can also get the <a href="/api/core/class/EventManager"><code>EventManager</code></a> instance via <code>Configuration.getEventManager()</code>.</p>\n</blockquote>\n<p>In addition to the existing events, we now have an <code>exit</code> event fired when calling <code>Actor.exit()</code> (which is called at the end of <code>Actor.main()</code>). This event allows you to gracefully shut down any resources when <code>Actor.exit</code> is called.</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="smallerinternal-breaking-changes">Smaller/internal breaking changes<a href="#smallerinternal-breaking-changes" class="hash-link" aria-label="Direct link to Smaller/internal breaking changes" title="Direct link to Smaller/internal breaking changes">\u200b</a></h3>\n<ul>\n<li><code>Apify.call()</code> is now just a shortcut for running <code>ApifyClient.actor(actorId).call(input, options)</code>, while also taking the token inside env vars into account</li>\n<li><code>Apify.callTask()</code> is now just a shortcut for running <code>ApifyClient.task(taskId).call(input, options)</code>, while also taking the token inside env vars into account</li>\n<li><code>Apify.metamorph()</code> is now just a shortcut for running <code>ApifyClient.task(taskId).metamorph(input, options)</code>, while also taking the ACTOR_RUN_ID inside env vars into account</li>\n<li><code>Apify.waitForRunToFinish()</code> has been removed, use <code>ApifyClient.waitForFinish()</code> instead</li>\n<li><code>Actor.main/init</code> purges the storage by default</li>\n<li>remove <code>purgeLocalStorage</code> helper, move purging to the storage class directly<!-- -->\n<ul>\n<li><code>StorageClient</code> interface now has optional <code>purge</code> method</li>\n<li>purging happens automatically via <code>Actor.init()</code> (you can opt out via <code>purge: false</code> in the options of <code>init/main</code> methods)</li>\n</ul>\n</li>\n<li><code>QueueOperationInfo.request</code> is no longer available</li>\n<li><code>Request.handledAt</code> is now string date in ISO format</li>\n<li><code>Request.inProgress</code> and <code>Request.reclaimed</code> are now <code>Set</code>s instead of POJOs</li>\n<li><code>injectUnderscore</code> from puppeteer utils has been removed</li>\n<li><code>APIFY_MEMORY_MBYTES</code> is no longer taken into account, use <code>CRAWLEE_AVAILABLE_MEMORY_RATIO</code> instead</li>\n<li>some <code>AutoscaledPool</code> options are no longer available:<!-- -->\n<ul>\n<li><code>cpuSnapshotIntervalSecs</code> and <code>memorySnapshotIntervalSecs</code> has been replaced with top level <code>systemInfoIntervalMillis</code> configuration</li>\n<li><code>maxUsedCpuRatio</code> has been moved to the top level configuration</li>\n</ul>\n</li>\n<li><code>ProxyConfiguration.newUrlFunction</code> can be async. <code>.newUrl()</code> and <code>.newProxyInfo()</code> now return promises.</li>\n<li><code>prepareRequestFunction</code> and <code>postResponseFunction</code> options are removed, use navigation hooks instead</li>\n<li><code>gotoFunction</code> and <code>gotoTimeoutSecs</code> are removed</li>\n<li>removed compatibility fix for old/broken request queues with null <code>Request</code> props</li>\n<li><code>fingerprintsOptions</code> renamed to <code>fingerprintOptions</code> (<code>fingerprints</code> -> <code>fingerprint</code>).</li>\n<li><code>fingerprintOptions</code> now accept <code>useFingerprintCache</code> and <code>fingerprintCacheSize</code> (instead of <code>useFingerprintPerProxyCache</code> and <code>fingerprintPerProxyCacheSize</code>, which are now no longer available). This is because the cached fingerprints are no longer connected to proxy URLs but to sessions.</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="232-2022-05-05"><a href="https://github.com/apify/crawlee/compare/v2.3.1...v2.3.2" target="_blank" rel="noopener noreferrer">2.3.2</a> (2022-05-05)<a href="#232-2022-05-05" class="hash-link" aria-label="Direct link to 232-2022-05-05" title="Direct link to 232-2022-05-05">\u200b</a></h2>\n<ul>\n<li>fix: use default user agent for playwright with chrome instead of the default "headless UA"</li>\n<li>fix: always hide webdriver of chrome browsers</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="231-2022-05-03"><a href="https://github.com/apify/crawlee/compare/v2.3.0...v2.3.1" target="_blank" rel="noopener noreferrer">2.3.1</a> (2022-05-03)<a href="#231-2022-05-03" class="hash-link" aria-label="Direct link to 231-2022-05-03" title="Direct link to 231-2022-05-03">\u200b</a></h2>\n<ul>\n<li>fix: <code>utils.apifyClient</code> early instantiation (#1330)</li>\n<li>feat: <code>utils.playwright.injectJQuery()</code> (#1337)</li>\n<li>feat: add <code>keyValueStore</code> option to <code>Statistics</code> class (#1345)</li>\n<li>fix: ensure failed req count is correct when using <code>RequestList</code> (#1347)</li>\n<li>fix: random puppeteer crawler (running in headful mode) failure (#1348)<!-- -->\n<blockquote>\n<p>This should help with the <code>We either navigate top level or have old version of the navigated frame</code> bug in puppeteer.</p>\n</blockquote>\n</li>\n<li>fix: allow returning falsy values in <code>RequestTransform</code>\'s return type</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="230-2022-04-07"><a href="https://github.com/apify/crawlee/compare/v2.2.2...v2.3.0" target="_blank" rel="noopener noreferrer">2.3.0</a> (2022-04-07)<a href="#230-2022-04-07" class="hash-link" aria-label="Direct link to 230-2022-04-07" title="Direct link to 230-2022-04-07">\u200b</a></h2>\n<ul>\n<li>feat: accept more social media patterns (#1286)</li>\n<li>feat: add multiple click support to <code>enqueueLinksByClickingElements</code> (#1295)</li>\n<li>feat: instance-scoped "global" configuration (#1315)</li>\n<li>feat: requestList accepts proxyConfiguration for requestsFromUrls (#1317)</li>\n<li>feat: update <code>playwright</code> to v1.20.2</li>\n<li>feat: update <code>puppeteer</code> to v13.5.2<!-- -->\n<blockquote>\n<p>We noticed that with this version of puppeteer actor run could crash with\n<code>We either navigate top level or have old version of the navigated frame</code> error\n(puppeteer issue <a href="https://github.com/puppeteer/puppeteer/issues/7050" target="_blank" rel="noopener noreferrer">here</a>).\nIt should not happen while running the browser in headless mode.\nIn case you need to run the browser in headful mode (<code>headless: false</code>),\nwe recommend pinning puppeteer version to <code>10.4.0</code> in actor <code>package.json</code> file.</p>\n</blockquote>\n</li>\n<li>feat: stealth deprecation (#1314)</li>\n<li>feat: allow passing a stream to KeyValueStore.setRecord (#1325)</li>\n<li>fix: use correct apify-client instance for snapshotting (#1308)</li>\n<li>fix: automatically reset <code>RequestQueue</code> state after 5 minutes of inactivity, closes #997</li>\n<li>fix: improve guessing of chrome executable path on windows (#1294)</li>\n<li>fix: prune CPU snapshots locally (#1313)</li>\n<li>fix: improve browser launcher types (#1318)</li>\n</ul>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="0-concurrency-mitigation">0 concurrency mitigation<a href="#0-concurrency-mitigation" class="hash-link" aria-label="Direct link to 0 concurrency mitigation" title="Direct link to 0 concurrency mitigation">\u200b</a></h3>\n<p>This release should resolve the 0 concurrency bug by automatically resetting the\ninternal <code>RequestQueue</code> state after 5 minutes of inactivity.</p>\n<p>We now track last activity done on a <code>RequestQueue</code> instance:</p>\n<ul>\n<li>added new request</li>\n<li>started processing a request (added to <code>inProgress</code> cache)</li>\n<li>marked request as handled</li>\n<li>reclaimed request</li>\n</ul>\n<p>If we don\'t detect one of those actions in last 5 minutes, and we have some\nrequests in the <code>inProgress</code> cache, we try to reset the state. We can override\nthis limit via <code>CRAWLEE_INTERNAL_TIMEOUT</code> env var.</p>\n<p>This should finally resolve the 0 concurrency bug, as it was always about\nstuck requests in the <code>inProgress</code> cache.</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="222-2022-02-14"><a href="https://github.com/apify/crawlee/compare/v2.2.1...v2.2.2" target="_blank" rel="noopener noreferrer">2.2.2</a> (2022-02-14)<a href="#222-2022-02-14" class="hash-link" aria-label="Direct link to 222-2022-02-14" title="Direct link to 222-2022-02-14">\u200b</a></h2>\n<ul>\n<li>fix: ensure <code>request.headers</code> is set</li>\n<li>fix: lower <code>RequestQueue</code> API timeout to 30 seconds</li>\n<li>improve logging for fetching next request and timeouts</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="221-2022-01-03"><a href="https://github.com/apify/crawlee/compare/v2.2.0...v2.2.1" target="_blank" rel="noopener noreferrer">2.2.1</a> (2022-01-03)<a href="#221-2022-01-03" class="hash-link" aria-label="Direct link to 221-2022-01-03" title="Direct link to 221-2022-01-03">\u200b</a></h2>\n<ul>\n<li>fix: ignore requests that are no longer in progress (#1258)</li>\n<li>fix: do not use <code>tryCancel()</code> from inside sync callback (#1265)</li>\n<li>fix: revert to puppeteer 10.x (#1276)</li>\n<li>fix: wait when <code>body</code> is not available in <code>infiniteScroll()</code> from Puppeteer utils (#1238)</li>\n<li>fix: expose logger classes on the <code>utils.log</code> instance (#1278)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="220-2021-12-17"><a href="https://github.com/apify/crawlee/compare/v2.1.0...v2.2.0" target="_blank" rel="noopener noreferrer">2.2.0</a> (2021-12-17)<a href="#220-2021-12-17" class="hash-link" aria-label="Direct link to 220-2021-12-17" title="Direct link to 220-2021-12-17">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="proxy-per-page">Proxy per page<a href="#proxy-per-page" class="hash-link" aria-label="Direct link to Proxy per page" title="Direct link to Proxy per page">\u200b</a></h3>\n<p>Up until now, browser crawlers used the same session (and therefore the same proxy) for\nall request from a single browser * now get a new proxy for each session. This means\nthat with incognito pages, each page will get a new proxy, aligning the behaviour with\n<code>CheerioCrawler</code>.</p>\n<p>This feature is not enabled by default. To use it, we need to enable <code>useIncognitoPages</code>\nflag under <code>launchContext</code>:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">Apify</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">Playwright</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> launchContext</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> useIncognitoPages</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">true</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<blockquote>\n<p>Note that currently there is a performance overhead for using <code>useIncognitoPages</code>.\nUse this flag at your own will.</p>\n</blockquote>\n<p>We are planning to enable this feature by default in SDK v3.0.</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="abortable-timeouts">Abortable timeouts<a href="#abortable-timeouts" class="hash-link" aria-label="Direct link to Abortable timeouts" title="Direct link to Abortable timeouts">\u200b</a></h3>\n<p>Previously when a page function timed out, the task still kept running. This could lead to requests being processed multiple times. In v2.2 we now have abortable timeouts that will cancel the task as\nearly as possible.</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="mitigation-of-zero-concurrency-issue">Mitigation of zero concurrency issue<a href="#mitigation-of-zero-concurrency-issue" class="hash-link" aria-label="Direct link to Mitigation of zero concurrency issue" title="Direct link to Mitigation of zero concurrency issue">\u200b</a></h3>\n<p>Several new timeouts were added to the task function, which should help mitigate the zero concurrency bug. Namely fetching of next request information and reclaiming failed requests back to the queue\nare now executed with a timeout with 3 additional retries before the task fails. The timeout is always at least 300s (5 minutes), or <code>requestHandlerTimeoutSecs</code> if that value is higher.</p>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="full-list-of-changes">Full list of changes<a href="#full-list-of-changes" class="hash-link" aria-label="Direct link to Full list of changes" title="Direct link to Full list of changes">\u200b</a></h3>\n<ul>\n<li>fix <code>RequestError: URI malformed</code> in cheerio crawler (#1205)</li>\n<li>only provide Cookie header if cookies are present (#1218)</li>\n<li>handle extra cases for <code>diffCookie</code> (#1217)</li>\n<li>add timeout for task function (#1234)</li>\n<li>implement proxy per page in browser crawlers (#1228)</li>\n<li>add fingerprinting support (#1243)</li>\n<li>implement abortable timeouts (#1245)</li>\n<li>add timeouts with retries to <code>runTaskFunction()</code> (#1250)</li>\n<li>automatically convert google spreadsheet URLs to CSV exports (#1255)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="210-2021-10-07"><a href="https://github.com/apify/crawlee/compare/v2.0.7...v2.1.0" target="_blank" rel="noopener noreferrer">2.1.0</a> (2021-10-07)<a href="#210-2021-10-07" class="hash-link" aria-label="Direct link to 210-2021-10-07" title="Direct link to 210-2021-10-07">\u200b</a></h2>\n<ul>\n<li>automatically convert google docs share urls to csv download ones in request list (#1174)</li>\n<li>use puppeteer emulating scrolls instead of <code>window.scrollBy</code> (#1170)</li>\n<li>warn if apify proxy is used in proxyUrls (#1173)</li>\n<li>fix <code>YOUTUBE_REGEX_STRING</code> being too greedy (#1171)</li>\n<li>add <code>purgeLocalStorage</code> utility method (#1187)</li>\n<li>catch errors inside request interceptors (#1188, #1190)</li>\n<li>add support for cgroups v2 (#1177)</li>\n<li>fix incorrect offset in <code>fixUrl</code> function (#1184)</li>\n<li>support channel and user links in YouTube regex (#1178)</li>\n<li>fix: allow passing <code>requestsFromUrl</code> to <code>RequestListOptions</code> in TS (#1191)</li>\n<li>allow passing <code>forceCloud</code> down to the KV store (#1186), closes #752</li>\n<li>merge cookies from session with user provided ones (#1201), closes #1197</li>\n<li>use <code>ApifyClient</code> v2 (full rewrite to TS)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="207-2021-09-08"><a href="https://github.com/apify/crawlee/compare/v2.0.6...v2.0.7" target="_blank" rel="noopener noreferrer">2.0.7</a> (2021-09-08)<a href="#207-2021-09-08" class="hash-link" aria-label="Direct link to 207-2021-09-08" title="Direct link to 207-2021-09-08">\u200b</a></h2>\n<ul>\n<li>Fix casting of int/bool environment variables (e.g. <code>APIFY_LOCAL_STORAGE_ENABLE_WAL_MODE</code>), closes #956</li>\n<li>Fix incognito pages and user data dir (#1145)</li>\n<li>Add <code>@ts-ignore</code> comments to imports of optional peer dependencies (#1152)</li>\n<li>Use config instance in <code>sdk.openSessionPool()</code> (#1154)</li>\n<li>Add a breaking callback to <code>infiniteScroll</code> (#1140)</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="206-2021-08-27"><a href="https://github.com/apify/crawlee/compare/v2.0.5...v2.0.6" target="_blank" rel="noopener noreferrer">2.0.6</a> (2021-08-27)<a href="#206-2021-08-27" class="hash-link" aria-label="Direct link to 206-2021-08-27" title="Direct link to 206-2021-08-27">\u200b</a></h2>\n<ul>\n<li>Fix deprecation messages logged from <code>ProxyConfiguration</code> and <code>CheerioCrawler</code>.</li>\n<li>Update <code>got-scraping</code> to receive multiple improvements.</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="205-2021-08-24"><a href="https://github.com/apify/crawlee/compare/v2.0.4...v2.0.5" target="_blank" rel="noopener noreferrer">2.0.5</a> (2021-08-24)<a href="#205-2021-08-24" class="hash-link" aria-label="Direct link to 205-2021-08-24" title="Direct link to 205-2021-08-24">\u200b</a></h2>\n<ul>\n<li>Fix error handling in puppeteer crawler</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="204-2021-08-23"><a href="https://github.com/apify/crawlee/compare/v2.0.3...v2.0.4" target="_blank" rel="noopener noreferrer">2.0.4</a> (2021-08-23)<a href="#204-2021-08-23" class="hash-link" aria-label="Direct link to 204-2021-08-23" title="Direct link to 204-2021-08-23">\u200b</a></h2>\n<ul>\n<li>Use <code>sessionToken</code> with <code>got-scraping</code></li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="203-2021-08-20"><a href="https://github.com/apify/crawlee/compare/v2.0.2...v2.0.3" target="_blank" rel="noopener noreferrer">2.0.3</a> (2021-08-20)<a href="#203-2021-08-20" class="hash-link" aria-label="Direct link to 203-2021-08-20" title="Direct link to 203-2021-08-20">\u200b</a></h2>\n<ul>\n<li><strong>BREAKING IN EDGE CASES</strong> * We removed <code>forceUrlEncoding</code> in <code>requestAsBrowser</code> because we found out that recent versions of the underlying HTTP client <code>got</code> already encode URLs\nand <code>forceUrlEncoding</code> could lead to weird behavior. We think of this as fixing a bug, so we\'re not bumping the major version.</li>\n<li>Limit <code>handleRequestTimeoutMillis</code> to max valid value to prevent Node.js fallback to <code>1</code>.</li>\n<li>Use <code>got-scraping@^3.0.1</code></li>\n<li>Disable SSL validation on MITM proxie</li>\n<li>Limit <code>handleRequestTimeoutMillis</code> to max valid value</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="202-2021-08-12"><a href="https://github.com/apify/crawlee/compare/v2.0.1...v2.0.2" target="_blank" rel="noopener noreferrer">2.0.2</a> (2021-08-12)<a href="#202-2021-08-12" class="hash-link" aria-label="Direct link to 202-2021-08-12" title="Direct link to 202-2021-08-12">\u200b</a></h2>\n<ul>\n<li>Fix serialization issues in <code>CheerioCrawler</code> caused by parser conflicts in recent versions of <code>cheerio</code>.</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="201-2021-08-06"><a href="https://github.com/apify/crawlee/compare/v2.0.0...v2.0.1" target="_blank" rel="noopener noreferrer">2.0.1</a> (2021-08-06)<a href="#201-2021-08-06" class="hash-link" aria-label="Direct link to 201-2021-08-06" title="Direct link to 201-2021-08-06">\u200b</a></h2>\n<ul>\n<li>Use <code>got-scraping</code> 2.0.1 until fully compatible.</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="200-2021-08-05"><a href="https://github.com/apify/crawlee/compare/v1.3.4...v2.0.0" target="_blank" rel="noopener noreferrer">2.0.0</a> (2021-08-05)<a href="#200-2021-08-05" class="hash-link" aria-label="Direct link to 200-2021-08-05" title="Direct link to 200-2021-08-05">\u200b</a></h2>\n<ul>\n<li><strong>BREAKING</strong>: Require Node.js >=15.10.0 because HTTP2 support on lower Node.js versions is very buggy.</li>\n<li><strong>BREAKING</strong>: Bump <code>cheerio</code> to <code>1.0.0-rc.10</code> from <code>rc.3</code>. There were breaking changes in <code>cheerio</code> between the versions so this bump might be breaking for you as well.</li>\n<li>Remove <code>LiveViewServer</code> which was deprecated before release of SDK v1.</li>\n</ul></section></div></article></div></div><div class="col col--3"><div class="tsd-api-options"><div><b>Page Options</b></div><label><input type="checkbox"><span>Hide Inherited</span></label><div></div></div><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#bug-fixes" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features" class="table-of-contents__link toc-highlight">Features</a></li><li><a href="#3115-2024-10-04" class="table-of-contents__link toc-highlight">3.11.5 (2024-10-04)</a><ul><li><a href="#bug-fixes-1" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#3114-2024-09-23" class="table-of-contents__link toc-highlight">3.11.4 (2024-09-23)</a><ul><li><a href="#bug-fixes-2" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#3113-2024-09-03" class="table-of-contents__link toc-highlight">3.11.3 (2024-09-03)</a><ul><li><a href="#bug-fixes-3" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#3112-2024-08-28" class="table-of-contents__link toc-highlight">3.11.2 (2024-08-28)</a><ul><li><a href="#bug-fixes-4" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-1" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#3111-2024-07-24" class="table-of-contents__link toc-highlight">3.11.1 (2024-07-24)</a><ul><li><a href="#features-2" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#3105-2024-06-12" class="table-of-contents__link toc-highlight">3.10.5 (2024-06-12)</a><ul><li><a href="#bug-fixes-5" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#3104-2024-06-11" class="table-of-contents__link toc-highlight">3.10.4 (2024-06-11)</a><ul><li><a href="#bug-fixes-6" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#3103-2024-06-07" class="table-of-contents__link toc-highlight">3.10.3 (2024-06-07)</a><ul><li><a href="#bug-fixes-7" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-3" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#3102-2024-06-03" class="table-of-contents__link toc-highlight">3.10.2 (2024-06-03)</a></li><li><a href="#3101-2024-05-23" class="table-of-contents__link toc-highlight">3.10.1 (2024-05-23)</a><ul><li><a href="#bug-fixes-8" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#bug-fixes-9" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-4" class="table-of-contents__link toc-highlight">Features</a></li><li><a href="#performance-improvements" class="table-of-contents__link toc-highlight">Performance Improvements</a></li></ul></li><li><a href="#392-2024-04-17" class="table-of-contents__link toc-highlight">3.9.2 (2024-04-17)</a><ul><li><a href="#bug-fixes-10" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#391-2024-04-11" class="table-of-contents__link toc-highlight">3.9.1 (2024-04-11)</a><ul><li><a href="#bug-fixes-11" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-5" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#382-2024-03-21" class="table-of-contents__link toc-highlight">3.8.2 (2024-03-21)</a><ul><li><a href="#bug-fixes-12" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-6" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#381-2024-02-22" class="table-of-contents__link toc-highlight">3.8.1 (2024-02-22)</a><ul><li><a href="#bug-fixes-13" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#bug-fixes-14" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-7" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#373-2024-01-30" class="table-of-contents__link toc-highlight">3.7.3 (2024-01-30)</a><ul><li><a href="#bug-fixes-15" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#372-2024-01-09" class="table-of-contents__link toc-highlight">3.7.2 (2024-01-09)</a><ul><li><a href="#bug-fixes-16" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#371-2024-01-02" class="table-of-contents__link toc-highlight">3.7.1 (2024-01-02)</a><ul><li><a href="#bug-fixes-17" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-8" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#362-2023-11-26" class="table-of-contents__link toc-highlight">3.6.2 (2023-11-26)</a><ul><li><a href="#bug-fixes-18" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#361-2023-11-15" class="table-of-contents__link toc-highlight">3.6.1 (2023-11-15)</a><ul><li><a href="#bug-fixes-19" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#bug-fixes-20" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-9" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#358-2023-10-17" class="table-of-contents__link toc-highlight">3.5.8 (2023-10-17)</a></li><li><a href="#357-2023-10-05" class="table-of-contents__link toc-highlight">3.5.7 (2023-10-05)</a><ul><li><a href="#bug-fixes-21" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#356-2023-10-04" class="table-of-contents__link toc-highlight">3.5.6 (2023-10-04)</a><ul><li><a href="#bug-fixes-22" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#355-2023-10-02" class="table-of-contents__link toc-highlight">3.5.5 (2023-10-02)</a><ul><li><a href="#bug-fixes-23" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-10" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#354-2023-09-11" class="table-of-contents__link toc-highlight">3.5.4 (2023-09-11)</a><ul><li><a href="#bug-fixes-24" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#353-2023-08-31" class="table-of-contents__link toc-highlight">3.5.3 (2023-08-31)</a><ul><li><a href="#bug-fixes-25" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-11" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#352-2023-08-21" class="table-of-contents__link toc-highlight">3.5.2 (2023-08-21)</a><ul><li><a href="#bug-fixes-26" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#351-2023-08-16" class="table-of-contents__link toc-highlight">3.5.1 (2023-08-16)</a><ul><li><a href="#bug-fixes-27" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#bug-fixes-28" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-12" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#342-2023-07-19" class="table-of-contents__link toc-highlight">3.4.2 (2023-07-19)</a><ul><li><a href="#features-13" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#341-2023-07-13" class="table-of-contents__link toc-highlight">3.4.1 (2023-07-13)</a><ul><li><a href="#bug-fixes-29" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-14" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#333-2023-05-31" class="table-of-contents__link toc-highlight">3.3.3 (2023-05-31)</a><ul><li><a href="#features-15" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#332-2023-05-11" class="table-of-contents__link toc-highlight">3.3.2 (2023-05-11)</a><ul><li><a href="#bug-fixes-30" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-16" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#331-2023-04-11" class="table-of-contents__link toc-highlight">3.3.1 (2023-04-11)</a><ul><li><a href="#bug-fixes-31" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#bug-fixes-32" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-17" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#322-2023-02-08" class="table-of-contents__link toc-highlight">3.2.2 (2023-02-08)</a></li><li><a href="#321-2023-02-07" class="table-of-contents__link toc-highlight">3.2.1 (2023-02-07)</a><ul><li><a href="#bug-fixes-33" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#bug-fixes-34" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-18" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#313-2022-12-07" class="table-of-contents__link toc-highlight">3.1.3 (2022-12-07)</a></li><li><a href="#312-2022-11-15" class="table-of-contents__link toc-highlight">3.1.2 (2022-11-15)</a><ul><li><a href="#bug-fixes-35" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-19" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#311-2022-11-07" class="table-of-contents__link toc-highlight">3.1.1 (2022-11-07)</a><ul><li><a href="#bug-fixes-36" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-20" class="table-of-contents__link toc-highlight">Features</a></li><li><a href="#bug-fixes-37" class="table-of-contents__link toc-highlight">Bug Fixes</a></li><li><a href="#features-21" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#304-2022-08-22" class="table-of-contents__link toc-highlight">3.0.4 (2022-08-22)</a><ul><li><a href="#features-22" class="table-of-contents__link toc-highlight">Features</a></li><li><a href="#bug-fixes-38" class="table-of-contents__link toc-highlight">Bug Fixes</a></li></ul></li><li><a href="#303-2022-08-11" class="table-of-contents__link toc-highlight">3.0.3 (2022-08-11)</a><ul><li><a href="#fixes" class="table-of-contents__link toc-highlight">Fixes</a></li><li><a href="#features-23" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#302-2022-07-28" class="table-of-contents__link toc-highlight">3.0.2 (2022-07-28)</a><ul><li><a href="#fixes-1" class="table-of-contents__link toc-highlight">Fixes</a></li><li><a href="#features-24" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#301-2022-07-26" class="table-of-contents__link toc-highlight">3.0.1 (2022-07-26)</a><ul><li><a href="#fixes-2" class="table-of-contents__link toc-highlight">Fixes</a></li><li><a href="#features-25" class="table-of-contents__link toc-highlight">Features</a></li></ul></li><li><a href="#300-2022-07-13" class="table-of-contents__link toc-highlight">3.0.0 (2022-07-13)</a><ul><li><a href="#crawlee-vs-apify-sdk" class="table-of-contents__link toc-highlight">Crawlee vs Apify SDK</a><ul><li><a href="#installing-crawlee" class="table-of-contents__link toc-highlight">Installing Crawlee</a></li></ul></li><li><a href="#full-typescript-support" class="table-of-contents__link toc-highlight">Full TypeScript support</a><ul><li><a href="#docker-build" class="table-of-contents__link toc-highlight">Docker build</a></li></ul></li><li><a href="#browser-fingerprints" class="table-of-contents__link toc-highlight">Browser fingerprints</a></li><li><a href="#session-cookie-method-renames" class="table-of-contents__link toc-highlight">Session cookie method renames</a></li><li><a href="#memory-storage" class="table-of-contents__link toc-highlight">Memory storage</a></li><li><a href="#purging-of-the-default-storage" class="table-of-contents__link toc-highlight">Purging of the default storage</a></li><li><a href="#renamed-crawler-options-and-interfaces" class="table-of-contents__link toc-highlight">Renamed crawler options and interfaces</a></li><li><a href="#context-aware-helpers" class="table-of-contents__link toc-highlight">Context aware helpers</a><ul><li><a href="#enqueuing-links" class="table-of-contents__link toc-highlight">Enqueuing links</a></li></ul></li><li><a href="#implicit-requestqueue-instance" class="table-of-contents__link toc-highlight">Implicit <code>RequestQueue</code> instance</a></li><li><a href="#crawleraddrequests" class="table-of-contents__link toc-highlight"><code>crawler.addRequests()</code></a></li><li><a href="#less-verbose-error-logging" class="table-of-contents__link toc-highlight">Less verbose error logging</a></li><li><a href="#removal-of-requestasbrowser" class="table-of-contents__link toc-highlight">Removal of <code>requestAsBrowser</code></a><ul><li><a href="#how-to-use-sendrequest" class="table-of-contents__link toc-highlight">How to use <code>sendRequest()</code>?</a></li><li><a href="#removed-options" class="table-of-contents__link toc-highlight">Removed options</a></li><li><a href="#renamed-options" class="table-of-contents__link toc-highlight">Renamed options</a><ul><li><a href="#payload" class="table-of-contents__link toc-highlight"><code>payload</code></a></li><li><a href="#ignoresslerrors" class="table-of-contents__link toc-highlight"><code>ignoreSslErrors</code></a></li><li><a href="#header-generator-options" class="table-of-contents__link toc-highlight"><code>header-generator</code> options</a></li><li><a href="#timeoutsecs" class="table-of-contents__link toc-highlight"><code>timeoutSecs</code></a></li><li><a href="#throwonhttperrors" class="table-of-contents__link toc-highlight"><code>throwOnHttpErrors</code></a></li><li><a href="#decodebody" class="table-of-contents__link toc-highlight"><code>decodeBody</code></a></li><li><a href="#abortfunction" class="table-of-contents__link toc-highlight"><code>abortFunction</code></a></li></ul></li></ul></li><li><a href="#removal-of-browser-pool-plugin-mixing" class="table-of-contents__link toc-highlight">Removal of browser pool plugin mixing</a></li><li><a href="#handling-requests-outside-of-browser" class="table-of-contents__link toc-highlight">Handling requests outside of browser</a></li><li><a href="#logging" class="table-of-contents__link toc-highlight">Logging</a></li><li><a href="#auto-saved-crawler-state" class="table-of-contents__link toc-highlight">Auto-saved crawler state</a></li><li><a href="#apify-sdk" class="table-of-contents__link toc-highlight">Apify SDK</a><ul><li><a href="#events" class="table-of-contents__link toc-highlight">Events</a></li></ul></li><li><a href="#smallerinternal-breaking-changes" class="table-of-contents__link toc-highlight">Smaller/internal breaking changes</a></li></ul></li><li><a href="#232-2022-05-05" class="table-of-contents__link toc-highlight">2.3.2 (2022-05-05)</a></li><li><a href="#231-2022-05-03" class="table-of-contents__link toc-highlight">2.3.1 (2022-05-03)</a></li><li><a href="#230-2022-04-07" class="table-of-contents__link toc-highlight">2.3.0 (2022-04-07)</a><ul><li><a href="#0-concurrency-mitigation" class="table-of-contents__link toc-highlight">0 concurrency mitigation</a></li></ul></li><li><a href="#222-2022-02-14" class="table-of-contents__link toc-highlight">2.2.2 (2022-02-14)</a></li><li><a href="#221-2022-01-03" class="table-of-contents__link toc-highlight">2.2.1 (2022-01-03)</a></li><li><a href="#220-2021-12-17" class="table-of-contents__link toc-highlight">2.2.0 (2021-12-17)</a><ul><li><a href="#proxy-per-page" class="table-of-contents__link toc-highlight">Proxy per page</a></li><li><a href="#abortable-timeouts" class="table-of-contents__link toc-highlight">Abortable timeouts</a></li><li><a href="#mitigation-of-zero-concurrency-issue" class="table-of-contents__link toc-highlight">Mitigation of zero concurrency issue</a></li><li><a href="#full-list-of-changes" class="table-of-contents__link toc-highlight">Full list of changes</a></li></ul></li><li><a href="#210-2021-10-07" class="table-of-contents__link toc-highlight">2.1.0 (2021-10-07)</a></li><li><a href="#207-2021-09-08" class="table-of-contents__link toc-highlight">2.0.7 (2021-09-08)</a></li><li><a href="#206-2021-08-27" class="table-of-contents__link toc-highlight">2.0.6 (2021-08-27)</a></li><li><a href="#205-2021-08-24" class="table-of-contents__link toc-highlight">2.0.5 (2021-08-24)</a></li><li><a href="#204-2021-08-23" class="table-of-contents__link toc-highlight">2.0.4 (2021-08-23)</a></li><li><a href="#203-2021-08-20" class="table-of-contents__link toc-highlight">2.0.3 (2021-08-20)</a></li><li><a href="#202-2021-08-12" class="table-of-contents__link toc-highlight">2.0.2 (2021-08-12)</a></li><li><a href="#201-2021-08-06" class="table-of-contents__link toc-highlight">2.0.1 (2021-08-06)</a></li><li><a href="#200-2021-08-05" class="table-of-contents__link toc-highlight">2.0.0 (2021-08-05)</a></li></ul></div></div></div></div></main></div></div></div></div><footer class="footer_J6tW light"><div class="container padding-horiz--lg"><div class="row"><div class="col col--5"><div class="row"><div class="col col--6"><div class="footerTitle_tbhc">Docs</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/guides">Guides</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/examples">Examples</a></li><li class="footer__item"><a class="footer__link-item" href="/api/core">API reference</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/upgrading/upgrading-to-v3">Upgrading to v3</a></li></ul></div><div class="col col--6"><div class="footerTitle_tbhc">Community</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/apify" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div><div class="col col--7"><div class="row"><div class="col col--3 col--offset-9"><div class="footerTitle_tbhc">More</div><ul class="clean-list"><li class="footer__item"><a href="https://apify.com/?__hstc=7591405.16082ab8013f181f2e08b1eb70b809bc.1732041264559.1732041264559.1732041264559.1&__hssc=7591405.1.1732041264559&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="footer__link-item">Apify Platform<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://docusaurus.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Docusaurus<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div></div><div class="row padding-vert--md padding-top--lg"><div class="col padding-vert--md col--6"><div class="freeAndOpenSource_V9mY"><svg width="24" height="24" fill="none" viewBox="0 0 24 24" class="alignMiddle_ZeUO"><path fill="#B3B8D2" d="m23.85 21.426-1.78-2.91a.5.5 0 0 1-.07-.26v-4.13c0-1.78-1.71-3.07-3.52-4.45a.51.51 0 0 1-.2-.36.53.53 0 0 1 .14-.4 4.93 4.93 0 0 0 1.07-5.88 5.08 5.08 0 0 0-8.08-1.29l-1.06 1a.48.48 0 0 1-.67 0l-1.06-1a5.09 5.09 0 0 0-8.09 1.29 5 5 0 0 0 1 5.76l7.76 8a1.06 1.06 0 0 0 .77.32 1.08 1.08 0 0 0 .78-.32.64.64 0 0 0 .14-.66 3.8 3.8 0 0 1-.2-1.38 3.75 3.75 0 0 1 4.92-3.37.49.49 0 0 0 .51-.13l.15-.15a.5.5 0 0 1 .66-.05l.3.23c1.22.92 2.73 2.07 2.73 2.85v4.55a1 1 0 0 0 .15.53l2 3.26a1 1 0 1 0 1.7-1z"></path><path fill="#B3B8D2" d="M16.09 13.196a2.37 2.37 0 0 0-3.19 0 2.38 2.38 0 0 0-.18 3.39l1.63 1.77a.55.55 0 0 1 .13.34v1c0 1.3 1.52 2.59 2 2.95a.9.9 0 0 0 .54.19.88.88 0 0 0 .54-1.57 3.9 3.9 0 0 1-1.31-1.57v-1.57a.86.86 0 0 0-.23-.59l-2-2.18a.58.58 0 0 1-.17-.45.66.66 0 0 1 .21-.44.64.64 0 0 1 .85 0l2 1.86a.874.874 0 1 0 1.19-1.28z"></path></svg><span class="alignMiddle_ZeUO">Crawlee is free and open source</span></div></div><div class="col padding-vert--md col--6 text--right"><span class="builtBy_TvsZ"><span class="alignMiddle_ZeUO">Built by</span><a href="https://apify.com/?__hstc=7591405.16082ab8013f181f2e08b1eb70b809bc.1732041264559.1732041264559.1732041264559.1&__hssc=7591405.1.1732041264559&__hsfp=317949576"><svg width="91" height="25" fill="none" viewBox="0 0 91 25" class="alignMiddle_ZeUO"><path fill="#97D700" d="M3.135 2.85A3.41 3.41 0 0 0 .227 6.699l2.016 14.398 8.483-19.304z"></path><path fill="#71C5E8" d="M23.604 14.847 22.811 3.78a3.414 3.414 0 0 0-3.64-3.154c-.077 0-.153.014-.228.025l-3.274.452 7.192 16.124c.54-.67.805-1.52.743-2.379"></path><path fill="#FF9013" d="M5.336 24.595c.58.066 1.169-.02 1.706-.248l12.35-5.211L13.514 5.97z"></path><path fill="#fff" d="M33.83 5.304h3.903l5.448 14.623h-3.494l-1.022-2.994h-5.877l-1.025 2.994h-3.384zm-.177 9.032h4.14l-2-5.994h-.086zM58.842 5.304h3.302v14.623h-3.302zM64.634 5.304h10.71v2.7h-7.4v4.101h5.962v2.632h-5.963v5.186h-3.309zM82.116 14.38l-5.498-9.076h3.748l3.428 6.016h.085l3.599-6.016H91l-5.56 9.054v5.569h-3.324zM51.75 5.304h-7.292v14.623h3.3v-4.634h3.993a4.995 4.995 0 1 0 0-9.99m-.364 7.417h-3.628V7.875h3.627a2.423 2.423 0 0 1 0 4.846"></path></svg></a></span></div></div></div></footer></div>\n<!-- Google Tag Manager (noscript) -->\n <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5P7MCS7" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript>\n <!-- End Google Tag Manager (noscript) -->\n<script id="hs-script-loader" text="" charset="" type="text/javascript" src="//js.hs-scripts.com/19497222.js"></script>\n<script type="text/javascript" id="" charset="">!function(d,g,e){d.TiktokAnalyticsObject=e;var a=d[e]=d[e]||[];a.methods="page track identify instances debug on off once ready alias group enableCookie disableCookie holdConsent revokeConsent grantConsent".split(" ");a.setAndDefer=function(b,c){b[c]=function(){b.push([c].concat(Array.prototype.slice.call(arguments,0)))}};for(d=0;d<a.methods.length;d++)a.setAndDefer(a,a.methods[d]);a.instance=function(b){b=a._i[b]||[];for(var c=0;c<a.methods.length;c++)a.setAndDefer(b,a.methods[c]);return b};a.load=\nfunction(b,c){var f="https://analytics.tiktok.com/i18n/pixel/events.js";a._i=a._i||{};a._i[b]=[];a._i[b]._u=f;a._t=a._t||{};a._t[b]=+new Date;a._o=a._o||{};a._o[b]=c||{};c=document.createElement("script");c.type="text/javascript";c.async=!0;c.src=f+"?sdkid\\x3d"+b+"\\x26lib\\x3d"+e;b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(c,b)};a.load("CQHNEL3C77U08RGLR00G");a.page()}(window,document,"ttq");</script>\n\n<img src="https://t.co/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=fc26a5d2-31de-4090-bc11-f1a8c5d59327&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=25e2ea17-32af-480e-80f6-2b3f1e5ea75c&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fapi%2Fcore%2Fchangelog&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;"><img src="https://analytics.twitter.com/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=fc26a5d2-31de-4090-bc11-f1a8c5d59327&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=25e2ea17-32af-480e-80f6-2b3f1e5ea75c&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fapi%2Fcore%2Fchangelog&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;">\n<div class="go2933276541 go2369186930" id="hs-web-interactives-top-anchor"><div id="hs-interactives-modal-overlay" class="go1632949049"></div></div>\n<div class="go2933276541 go1348078617" id="hs-web-interactives-bottom-anchor"></div>\n<div id="hs-web-interactives-floating-container">\n <div id="hs-web-interactives-floating-top-left-anchor" class="go2417249464 go613305155">\n </div>\n <div id="hs-web-interactives-floating-top-right-anchor" class="go2417249464 go471583506">\n </div>\n <div id="hs-web-interactives-floating-bottom-left-anchor" class="go2417249464 go3921366393">\n </div>\n <div id="hs-web-interactives-floating-bottom-right-anchor" class="go2417249464 go3967842156">\n </div>\n</div>\n<div style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon174149561653"><img style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon919064838860" width="0" height="0" alt="" src="https://bat.bing.com/action/0?ti=187137944&tm=gtm002&Ver=2&mid=518e89fa-01fb-4b4f-a448-14338adb2d44&bo=2&sid=e6ffc360a6a411ef84d34f91192d7557&vid=e6ffdd60a6a411efa26797c3174f9e4b&vids=1&msclkid=N&pi=0&lg=en-US&sw=1280&sh=720&sc=24&nwd=1&tl=Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&p=https%3A%2F%2Fcrawlee.dev%2Fapi%2Fcore%2Fchangelog&r=&lt=7994&evt=pageLoad&sv=1&asc=G&cdb=AQAQ&rn=160578"></div><iframe height="0" width="0" style="display: none; visibility: hidden;"></iframe><iframe id="intercom-frame" style="position: absolute !important; opacity: 0 !important; width: 1px !important; height: 1px !important; top: 0 !important; left: 0 !important; border: none !important; display: block !important; z-index: -1 !important; pointer-events: none;" aria-hidden="true" tabindex="-1" title="Intercom"></iframe><div class="intercom-lightweight-app"><style id="intercom-lightweight-app-style" type="text/css">\n @keyframes intercom-lightweight-app-launcher {\n from {\n opacity: 0;\n transform: scale(0.5);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes intercom-lightweight-app-gradient {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes intercom-lightweight-app-messenger {\n 0% {\n opacity: 0;\n transform: scale(0);\n }\n 40% {\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n }\n\n .intercom-lightweight-app {\n position: fixed;\n z-index: 2147483001;\n width: 0;\n height: 0;\n font-family: intercom-font, "Helvetica Neue", "Apple Color Emoji", Helvetica, Arial, sans-serif;\n }\n\n .intercom-lightweight-app-gradient {\n position: fixed;\n z-index: 2147483002;\n width: 500px;\n height: 500px;\n bottom: 0;\n right: 0;\n pointer-events: none;\n background: radial-gradient(\n ellipse at bottom right,\n rgba(29, 39, 54, 0.16) 0%,\n rgba(29, 39, 54, 0) 72%);\n animation: intercom-lightweight-app-gradient 200ms ease-out;\n }\n\n .intercom-lightweight-app-launcher {\n position: fixed;\n z-index: 2147483003;\n padding: 0 !important;\n margin: 0 !important;\n border: none;\n bottom: 20px;\n right: 20px;\n max-width: 48px;\n width: 48px;\n max-height: 48px;\n height: 48px;\n border-radius: 50%;\n background: #1480ff;\n cursor: pointer;\n box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.06), 0 2px 32px 0 rgba(0, 0, 0, 0.16);\n transition: transform 167ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n box-sizing: content-box;\n }\n\n\n .intercom-lightweight-app-launcher:hover {\n transition: transform 250ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n transform: scale(1.1)\n }\n\n .intercom-lightweight-app-launcher:active {\n transform: scale(0.85);\n transition: transform 134ms cubic-bezier(0.45, 0, 0.2, 1);\n }\n\n\n .intercom-lightweight-app-launcher:focus {\n outline: none;\n\n \n }\n\n .intercom-lightweight-app-launcher-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n left: 0;\n width: 48px;\n height: 48px;\n transition: transform 100ms linear, opacity 80ms linear;\n }\n\n .intercom-lightweight-app-launcher-icon-open {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-open svg {\n width: 24px;\n height: 24px;\n }\n\n .intercom-lightweight-app-launcher-icon-open svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg {\n height: 44px;\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-custom-icon-open {\n max-height: 24px;\n max-width: 24px;\n\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize {\n \n opacity: 0;\n transform: rotate(-60deg) scale(0);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-messenger {\n position: fixed;\n z-index: 2147483003;\n overflow: hidden;\n background-color: white;\n animation: intercom-lightweight-app-messenger 250ms cubic-bezier(0, 1, 1, 1);\n transform-origin: bottom right;\n\n \n width: 400px;\n height: calc(100% - 40px);\n max-height: 704px;\n min-height: 250px;\n right: 20px;\n bottom: 20px;\n box-shadow: 0 5px 40px rgba(0,0,0,0.16);\n \n\n border-radius: 16px;\n }\n\n .intercom-lightweight-app-messenger-header {\n height: 64px;\n border-bottom: none;\n background: #1480ff\n\n \n }\n\n .intercom-lightweight-app-messenger-footer{\n position:absolute;\n bottom:0;\n width: 100%;\n height: 80px;\n background: #fff;\n font-size: 14px;\n line-height: 21px;\n border-top: 1px solid rgba(0, 0, 0, 0.05);\n box-shadow: 0px 0px 25px rgba(0, 0, 0, 0.05);\n \n }\n\n @media print {\n .intercom-lightweight-app {\n display: none;\n }\n }\n</style></div></body></html>'}, {'url': 'https://crawlee.dev/docs/guides/avoid-blocking', 'title': 'Avoid getting blocked | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-3.12 docs-doc-page docs-doc-id-guides/avoid-blocking" data-has-hydrated="true" data-theme="light" data-announcement-bar-initially-dismissed="false" data-rh="lang,dir,class,data-has-hydrated"><head><meta charset="UTF-8"><meta name="generator" content="Docusaurus v3.6.0"><title>Avoid getting blocked | Crawlee · Build reliable crawlers. Fast.</title><meta data-rh="true" name="twitter:card" content="summary_large_image"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Crawlee · Build reliable crawlers. Fast. RSS Feed"><link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Crawlee · Build reliable crawlers. Fast. Atom Feed"><link rel="search" type="application/opensearchdescription+xml" title="Crawlee · Build reliable crawlers. Fast." href="/opensearch.xml"><!-- Google Tag Manager --><script async="" src="https://www.clarity.ms/s/0.7.56/clarity.js"></script><script async="" src="https://www.clarity.ms/tag/uet/187137944"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://widget.intercom.io/widget/kod1r788"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/identify_45dd5971.js"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/main.MWQ3ODVjY2ZhNQ.js" data-id="CQHNEL3C77U08RGLR00G"></script><script src="https://js.hsadspixel.net/fb.js" type="text/javascript" id="hs-ads-pixel-19497222" data-ads-portal-id="19497222" data-ads-env="prod" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-banner.com/v2/19497222/banner.js" type="text/javascript" id="cookieBanner-19497222" data-cookieconsent="ignore" data-hs-ignore="true" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hubspot.com/web-interactives-embed.js" type="text/javascript" id="hubspot-web-interactives-loader" crossorigin="anonymous" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-analytics.net/analytics/1732041000000/19497222.js" type="text/javascript" id="hs-analytics"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=CQHNEL3C77U08RGLR00G&lib=ttq"></script><script type="text/javascript" async="" src="https://a.quora.com/qevents.js"></script><script type="text/javascript" async="" src="https://static.ads-twitter.com/uwt.js"></script><script type="text/javascript" async="" src="https://www.redditstatic.com/ads/pixel.js"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://bat.bing.com/bat.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-62P18XN9NS&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-1MGJDMV8DX&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-5P7MCS7"></script><script>!function(e,t,a,n,r){e[n]=e[n]||[],e[n].push({"gtm.start":new Date().getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id="+r+("dataLayer"!=n?"&l="+n:""),g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer","GTM-5P7MCS7")</script><!-- End Google Tag Manager --><script>window.intercomSettings={api_base:"https://api-iam.intercom.io",app_id:"kod1r788"},function(){var t=window,e=t.Intercom;if("function"==typeof e)e("reattach_activator"),e("update",t.intercomSettings);else{var n=document,a=function(){a.c(arguments)};a.q=[],a.c=function(t){a.q.push(t)},t.Intercom=a;var i=function(){var t=n.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://widget.intercom.io/widget/kod1r788";var e=n.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)};"complete"===document.readyState?i():t.attachEvent?t.attachEvent("onload",i):t.addEventListener("load",i,!1)}}()</script><script src="/js/custom.js"></script><link rel="stylesheet" href="/assets/css/styles.ac465ac2.css"><script src="/assets/js/main.a0f1a072.js" defer=""></script><script src="/assets/js/runtime~main.b70d65a1.js" defer=""></script><style id="_goober"> .go2933276541{position:fixed;display:block;width:100%;height:0px;margin:0px;padding:0px;overflow:visible;transform-style:preserve-3d;background:transparent;backface-visibility:hidden;pointer-events:none;left:0px;z-index:9998;}.go2369186930{top:0px;z-index:9999;height:100%;width:100%;}.go1348078617{bottom:0px;}.go2417249464{position:fixed;z-index:9989;}.go3921366393{left:0;bottom:0;}.go3967842156{right:0;bottom:0;}.go613305155{left:0;top:0;}.go471583506{right:0;top:0;}.go3670563033{position:relative;overflow:hidden;display:none;}.go1041095097{display:block;}.go1632949049{position:absolute;pointer-events:none;width:101vw;height:101vh;background:rgba(0,0,0,0.7);opacity:0;z-index:-1;}.go2512015367{z-index:99998;opacity:0.8;visibility:visible;pointer-events:all;cursor:pointer;}.go1432718904{overflow:hidden;}.go812842568{display:block !important;position:static !important;box-sizing:border-box !important;background:transparent !important;border:none;min-height:0px !important;max-height:none !important;margin:0px;padding:0px !important;height:100% !important;width:1px !important;max-width:100% !important;min-width:100% !important;}.go4194603687{z-index:99999;visibility:hidden;position:absolute;inset:50vh auto auto 50%;transform:translate(-50%,-50%);left:50%;top:150%;pointer-events:none;max-height:95%;max-width:95%;}.go4258295619{pointer-events:auto !important;visibility:visible;top:50%;transition:top 0.75s linear(0,0.006,0.023 2.2%,0.096 4.8%,0.532 15.4%,0.72 21%,0.793,0.853 26.7%,0.902,0.941,0.968 36.2%,0.987 39.7%,1 43.7%,1.007 48.3%,1.009 55.3%,1.002 78.2%,1 );}.go456419034{transition:opacity 0.3s ease-in;}.go3128134379{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transition:max-height 1s ease-in;}.go494047706{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;}.go2481764524{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;bottom:0px;}.go2685733372{visibility:hidden;}.go2985984737{visibility:visible !important;}.go3281949485{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transform:none !important;}.go3508454897{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;transition:transform 1s linear(0,0.006,0.022 2.3%,0.091 5.1%,0.18 7.6%,0.508 16.3%,0.607,0.691,0.762,0.822 28.4%,0.872,0.912 35.1%,0.944 38.9%,0.968 43%,0.985 47.6%,0.996 53.1%,1.001 58.4%,1.003 65.1%,1 );}.go988075951{z-index:9999;position:fixed;left:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go2699082514{z-index:9999;position:fixed;right:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1595992025{z-index:9999;position:fixed;left:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1222083472{z-index:9999;position:fixed;right:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go722322694{transition:none !important;}.go26732895{cursor:pointer;}.go2083580917{display:flex;justify-content:center;align-items:center;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0" data-rh="true"><link rel="canonical" href="https://crawlee.dev/docs/guides/avoid-blocking" data-rh="true"><link rel="alternate" href="https://crawlee.dev/docs/guides/avoid-blocking" hreflang="en" data-rh="true"><link rel="alternate" href="https://crawlee.dev/docs/guides/avoid-blocking" hreflang="x-default" data-rh="true"><meta property="og:image" content="https://crawlee.dev/img/crawlee-og.png" data-rh="true"><meta name="twitter:image" content="https://crawlee.dev/img/crawlee-og.png" data-rh="true"><meta property="og:url" content="https://crawlee.dev/docs/guides/avoid-blocking" data-rh="true"><meta property="og:locale" content="en" data-rh="true"><meta name="docusaurus_locale" content="en" data-rh="true"><meta name="docsearch:language" content="en" data-rh="true"><meta name="og:description" content="Crawlee helps you build and maintain your crawlers. It\'s open source, but built by developers who scrape millions of pages every day for a living." data-rh="true"><link rel="preconnect" href="https://5JC94MPMLY-dsn.algolia.net" crossorigin="anonymous" data-rh="true"><meta name="docusaurus_version" content="3.12" data-rh="true"><meta name="docusaurus_tag" content="docs-default-3.12" data-rh="true"><meta name="docsearch:version" content="3.12" data-rh="true"><meta name="docsearch:docusaurus_tag" content="docs-default-3.12" data-rh="true"><script async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971"></script><script src="https://bat.bing.com/p/action/187137944.js" type="text/javascript" async="" data-ueto="ueto_abd1fc80ff"></script><meta property="og:title" content="Avoid getting blocked | Crawlee · Build reliable crawlers. Fast." data-rh="true"><meta name="description" content="How to avoid getting blocked when scraping" data-rh="true"><meta property="og:description" content="How to avoid getting blocked when scraping" data-rh="true"><script type="text/javascript" async="" src="https://googleads.g.doubleclick.net/pagead/viewthroughconversion/695293971/?random=1732041319167&cv=11&fst=1732041319167&bg=ffffff&guid=ON&async=1&gtm=45be4be0v9178109438za200zb892235334&gcd=13t3t3t3t5l1&dma=0&tag_exp=101925629~102067555~102067808~102077855&u_w=1280&u_h=720&url=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Favoid-blocking&hn=www.googleadservices.com&frm=0&tiba=Avoid%20getting%20blocked%20%7C%20Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&did=dZTQ1Zm&gdid=dZTQ1Zm&npa=0&pscdl=noapi&auid=1382210348.1732041319&fdr=QA&data=event%3Dgtag.config&rfmt=3&fmt=4"></script><link rel="prefetch" href="/assets/js/c4f5d8e4.e74add4a.js"><link rel="prefetch" href="/assets/js/a7456010.2748ec17.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/fc6fe3c2.ca6fce44.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/14eb3368.22117ead.js"><link rel="prefetch" href="/assets/js/08fa83af.1e79e271.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/b22f5575.2fd431df.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/e4ef868e.c59f73f6.js"><link rel="prefetch" href="/assets/js/3f1bdb35.f55b4b21.js"><link rel="prefetch" href="/assets/js/a6aa9e1f.e11bbbf9.js"><link rel="prefetch" href="/assets/js/36994c47.c3291bce.js"><link rel="prefetch" href="/assets/js/814f3328.14399cf4.js"><link rel="prefetch" href="/assets/js/31276798.d914003a.js"><link rel="prefetch" href="/assets/js/ce44969a.a238b80f.js"><link rel="prefetch" href="/assets/js/9e1c89b6.640fdf1b.js"><link rel="prefetch" href="/assets/js/4ade9265.6073ce08.js"><link rel="prefetch" href="/assets/js/a6ac7fdc.7dc1b603.js"><link rel="prefetch" href="/assets/js/664c1011.5a64a880.js"><link rel="prefetch" href="/assets/js/e882a74a.647051f2.js"><link rel="prefetch" href="/assets/js/a3a97bb2.39475c55.js"><link rel="prefetch" href="/assets/js/80f9a068.d1f1c454.js"><link rel="prefetch" href="/assets/js/81508318.b7a58153.js"><link rel="prefetch" href="/assets/js/c15d9823.d72be663.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/f2c12a0d.f76749fe.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/6203c9a1.4fece27f.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/20076341.ebfe90ca.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/6f984333.e6b97cc6.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/696e27e4.b0674928.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/ea090e98.2c2eaf96.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/c958f241.5396d27c.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/aeb085ff.e9faac06.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/44febc05.9dac0958.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/50ed039f.cd16681d.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/7d4db07d.23c86935.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/540e2cfc.744d0441.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/a918105a.5058afe0.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/6e25635a.07fdfa55.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/4dd8462f.46e51965.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/ee4763e2.180882c6.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/820fa10b.462e037e.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/a6210f02.f570c547.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/a35c14ad.3f411893.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/c3069cc7.7af90c9a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/11420efc.f390004d.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/32a5c5bc.2cafbad4.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/d9e76d90.fbaf9ec9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/2e5fb620.ff7e28b9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/14eb3368.22117ead.js"><link rel="prefetch" href="/assets/js/963c95ea.8d9326d0.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/9f389b39.c721657b.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/04768a69.a6629773.js"></head><body class="navigation-with-keyboard" data-rh="class" style="overflow: visible;"><div id="hs-web-interactives-top-push-anchor" class="go3670563033"></div><script>!function(){var t,e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t=null!==e?e:window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":(window.matchMedia("(prefers-color-scheme: light)").matches,"light"),document.documentElement.setAttribute("data-theme",t)}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script>\n<script id="hs-script-loader" text="" charset="" type="text/javascript" src="//js.hs-scripts.com/19497222.js"></script>\n<script type="text/javascript" id="" charset="">!function(d,g,e){d.TiktokAnalyticsObject=e;var a=d[e]=d[e]||[];a.methods="page track identify instances debug on off once ready alias group enableCookie disableCookie holdConsent revokeConsent grantConsent".split(" ");a.setAndDefer=function(b,c){b[c]=function(){b.push([c].concat(Array.prototype.slice.call(arguments,0)))}};for(d=0;d<a.methods.length;d++)a.setAndDefer(a,a.methods[d]);a.instance=function(b){b=a._i[b]||[];for(var c=0;c<a.methods.length;c++)a.setAndDefer(b,a.methods[c]);return b};a.load=\nfunction(b,c){var f="https://analytics.tiktok.com/i18n/pixel/events.js";a._i=a._i||{};a._i[b]=[];a._i[b]._u=f;a._t=a._t||{};a._t[b]=+new Date;a._o=a._o||{};a._o[b]=c||{};c=document.createElement("script");c.type="text/javascript";c.async=!0;c.src=f+"?sdkid\\x3d"+b+"\\x26lib\\x3d"+e;b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(c,b)};a.load("CQHNEL3C77U08RGLR00G");a.page()}(window,document,"ttq");</script>\n<div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">🎉️ <b><a href="https://crawlee.dev/python/">Crawlee for Python is open to early adopters!</a></b> 🥳️</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"></div><b class="navbar__title text--truncate">Crawlee</b></a><a class="navbar__item navbar__link" href="/docs/quick-start">Docs</a><a class="navbar__item navbar__link" href="/docs/examples">Examples</a><a class="navbar__item navbar__link" href="/api/core">API</a><a class="navbar__item navbar__link changelog" href="/api/core/changelog">Changelog</a><a class="navbar__item navbar__link" href="/blog">Blog</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Node.js</a><ul class="dropdown__menu"><li><a href="#" class="dropdown__link api-version-bound" rel="dofollow">Node.js</a></li><li><a href="https://crawlee.dev/python" rel="dofollow" class="dropdown__link">Python<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a aria-current="page" class="navbar__link active" aria-haspopup="true" aria-expanded="false" role="button" href="/docs/guides/avoid-blocking">3.12</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/next/guides/avoid-blocking">Next</a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/docs/guides/avoid-blocking">3.12</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.11/guides/avoid-blocking">3.11</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.10/guides/avoid-blocking">3.10</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.9/guides/avoid-blocking">3.9</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.8/guides/avoid-blocking">3.8</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.7/guides/avoid-blocking">3.7</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.6/guides/avoid-blocking">3.6</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.5/guides/avoid-blocking">3.5</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.4/guides/avoid-blocking">3.4</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.3/guides/avoid-blocking">3.3</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.2/guides/avoid-blocking">3.2</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.1/guides/avoid-blocking">3.1</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.0/guides/avoid-blocking">3.0</a></li><li><a href="https://sdk.apify.com/docs/guides/getting-started?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.1.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link">2.2<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://sdk.apify.com/docs/1.3.1/guides/getting-started?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.1.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link api-version-bound">1.3<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="toggle_MW0i colorModeToggle_x44X"><button class="clean-btn toggleButton_yw5v" type="button" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><span><svg viewBox="0 0 13 12" fill="none" width="14" height="14" class="lightToggleIcon_SFTY"><g clip-path="url(#clip0_833_8168)"><path d="M6.59998 8.49999C7.98069 8.49999 9.09998 7.3807 9.09998 5.99999C9.09998 4.61928 7.98069 3.49999 6.59998 3.49999C5.21926 3.49999 4.09998 4.61928 4.09998 5.99999C4.09998 7.3807 5.21926 8.49999 6.59998 8.49999Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 0.5V1.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 10.5V11.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 2.11L3.4199 2.82" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 9.17999L10.4899 9.88999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1.09998 6H2.09998" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.0999 6H12.0999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 9.88999L3.4199 9.17999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 2.82L10.4899 2.11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></g><defs><clipPath id="clip0_833_8168"><rect width="12" height="12" fill="white" transform="translate(0.599976)"></rect></clipPath></defs></svg><svg viewBox="0 0 13 12" width="14" height="14" class="darkToggleIcon_ekgs"><path d="M10.7001 6.39501C10.6215 7.24611 10.3021 8.05721 9.77927 8.7334C9.25646 9.40959 8.55189 9.92291 7.748 10.2133C6.9441 10.5036 6.07414 10.5591 5.2399 10.3731C4.40565 10.187 3.64164 9.76728 3.03726 9.1629C2.43287 8.55851 2.01312 7.7945 1.8271 6.96026C1.64108 6.12602 1.6965 5.25605 1.98688 4.45216C2.27725 3.64826 2.79056 2.94369 3.46675 2.42088C4.14294 1.89808 4.95404 1.57866 5.80515 1.50001C5.30685 2.17414 5.06707 3.00473 5.12941 3.84071C5.19175 4.6767 5.55208 5.46254 6.14485 6.05531C6.73762 6.64808 7.52346 7.0084 8.35944 7.07074C9.19542 7.13308 10.026 6.8933 10.7001 6.39501Z" stroke="currentColor" fill="transparent" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button></div><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="View on GitHub">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="Chat on Discord">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"><svg width="15" height="15" class="DocSearch-Control-Key-Icon"><path d="M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953" stroke-width="1.2" stroke="currentColor" fill="none" stroke-linecap="square"></path></svg></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"><b>Crawlee</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/quick-start">Quick Start</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/introduction">Introduction</a><button aria-label="Collapse sidebar category \'Introduction\'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/setting-up">Setting up</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/first-crawler">First crawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/adding-urls">Adding more URLs</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/real-world-project">Real-world project</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/crawling">Crawling</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/scraping">Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/saving-data">Saving data</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/refactoring">Refactoring</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/deployment">Running in the Cloud</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/docs/guides">Guides</a><button aria-label="Collapse sidebar category \'Guides\'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/request-storage">Request Storage</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/result-storage">Result Storage</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/configuration">Configuration</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/cheerio-crawler-guide">CheerioCrawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/javascript-rendering">JavaScript rendering</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/proxy-management">Proxy Management</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/session-management">Session Management</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/scaling-crawlers">Scaling our crawlers</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/guides/avoid-blocking">Avoid getting blocked</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/jsdom-crawler-guide">JSDOMCrawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/got-scraping">Got Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/typescript-project">TypeScript Projects</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/docker-images">Running in Docker</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/parallel-scraping">Parallel Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/custom-http-client">Using a custom HTTP client (Experimental)</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/deployment">Deployment</a><button aria-label="Expand sidebar category \'Deployment\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/examples">Examples</a><button aria-label="Expand sidebar category \'Examples\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/experiments">Experiments</a><button aria-label="Expand sidebar category \'Experiments\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/upgrading">Upgrading</a><button aria-label="Expand sidebar category \'Upgrading\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_z5aJ"><div class="docItemContainer_c0TR"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/guides"><span itemprop="name">Guides</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">Avoid getting blocked</span><meta itemprop="position" content="2"></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 3.12</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>Avoid getting blocked</h1></header><p>A scraper might get blocked for numerous reasons. Let\'s narrow it down to the two main ones. The first is a bad or blocked IP address. You can learn about this topic in the <a href="/docs/guides/proxy-management">proxy management guide</a>. The second reason is <a href="https://pixelprivacy.com/resources/browser-fingerprinting/" target="_blank" rel="noopener">browser fingerprints</a> (or signatures), which we will explore more in this guide. Check the <a href="https://docs.apify.com/academy/anti-scraping?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.1.1732041318139&__hsfp=317949576" target="_blank" rel="noopener">Apify Academy anti-scraping course</a> to gain a deeper theoretical understanding of blocking and learn a few tips and tricks.</p>\n<p>Browser fingerprint is a collection of browser attributes and significant features that can show if our browser is a bot or a real user. Moreover, most browsers have these unique features that allow the website to track the browser even within different IP addresses. This is the main reason why scrapers should change browser fingerprints while doing browser-based scraping. In return, it should significantly reduce the blocking.</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="using-browser-fingerprints">Using browser fingerprints<a href="#using-browser-fingerprints" class="hash-link" aria-label="Direct link to Using browser fingerprints" title="Direct link to Using browser fingerprints">\u200b</a></h2>\n<p>Changing browser fingerprints can be a tedious job. Luckily, Crawlee provides this feature with zero configuration necessary - the usage of fingerprints is enabled by default and available in <code>PlaywrightCrawler</code> and <code>PuppeteerCrawler</code>. So whenever we build a scraper that is using one of these crawlers - the fingerprints are going to be generated for the default browser and the operating system out of the box.</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="customizing-browser-fingerprints">Customizing browser fingerprints<a href="#customizing-browser-fingerprints" class="hash-link" aria-label="Direct link to Customizing browser fingerprints" title="Direct link to Customizing browser fingerprints">\u200b</a></h2>\n<p>In certain cases we want to narrow down the fingerprints used - e.g. specify a certain operating system, locale or browser. This is also possible with Crawlee - the crawler can have the generation algorithm customized to reflect the particular browser version and many more. Let\'s take a look at the examples bellow:</p>\n<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">PlaywrightCrawler</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">PuppeteerCrawler</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword module" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">PlaywrightCrawler</span><span class="token imports"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword module" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'crawlee\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword module" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserName</span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">DeviceCategory</span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">OperatingSystemsName</span><span class="token imports"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword module" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'@crawlee/browser-pool\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">PlaywrightCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">browserPoolOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">useFingerprints</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">true</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// this is the default</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">fingerprintOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">fingerprintGeneratorOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">browsers</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">name</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token maybe-class-name">BrowserName</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token property-access">edge</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">minVersion</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token number" style="color: rgb(54, 172, 170);">96</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">devices</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token maybe-class-name">DeviceCategory</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token property-access">desktop</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">operatingSystems</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token maybe-class-name">OperatingSystemsName</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token property-access">windows</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword module" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">PuppeteerCrawler</span><span class="token imports"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword module" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'crawlee\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword module" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">BrowserName</span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token imports"> </span><span class="token imports maybe-class-name">DeviceCategory</span><span class="token imports"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword module" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'@crawlee/browser-pool\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">PuppeteerCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">browserPoolOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">useFingerprints</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">true</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// this is the default</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">fingerprintOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">fingerprintGeneratorOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">browsers</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token maybe-class-name">BrowserName</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token property-access">chrome</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> </span><span class="token maybe-class-name">BrowserName</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token property-access">firefox</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">devices</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token maybe-class-name">DeviceCategory</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token property-access">mobile</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">locales</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">[</span><span class="token string" style="color: rgb(227, 17, 108);">\'en-US\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">]</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="disabling-browser-fingerprints">Disabling browser fingerprints<a href="#disabling-browser-fingerprints" class="hash-link" aria-label="Direct link to Disabling browser fingerprints" title="Direct link to Disabling browser fingerprints">\u200b</a></h2>\n<p>On the contrary, sometimes we want to entirely disable the usage of browser fingerprints. This is easy to do with Crawlee too. All we have to do is set the <code>useFingerprints</code> option of the <code>browserPoolOptions</code> to <code>false</code>:</p>\n<div class="tabs-container tabList__CuJ"><ul role="tablist" aria-orientation="horizontal" class="tabs"><li role="tab" tabindex="0" aria-selected="true" class="tabs__item tabItem_LNqP tabs__item--active">PlaywrightCrawler</li><li role="tab" tabindex="-1" aria-selected="false" class="tabs__item tabItem_LNqP">PuppeteerCrawler</li></ul><div class="margin-top--md"><div role="tabpanel" class="tabItem_Ymn6"><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword module" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">PlaywrightCrawler</span><span class="token imports"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword module" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'crawlee\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">PlaywrightCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">browserPoolOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">useFingerprints</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">false</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div><div role="tabpanel" class="tabItem_Ymn6" hidden=""><div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token keyword module" style="color: rgb(0, 0, 159);">import</span><span class="token plain"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token imports"> </span><span class="token imports maybe-class-name">PuppeteerCrawler</span><span class="token imports"> </span><span class="token imports punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token plain"> </span><span class="token keyword module" style="color: rgb(0, 0, 159);">from</span><span class="token plain"> </span><span class="token string" style="color: rgb(227, 17, 108);">\'crawlee\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token keyword" style="color: rgb(0, 0, 159);">const</span><span class="token plain"> crawler </span><span class="token operator" style="color: rgb(57, 58, 52);">=</span><span class="token plain"> </span><span class="token keyword" style="color: rgb(0, 0, 159);">new</span><span class="token plain"> </span><span class="token class-name">PuppeteerCrawler</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">browserPoolOptions</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">{</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token literal-property property" style="color: rgb(54, 172, 170);">useFingerprints</span><span class="token operator" style="color: rgb(57, 58, 52);">:</span><span class="token plain"> </span><span class="token boolean" style="color: rgb(54, 172, 170);">false</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// ...</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token punctuation" style="color: rgb(57, 58, 52);">}</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></div></div></div>\n<p><strong>Related links</strong></p>\n<ul>\n<li><a href="https://github.com/apify/fingerprint-suite" target="_blank" rel="noopener">Fingerprint Suite Docs</a></li>\n<li><a href="https://docs.apify.com/academy/anti-scraping?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.1.1732041318139&__hsfp=317949576" target="_blank" rel="noopener">Apify Academy anti-scraping course</a></li>\n</ul></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/apify/crawlee/edit/master/website/versioned_docs/version-3.12/guides/avoid_blocking.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2024-11-19T17:31:40.000Z" itemprop="dateModified">Nov 19, 2024</time></b> by <b>Saurav Jain</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/guides/scaling-crawlers"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Scaling our crawlers</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/guides/jsdom-crawler-guide"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">JSDOMCrawler</div></a></nav><giscus-widget id="giscus-comments" repo="apify/crawlee" repoid="MDEwOlJlcG9zaXRvcnk2NjY3MDgxOQ=" category="Comments" categoryid="DIC_kwDOA_lQ484CQufN" mapping="pathname" strict="1" reactionsenabled="1" emitmetadata="0" inputposition="top" theme="light" lang="en" host="https://giscus.app" loading="eager"></giscus-widget></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#using-browser-fingerprints" class="table-of-contents__link toc-highlight">Using browser fingerprints</a></li><li><a href="#customizing-browser-fingerprints" class="table-of-contents__link toc-highlight">Customizing browser fingerprints</a></li><li><a href="#disabling-browser-fingerprints" class="table-of-contents__link toc-highlight">Disabling browser fingerprints</a></li></ul></div></div></div></div></main></div></div></div><footer class="footer_J6tW light"><div class="container padding-horiz--lg"><div class="row"><div class="col col--5"><div class="row"><div class="col col--6"><div class="footerTitle_tbhc">Docs</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/guides">Guides</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/examples">Examples</a></li><li class="footer__item"><a class="footer__link-item" href="/api/core">API reference</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/upgrading/upgrading-to-v3">Upgrading to v3</a></li></ul></div><div class="col col--6"><div class="footerTitle_tbhc">Community</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/apify" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div><div class="col col--7"><div class="row"><div class="col col--3 col--offset-9"><div class="footerTitle_tbhc">More</div><ul class="clean-list"><li class="footer__item"><a href="https://apify.com/?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.1.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="footer__link-item">Apify Platform<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://docusaurus.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Docusaurus<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div></div><div class="row padding-vert--md padding-top--lg"><div class="col padding-vert--md col--6"><div class="freeAndOpenSource_V9mY"><svg width="24" height="24" fill="none" viewBox="0 0 24 24" class="alignMiddle_ZeUO"><path fill="#B3B8D2" d="m23.85 21.426-1.78-2.91a.5.5 0 0 1-.07-.26v-4.13c0-1.78-1.71-3.07-3.52-4.45a.51.51 0 0 1-.2-.36.53.53 0 0 1 .14-.4 4.93 4.93 0 0 0 1.07-5.88 5.08 5.08 0 0 0-8.08-1.29l-1.06 1a.48.48 0 0 1-.67 0l-1.06-1a5.09 5.09 0 0 0-8.09 1.29 5 5 0 0 0 1 5.76l7.76 8a1.06 1.06 0 0 0 .77.32 1.08 1.08 0 0 0 .78-.32.64.64 0 0 0 .14-.66 3.8 3.8 0 0 1-.2-1.38 3.75 3.75 0 0 1 4.92-3.37.49.49 0 0 0 .51-.13l.15-.15a.5.5 0 0 1 .66-.05l.3.23c1.22.92 2.73 2.07 2.73 2.85v4.55a1 1 0 0 0 .15.53l2 3.26a1 1 0 1 0 1.7-1z"></path><path fill="#B3B8D2" d="M16.09 13.196a2.37 2.37 0 0 0-3.19 0 2.38 2.38 0 0 0-.18 3.39l1.63 1.77a.55.55 0 0 1 .13.34v1c0 1.3 1.52 2.59 2 2.95a.9.9 0 0 0 .54.19.88.88 0 0 0 .54-1.57 3.9 3.9 0 0 1-1.31-1.57v-1.57a.86.86 0 0 0-.23-.59l-2-2.18a.58.58 0 0 1-.17-.45.66.66 0 0 1 .21-.44.64.64 0 0 1 .85 0l2 1.86a.874.874 0 1 0 1.19-1.28z"></path></svg><span class="alignMiddle_ZeUO">Crawlee is free and open source</span></div></div><div class="col padding-vert--md col--6 text--right"><span class="builtBy_TvsZ"><span class="alignMiddle_ZeUO">Built by</span><a href="https://apify.com/?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.1.1732041318139&__hsfp=317949576"><svg width="91" height="25" fill="none" viewBox="0 0 91 25" class="alignMiddle_ZeUO"><path fill="#97D700" d="M3.135 2.85A3.41 3.41 0 0 0 .227 6.699l2.016 14.398 8.483-19.304z"></path><path fill="#71C5E8" d="M23.604 14.847 22.811 3.78a3.414 3.414 0 0 0-3.64-3.154c-.077 0-.153.014-.228.025l-3.274.452 7.192 16.124c.54-.67.805-1.52.743-2.379"></path><path fill="#FF9013" d="M5.336 24.595c.58.066 1.169-.02 1.706-.248l12.35-5.211L13.514 5.97z"></path><path fill="#fff" d="M33.83 5.304h3.903l5.448 14.623h-3.494l-1.022-2.994h-5.877l-1.025 2.994h-3.384zm-.177 9.032h4.14l-2-5.994h-.086zM58.842 5.304h3.302v14.623h-3.302zM64.634 5.304h10.71v2.7h-7.4v4.101h5.962v2.632h-5.963v5.186h-3.309zM82.116 14.38l-5.498-9.076h3.748l3.428 6.016h.085l3.599-6.016H91l-5.56 9.054v5.569h-3.324zM51.75 5.304h-7.292v14.623h3.3v-4.634h3.993a4.995 4.995 0 1 0 0-9.99m-.364 7.417h-3.628V7.875h3.627a2.423 2.423 0 0 1 0 4.846"></path></svg></a></span></div></div></div></footer></div>\n<!-- Google Tag Manager (noscript) -->\n <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5P7MCS7" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript>\n <!-- End Google Tag Manager (noscript) -->\n<img src="https://t.co/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=6df82a1e-883f-4b92-9a4d-cead59303881&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=19bc54f9-d5e9-4985-bbba-f51887c8c8c2&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Favoid-blocking&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;"><img src="https://analytics.twitter.com/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=6df82a1e-883f-4b92-9a4d-cead59303881&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=19bc54f9-d5e9-4985-bbba-f51887c8c8c2&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Favoid-blocking&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;">\n<div class="go2933276541 go2369186930" id="hs-web-interactives-top-anchor"><div id="hs-interactives-modal-overlay" class="go1632949049"></div></div>\n<div class="go2933276541 go1348078617" id="hs-web-interactives-bottom-anchor"></div>\n<div id="hs-web-interactives-floating-container">\n <div id="hs-web-interactives-floating-top-left-anchor" class="go2417249464 go613305155">\n </div>\n <div id="hs-web-interactives-floating-top-right-anchor" class="go2417249464 go471583506">\n </div>\n <div id="hs-web-interactives-floating-bottom-left-anchor" class="go2417249464 go3921366393">\n </div>\n <div id="hs-web-interactives-floating-bottom-right-anchor" class="go2417249464 go3967842156">\n </div>\n</div>\n<div style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon316553157779"><img style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon207637371603" width="0" height="0" alt="" src="https://bat.bing.com/action/0?ti=187137944&tm=gtm002&Ver=2&mid=9d993465-de23-4e8f-9a37-01dd434e10e8&bo=2&sid=06dfa930a6a511efbcb1679499971345&vid=06dfe9c0a6a511efacb4e3a24bfa075b&vids=1&msclkid=N&pi=0&lg=en-US&sw=1280&sh=720&sc=24&nwd=1&tl=Avoid%20getting%20blocked%20%7C%20Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&p=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Favoid-blocking&r=&lt=4211&evt=pageLoad&sv=1&asc=G&cdb=AQAQ&rn=121130"></div><iframe height="0" width="0" style="display: none; visibility: hidden;"></iframe><iframe id="intercom-frame" style="position: absolute !important; opacity: 0 !important; width: 1px !important; height: 1px !important; top: 0 !important; left: 0 !important; border: none !important; display: block !important; z-index: -1 !important; pointer-events: none;" aria-hidden="true" tabindex="-1" title="Intercom"></iframe><div class="intercom-lightweight-app"><style id="intercom-lightweight-app-style" type="text/css">\n @keyframes intercom-lightweight-app-launcher {\n from {\n opacity: 0;\n transform: scale(0.5);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes intercom-lightweight-app-gradient {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes intercom-lightweight-app-messenger {\n 0% {\n opacity: 0;\n transform: scale(0);\n }\n 40% {\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n }\n\n .intercom-lightweight-app {\n position: fixed;\n z-index: 2147483001;\n width: 0;\n height: 0;\n font-family: intercom-font, "Helvetica Neue", "Apple Color Emoji", Helvetica, Arial, sans-serif;\n }\n\n .intercom-lightweight-app-gradient {\n position: fixed;\n z-index: 2147483002;\n width: 500px;\n height: 500px;\n bottom: 0;\n right: 0;\n pointer-events: none;\n background: radial-gradient(\n ellipse at bottom right,\n rgba(29, 39, 54, 0.16) 0%,\n rgba(29, 39, 54, 0) 72%);\n animation: intercom-lightweight-app-gradient 200ms ease-out;\n }\n\n .intercom-lightweight-app-launcher {\n position: fixed;\n z-index: 2147483003;\n padding: 0 !important;\n margin: 0 !important;\n border: none;\n bottom: 20px;\n right: 20px;\n max-width: 48px;\n width: 48px;\n max-height: 48px;\n height: 48px;\n border-radius: 50%;\n background: #1480ff;\n cursor: pointer;\n box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.06), 0 2px 32px 0 rgba(0, 0, 0, 0.16);\n transition: transform 167ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n box-sizing: content-box;\n }\n\n\n .intercom-lightweight-app-launcher:hover {\n transition: transform 250ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n transform: scale(1.1)\n }\n\n .intercom-lightweight-app-launcher:active {\n transform: scale(0.85);\n transition: transform 134ms cubic-bezier(0.45, 0, 0.2, 1);\n }\n\n\n .intercom-lightweight-app-launcher:focus {\n outline: none;\n\n \n }\n\n .intercom-lightweight-app-launcher-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n left: 0;\n width: 48px;\n height: 48px;\n transition: transform 100ms linear, opacity 80ms linear;\n }\n\n .intercom-lightweight-app-launcher-icon-open {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-open svg {\n width: 24px;\n height: 24px;\n }\n\n .intercom-lightweight-app-launcher-icon-open svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg {\n height: 44px;\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-custom-icon-open {\n max-height: 24px;\n max-width: 24px;\n\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize {\n \n opacity: 0;\n transform: rotate(-60deg) scale(0);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-messenger {\n position: fixed;\n z-index: 2147483003;\n overflow: hidden;\n background-color: white;\n animation: intercom-lightweight-app-messenger 250ms cubic-bezier(0, 1, 1, 1);\n transform-origin: bottom right;\n\n \n width: 400px;\n height: calc(100% - 40px);\n max-height: 704px;\n min-height: 250px;\n right: 20px;\n bottom: 20px;\n box-shadow: 0 5px 40px rgba(0,0,0,0.16);\n \n\n border-radius: 16px;\n }\n\n .intercom-lightweight-app-messenger-header {\n height: 64px;\n border-bottom: none;\n background: #1480ff\n\n \n }\n\n .intercom-lightweight-app-messenger-footer{\n position:absolute;\n bottom:0;\n width: 100%;\n height: 80px;\n background: #fff;\n font-size: 14px;\n line-height: 21px;\n border-top: 1px solid rgba(0, 0, 0, 0.05);\n box-shadow: 0px 0px 25px rgba(0, 0, 0, 0.05);\n \n }\n\n @media print {\n .intercom-lightweight-app {\n display: none;\n }\n }\n</style></div></body></html>'}, {'url': 'https://crawlee.dev/docs/guides/cheerio-crawler-guide', 'title': 'CheerioCrawler guide | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-3.12 docs-doc-page docs-doc-id-guides/cheerio-crawler-guide" data-has-hydrated="true" data-theme="light" data-announcement-bar-initially-dismissed="false" data-rh="lang,dir,class,data-has-hydrated"><head><meta charset="UTF-8"><meta name="generator" content="Docusaurus v3.6.0"><title>CheerioCrawler guide | Crawlee · Build reliable crawlers. Fast.</title><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:image" content="https://crawlee.dev/img/crawlee-og.png"><meta data-rh="true" name="twitter:image" content="https://crawlee.dev/img/crawlee-og.png"><meta data-rh="true" property="og:url" content="https://crawlee.dev/docs/guides/cheerio-crawler-guide"><meta data-rh="true" property="og:locale" content="en"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docsearch:language" content="en"><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://crawlee.dev/docs/guides/cheerio-crawler-guide"><link data-rh="true" rel="alternate" href="https://crawlee.dev/docs/guides/cheerio-crawler-guide" hreflang="en"><link data-rh="true" rel="alternate" href="https://crawlee.dev/docs/guides/cheerio-crawler-guide" hreflang="x-default"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Crawlee · Build reliable crawlers. Fast. RSS Feed"><link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Crawlee · Build reliable crawlers. Fast. Atom Feed"><link rel="search" type="application/opensearchdescription+xml" title="Crawlee · Build reliable crawlers. Fast." href="/opensearch.xml"><!-- Google Tag Manager --><script async="" src="https://www.clarity.ms/s/0.7.56/clarity.js"></script><script async="" src="https://www.clarity.ms/tag/uet/187137944"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://widget.intercom.io/widget/kod1r788"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/identify_45dd5971.js"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/main.MWQ3ODVjY2ZhNQ.js" data-id="CQHNEL3C77U08RGLR00G"></script><script src="https://js.hsadspixel.net/fb.js" type="text/javascript" id="hs-ads-pixel-19497222" data-ads-portal-id="19497222" data-ads-env="prod" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-banner.com/v2/19497222/banner.js" type="text/javascript" id="cookieBanner-19497222" data-cookieconsent="ignore" data-hs-ignore="true" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hubspot.com/web-interactives-embed.js" type="text/javascript" id="hubspot-web-interactives-loader" crossorigin="anonymous" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-analytics.net/analytics/1732041000000/19497222.js" type="text/javascript" id="hs-analytics"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=CQHNEL3C77U08RGLR00G&lib=ttq"></script><script type="text/javascript" async="" src="https://a.quora.com/qevents.js"></script><script type="text/javascript" async="" src="https://static.ads-twitter.com/uwt.js"></script><script type="text/javascript" async="" src="https://www.redditstatic.com/ads/pixel.js"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://bat.bing.com/bat.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-62P18XN9NS&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-1MGJDMV8DX&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-5P7MCS7"></script><script>!function(e,t,a,n,r){e[n]=e[n]||[],e[n].push({"gtm.start":new Date().getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id="+r+("dataLayer"!=n?"&l="+n:""),g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer","GTM-5P7MCS7")</script><!-- End Google Tag Manager --><script>window.intercomSettings={api_base:"https://api-iam.intercom.io",app_id:"kod1r788"},function(){var t=window,e=t.Intercom;if("function"==typeof e)e("reattach_activator"),e("update",t.intercomSettings);else{var n=document,a=function(){a.c(arguments)};a.q=[],a.c=function(t){a.q.push(t)},t.Intercom=a;var i=function(){var t=n.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://widget.intercom.io/widget/kod1r788";var e=n.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)};"complete"===document.readyState?i():t.attachEvent?t.attachEvent("onload",i):t.addEventListener("load",i,!1)}}()</script><script src="/js/custom.js"></script><link rel="stylesheet" href="/assets/css/styles.ac465ac2.css"><script src="/assets/js/main.a0f1a072.js" defer=""></script><script src="/assets/js/runtime~main.b70d65a1.js" defer=""></script><meta name="viewport" content="width=device-width, initial-scale=1.0" data-rh="true"><meta name="og:description" content="Crawlee helps you build and maintain your crawlers. It\'s open source, but built by developers who scrape millions of pages every day for a living." data-rh="true"><style id="_goober"> .go2933276541{position:fixed;display:block;width:100%;height:0px;margin:0px;padding:0px;overflow:visible;transform-style:preserve-3d;background:transparent;backface-visibility:hidden;pointer-events:none;left:0px;z-index:9998;}.go2369186930{top:0px;z-index:9999;height:100%;width:100%;}.go1348078617{bottom:0px;}.go2417249464{position:fixed;z-index:9989;}.go3921366393{left:0;bottom:0;}.go3967842156{right:0;bottom:0;}.go613305155{left:0;top:0;}.go471583506{right:0;top:0;}.go3670563033{position:relative;overflow:hidden;display:none;}.go1041095097{display:block;}.go1632949049{position:absolute;pointer-events:none;width:101vw;height:101vh;background:rgba(0,0,0,0.7);opacity:0;z-index:-1;}.go2512015367{z-index:99998;opacity:0.8;visibility:visible;pointer-events:all;cursor:pointer;}.go1432718904{overflow:hidden;}.go812842568{display:block !important;position:static !important;box-sizing:border-box !important;background:transparent !important;border:none;min-height:0px !important;max-height:none !important;margin:0px;padding:0px !important;height:100% !important;width:1px !important;max-width:100% !important;min-width:100% !important;}.go4194603687{z-index:99999;visibility:hidden;position:absolute;inset:50vh auto auto 50%;transform:translate(-50%,-50%);left:50%;top:150%;pointer-events:none;max-height:95%;max-width:95%;}.go4258295619{pointer-events:auto !important;visibility:visible;top:50%;transition:top 0.75s linear(0,0.006,0.023 2.2%,0.096 4.8%,0.532 15.4%,0.72 21%,0.793,0.853 26.7%,0.902,0.941,0.968 36.2%,0.987 39.7%,1 43.7%,1.007 48.3%,1.009 55.3%,1.002 78.2%,1 );}.go456419034{transition:opacity 0.3s ease-in;}.go3128134379{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transition:max-height 1s ease-in;}.go494047706{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;}.go2481764524{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;bottom:0px;}.go2685733372{visibility:hidden;}.go2985984737{visibility:visible !important;}.go3281949485{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transform:none !important;}.go3508454897{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;transition:transform 1s linear(0,0.006,0.022 2.3%,0.091 5.1%,0.18 7.6%,0.508 16.3%,0.607,0.691,0.762,0.822 28.4%,0.872,0.912 35.1%,0.944 38.9%,0.968 43%,0.985 47.6%,0.996 53.1%,1.001 58.4%,1.003 65.1%,1 );}.go988075951{z-index:9999;position:fixed;left:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go2699082514{z-index:9999;position:fixed;right:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1595992025{z-index:9999;position:fixed;left:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1222083472{z-index:9999;position:fixed;right:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go722322694{transition:none !important;}.go26732895{cursor:pointer;}.go2083580917{display:flex;justify-content:center;align-items:center;}</style><link rel="preconnect" href="https://5JC94MPMLY-dsn.algolia.net" crossorigin="anonymous" data-rh="true"><meta name="docusaurus_version" content="3.12" data-rh="true"><meta name="docusaurus_tag" content="docs-default-3.12" data-rh="true"><meta name="docsearch:version" content="3.12" data-rh="true"><meta name="docsearch:docusaurus_tag" content="docs-default-3.12" data-rh="true"><meta property="og:title" content="CheerioCrawler guide | Crawlee · Build reliable crawlers. Fast." data-rh="true"><meta name="description" content="Your first steps into the world of scraping with Crawlee" data-rh="true"><meta property="og:description" content="Your first steps into the world of scraping with Crawlee" data-rh="true"><script async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971"></script><script src="https://bat.bing.com/p/action/187137944.js" type="text/javascript" async="" data-ueto="ueto_0b6459093f"></script><link rel="prefetch" href="/assets/js/c4f5d8e4.e74add4a.js"><link rel="prefetch" href="/assets/js/a7456010.2748ec17.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/fc6fe3c2.ca6fce44.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/14eb3368.22117ead.js"><link rel="prefetch" href="/assets/js/08fa83af.1e79e271.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/b22f5575.2fd431df.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/e4ef868e.c59f73f6.js"><link rel="prefetch" href="/assets/js/3f1bdb35.f55b4b21.js"><link rel="prefetch" href="/assets/js/a6aa9e1f.e11bbbf9.js"><link rel="prefetch" href="/assets/js/36994c47.c3291bce.js"><link rel="prefetch" href="/assets/js/814f3328.14399cf4.js"><link rel="prefetch" href="/assets/js/31276798.d914003a.js"><link rel="prefetch" href="/assets/js/ce44969a.a238b80f.js"><link rel="prefetch" href="/assets/js/9e1c89b6.640fdf1b.js"><link rel="prefetch" href="/assets/js/4ade9265.6073ce08.js"><link rel="prefetch" href="/assets/js/a6ac7fdc.7dc1b603.js"><link rel="prefetch" href="/assets/js/664c1011.5a64a880.js"><link rel="prefetch" href="/assets/js/e882a74a.647051f2.js"><link rel="prefetch" href="/assets/js/a3a97bb2.39475c55.js"><link rel="prefetch" href="/assets/js/80f9a068.d1f1c454.js"><link rel="prefetch" href="/assets/js/81508318.b7a58153.js"><link rel="prefetch" href="/assets/js/c15d9823.d72be663.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/417d3089.992650eb.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/a2f94f9e.84d0be54.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/1392715f.697bc3bd.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/1eac2597.a77f0bc6.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/895dc2ad.02ba456a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/b09aeab9.06d7dc78.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/5a965dc3.c091fe29.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/de288364.49dbc262.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/7e17ff59.3343f462.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/3e343dfe.3ae0bfd7.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/005569fa.03d1badb.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/45ec5933.98439670.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/243fdad7.12a2434e.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/8e0b3910.4b0d4061.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/4dd8462f.46e51965.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/ee4763e2.180882c6.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/820fa10b.462e037e.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/a6210f02.f570c547.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/a35c14ad.3f411893.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/c3069cc7.7af90c9a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/11420efc.f390004d.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/32a5c5bc.2cafbad4.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/d9e76d90.fbaf9ec9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/2e5fb620.ff7e28b9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/14eb3368.22117ead.js"><link rel="prefetch" href="/assets/js/963c95ea.8d9326d0.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/9f389b39.c721657b.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/04768a69.a6629773.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><script type="text/javascript" async="" src="https://googleads.g.doubleclick.net/pagead/viewthroughconversion/695293971/?random=1732041333774&cv=11&fst=1732041333774&bg=ffffff&guid=ON&async=1&gtm=45be4be0v9178109438za200zb892235334&gcd=13t3t3t3t5l1&dma=0&tag_exp=101925629~102067555~102067808~102077855&u_w=1280&u_h=720&url=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Fcheerio-crawler-guide&hn=www.googleadservices.com&frm=0&tiba=CheerioCrawler%20guide%20%7C%20Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&did=dZTQ1Zm&gdid=dZTQ1Zm&npa=0&pscdl=noapi&auid=1382210348.1732041319&fdr=QA&data=event%3Dgtag.config&rfmt=3&fmt=4"></script></head><body class="navigation-with-keyboard" data-rh="class" style="overflow: visible;"><div id="hs-web-interactives-top-push-anchor" class="go3670563033"></div><script>!function(){var t,e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t=null!==e?e:window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":(window.matchMedia("(prefers-color-scheme: light)").matches,"light"),document.documentElement.setAttribute("data-theme",t)}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">🎉️ <b><a href="https://crawlee.dev/python/">Crawlee for Python is open to early adopters!</a></b> 🥳️</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"></div><b class="navbar__title text--truncate">Crawlee</b></a><a class="navbar__item navbar__link" href="/docs/quick-start">Docs</a><a class="navbar__item navbar__link" href="/docs/examples">Examples</a><a class="navbar__item navbar__link" href="/api/core">API</a><a class="navbar__item navbar__link changelog" href="/api/core/changelog">Changelog</a><a class="navbar__item navbar__link" href="/blog">Blog</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Node.js</a><ul class="dropdown__menu"><li><a href="#" class="dropdown__link api-version-bound" rel="dofollow">Node.js</a></li><li><a href="https://crawlee.dev/python" rel="dofollow" class="dropdown__link">Python<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a aria-current="page" class="navbar__link active" aria-haspopup="true" aria-expanded="false" role="button" href="/docs/guides/cheerio-crawler-guide">3.12</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/next/guides/cheerio-crawler-guide">Next</a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/docs/guides/cheerio-crawler-guide">3.12</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.11/guides/cheerio-crawler-guide">3.11</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.10/guides/cheerio-crawler-guide">3.10</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.9/guides/cheerio-crawler-guide">3.9</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.8/guides/cheerio-crawler-guide">3.8</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.7/guides/cheerio-crawler-guide">3.7</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.6/guides/cheerio-crawler-guide">3.6</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.5/guides/cheerio-crawler-guide">3.5</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.4/guides/cheerio-crawler-guide">3.4</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.3/guides/cheerio-crawler-guide">3.3</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.2/guides/cheerio-crawler-guide">3.2</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.1/guides/cheerio-crawler-guide">3.1</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.0/guides/cheerio-crawler-guide">3.0</a></li><li><a href="https://sdk.apify.com/docs/guides/getting-started?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.2.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link">2.2<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://sdk.apify.com/docs/1.3.1/guides/getting-started?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.2.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link api-version-bound">1.3<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="toggle_MW0i colorModeToggle_x44X"><button class="clean-btn toggleButton_yw5v" type="button" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><span><svg viewBox="0 0 13 12" fill="none" width="14" height="14" class="lightToggleIcon_SFTY"><g clip-path="url(#clip0_833_8168)"><path d="M6.59998 8.49999C7.98069 8.49999 9.09998 7.3807 9.09998 5.99999C9.09998 4.61928 7.98069 3.49999 6.59998 3.49999C5.21926 3.49999 4.09998 4.61928 4.09998 5.99999C4.09998 7.3807 5.21926 8.49999 6.59998 8.49999Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 0.5V1.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 10.5V11.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 2.11L3.4199 2.82" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 9.17999L10.4899 9.88999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1.09998 6H2.09998" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.0999 6H12.0999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 9.88999L3.4199 9.17999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 2.82L10.4899 2.11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></g><defs><clipPath id="clip0_833_8168"><rect width="12" height="12" fill="white" transform="translate(0.599976)"></rect></clipPath></defs></svg><svg viewBox="0 0 13 12" width="14" height="14" class="darkToggleIcon_ekgs"><path d="M10.7001 6.39501C10.6215 7.24611 10.3021 8.05721 9.77927 8.7334C9.25646 9.40959 8.55189 9.92291 7.748 10.2133C6.9441 10.5036 6.07414 10.5591 5.2399 10.3731C4.40565 10.187 3.64164 9.76728 3.03726 9.1629C2.43287 8.55851 2.01312 7.7945 1.8271 6.96026C1.64108 6.12602 1.6965 5.25605 1.98688 4.45216C2.27725 3.64826 2.79056 2.94369 3.46675 2.42088C4.14294 1.89808 4.95404 1.57866 5.80515 1.50001C5.30685 2.17414 5.06707 3.00473 5.12941 3.84071C5.19175 4.6767 5.55208 5.46254 6.14485 6.05531C6.73762 6.64808 7.52346 7.0084 8.35944 7.07074C9.19542 7.13308 10.026 6.8933 10.7001 6.39501Z" stroke="currentColor" fill="transparent" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button></div><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="View on GitHub">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="Chat on Discord">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"><svg width="15" height="15" class="DocSearch-Control-Key-Icon"><path d="M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953" stroke-width="1.2" stroke="currentColor" fill="none" stroke-linecap="square"></path></svg></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"><b>Crawlee</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/quick-start">Quick Start</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/introduction">Introduction</a><button aria-label="Collapse sidebar category \'Introduction\'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/setting-up">Setting up</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/first-crawler">First crawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/adding-urls">Adding more URLs</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/real-world-project">Real-world project</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/crawling">Crawling</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/scraping">Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/saving-data">Saving data</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/refactoring">Refactoring</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/deployment">Running in the Cloud</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/docs/guides">Guides</a><button aria-label="Collapse sidebar category \'Guides\'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/request-storage">Request Storage</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/result-storage">Result Storage</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/configuration">Configuration</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/guides/cheerio-crawler-guide">CheerioCrawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/javascript-rendering">JavaScript rendering</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/proxy-management">Proxy Management</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/session-management">Session Management</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/scaling-crawlers">Scaling our crawlers</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/avoid-blocking">Avoid getting blocked</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/jsdom-crawler-guide">JSDOMCrawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/got-scraping">Got Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/typescript-project">TypeScript Projects</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/docker-images">Running in Docker</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/parallel-scraping">Parallel Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/custom-http-client">Using a custom HTTP client (Experimental)</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/deployment">Deployment</a><button aria-label="Expand sidebar category \'Deployment\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/examples">Examples</a><button aria-label="Expand sidebar category \'Examples\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/experiments">Experiments</a><button aria-label="Expand sidebar category \'Experiments\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/upgrading">Upgrading</a><button aria-label="Expand sidebar category \'Upgrading\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_z5aJ"><div class="docItemContainer_c0TR"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/guides"><span itemprop="name">Guides</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">CheerioCrawler</span><meta itemprop="position" content="2"></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 3.12</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>CheerioCrawler guide</h1></header><p>\u200b<a href="/api/cheerio-crawler/class/CheerioCrawler"><code>CheerioCrawler</code></a> is our simplest and fastest crawler. If you\'re familiar with <a href="https://jquery.com/" target="_blank" rel="noopener">jQuery</a>, you\'ll understand <code>CheerioCrawler</code> in minutes.</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="what-is-cheerio">What is Cheerio<a href="#what-is-cheerio" class="hash-link" aria-label="Direct link to What is Cheerio" title="Direct link to What is Cheerio">\u200b</a></h2>\n<p><a href="https://cheerio.js.org/" target="_blank" rel="noopener">Cheerio</a> is essentially <a href="https://jquery.com/" target="_blank" rel="noopener">jQuery</a> for Node.js. It offers the same API, including the familiar <code>$</code> object. You can use it, as you would use jQuery for manipulating the DOM of an HTML page. In crawling, you\'ll mostly use it to select the needed elements and extract their values - the data you\'re interested in. But jQuery runs in a browser and attaches directly to the browser\'s DOM. Where does <code>cheerio</code> get its HTML? This is where the <code>Crawler</code> part of <a href="/api/cheerio-crawler/class/CheerioCrawler"><code>CheerioCrawler</code></a> comes in.</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-the-crawler-works">How the crawler works<a href="#how-the-crawler-works" class="hash-link" aria-label="Direct link to How the crawler works" title="Direct link to How the crawler works">\u200b</a></h2>\n<p>\u200b<a href="/api/cheerio-crawler/class/CheerioCrawler"><code>CheerioCrawler</code></a> crawls by making plain HTTP requests to the provided URLs using the specialized <a href="https://github.com/apify/got-scraping" target="_blank" rel="noopener">got-scraping</a> HTTP client. The URLs are fed to the crawler using <a href="/api/core/class/RequestQueue"><code>RequestQueue</code></a>. The HTTP responses it gets back are usually HTML pages. The same pages you would get in your browser when you first load a URL. But it can handle any content types with the help of the <a href="/api/cheerio-crawler/interface/CheerioCrawlerOptions#additionalMimeTypes"><code>additionalMimeTypes</code></a> option.</p>\n<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Modern web pages often do not serve all of their content in the first HTML response, but rather the first HTML contains links to other resources such as CSS and JavaScript that get downloaded afterwards, and together they create the final page. To crawl those, see <a href="/api/puppeteer-crawler/class/PuppeteerCrawler"><code>PuppeteerCrawler</code></a> and <a href="/api/playwright-crawler/class/PlaywrightCrawler"><code>PlaywrightCrawler</code></a>.</p></div></div>\n<p>Once the page\'s HTML is retrieved, the crawler will pass it to <a href="https://github.com/cheeriojs/cheerio" target="_blank" rel="noopener">Cheerio</a> for parsing. The result is the typical <code>$</code> function, which should be familiar to jQuery users. You can use the <code>$</code> function to do all sorts of lookups and manipulation of the page\'s HTML, but in scraping, you will mostly use it to find specific HTML elements and extract their data.</p>\n<p>Example use of Cheerio and its <code>$</code> function in comparison to browser JavaScript:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Return the text content of the <title> element.</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain">document</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">querySelector</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'title\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">textContent</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// plain JS</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token function" style="color: rgb(215, 58, 73);">$</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'title\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">text</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Cheerio</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain" style="display: inline-block;"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Return an array of all \'href\' links on the page.</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token builtin">Array</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">from</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token plain">document</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">querySelectorAll</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'[href]\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">map</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token plain">el </span><span class="token operator" style="color: rgb(57, 58, 52);">=></span><span class="token plain"> el</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">href</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// plain JS</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"></span><span class="token function" style="color: rgb(215, 58, 73);">$</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'[href]\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">map</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token plain">i</span><span class="token punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token plain"> el</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token operator" style="color: rgb(57, 58, 52);">=></span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">$</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token plain">el</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">attr</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'href\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token function" style="color: rgb(215, 58, 73);">get</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Cheerio</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><p>This is not to show that Cheerio is better than plain browser JavaScript. Some might actually prefer the more expressive way plain JS provides. Unfortunately, the browser JavaScript methods are not available in Node.js, so Cheerio is your best bet to do the parsing in Node.js.</p></div></div>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="when-to-use-cheeriocrawler">When to use <code>CheerioCrawler</code><a href="#when-to-use-cheeriocrawler" class="hash-link" aria-label="Direct link to when-to-use-cheeriocrawler" title="Direct link to when-to-use-cheeriocrawler">\u200b</a></h2>\n<p><code>CheerioCrawler</code> really shines when you need to cope with extremely high workloads. With just 4 GBs of memory and a single CPU core, you can scrape 500 or more pages a minute! <em>(assuming each page contains approximately 400KB of HTML)</em>. To scrape this fast with a full browser scraper, such as the <a href="/api/playwright-crawler/class/PlaywrightCrawler"><code>PlaywrightCrawler</code></a>, you\'d need significantly more computing power.</p>\n<p><strong>Advantages:</strong></p>\n<ul>\n<li>Extremely fast and cheap to run</li>\n<li>Easy to set up</li>\n<li>Familiar for jQuery users</li>\n<li>Automatically avoids some anti-scraping bans</li>\n</ul>\n<p><strong>Disadvantages:</strong></p>\n<ul>\n<li>Does not work for websites that require JavaScript rendering</li>\n<li>May easily overload the target website with requests</li>\n<li>Does not enable any manipulation of the website before scraping</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="web-scraping-with-cheerio-examples">Web scraping with Cheerio: Examples<a href="#web-scraping-with-cheerio-examples" class="hash-link" aria-label="Direct link to Web scraping with Cheerio: Examples" title="Direct link to Web scraping with Cheerio: Examples">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="get-text-content-of-an-element">Get text content of an element<a href="#get-text-content-of-an-element" class="hash-link" aria-label="Direct link to Get text content of an element" title="Direct link to Get text content of an element">\u200b</a></h3>\n<p>Finds the first <code><h2></code> element and returns its text content.</p>\n<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token function" style="color: rgb(215, 58, 73);">$</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'h2\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token method function property-access" style="color: rgb(215, 58, 73);">text</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="find-all-links-on-a-page">Find all links on a page<a href="#find-all-links-on-a-page" class="hash-link" aria-label="Direct link to Find all links on a page" title="Direct link to Find all links on a page">\u200b</a></h3>\n<p>This snippet finds all <code><a></code> elements which have the <code>href</code> attribute and extracts the hrefs into an array.</p>\n<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token function" style="color: rgb(215, 58, 73);">$</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'a[href]\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token method function property-access" style="color: rgb(215, 58, 73);">map</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token parameter">i</span><span class="token parameter punctuation" style="color: rgb(57, 58, 52);">,</span><span class="token parameter"> el</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token arrow operator" style="color: rgb(57, 58, 52);">=></span><span class="token plain"> </span><span class="token function" style="color: rgb(215, 58, 73);">$</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token plain">el</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token method function property-access" style="color: rgb(215, 58, 73);">attr</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'href\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain"> </span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token method function property-access" style="color: rgb(215, 58, 73);">get</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="other-examples">Other examples<a href="#other-examples" class="hash-link" aria-label="Direct link to Other examples" title="Direct link to Other examples">\u200b</a></h3>\n<p>Visit the <a href="/docs/examples">Examples</a> section to browse examples of <code>CheerioCrawler</code> usage. Almost all examples show <code>CheerioCrawler</code> code in their code tabs.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/apify/crawlee/edit/master/website/versioned_docs/version-3.12/guides/cheerio_crawler.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2024-11-19T17:31:40.000Z" itemprop="dateModified">Nov 19, 2024</time></b> by <b>Saurav Jain</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/guides/configuration"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Configuration</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/guides/javascript-rendering"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">JavaScript rendering</div></a></nav><giscus-widget id="giscus-comments" repo="apify/crawlee" repoid="MDEwOlJlcG9zaXRvcnk2NjY3MDgxOQ=" category="Comments" categoryid="DIC_kwDOA_lQ484CQufN" mapping="pathname" strict="1" reactionsenabled="1" emitmetadata="0" inputposition="top" theme="light" lang="en" host="https://giscus.app" loading="eager"></giscus-widget></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#what-is-cheerio" class="table-of-contents__link toc-highlight">What is Cheerio</a></li><li><a href="#how-the-crawler-works" class="table-of-contents__link toc-highlight">How the crawler works</a></li><li><a href="#when-to-use-cheeriocrawler" class="table-of-contents__link toc-highlight">When to use <code>CheerioCrawler</code></a></li><li><a href="#web-scraping-with-cheerio-examples" class="table-of-contents__link toc-highlight">Web scraping with Cheerio: Examples</a><ul><li><a href="#get-text-content-of-an-element" class="table-of-contents__link toc-highlight">Get text content of an element</a></li><li><a href="#find-all-links-on-a-page" class="table-of-contents__link toc-highlight">Find all links on a page</a></li><li><a href="#other-examples" class="table-of-contents__link toc-highlight">Other examples</a></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="footer_J6tW light"><div class="container padding-horiz--lg"><div class="row"><div class="col col--5"><div class="row"><div class="col col--6"><div class="footerTitle_tbhc">Docs</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/guides">Guides</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/examples">Examples</a></li><li class="footer__item"><a class="footer__link-item" href="/api/core">API reference</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/upgrading/upgrading-to-v3">Upgrading to v3</a></li></ul></div><div class="col col--6"><div class="footerTitle_tbhc">Community</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/apify" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div><div class="col col--7"><div class="row"><div class="col col--3 col--offset-9"><div class="footerTitle_tbhc">More</div><ul class="clean-list"><li class="footer__item"><a href="https://apify.com/?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.2.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="footer__link-item">Apify Platform<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://docusaurus.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Docusaurus<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div></div><div class="row padding-vert--md padding-top--lg"><div class="col padding-vert--md col--6"><div class="freeAndOpenSource_V9mY"><svg width="24" height="24" fill="none" viewBox="0 0 24 24" class="alignMiddle_ZeUO"><path fill="#B3B8D2" d="m23.85 21.426-1.78-2.91a.5.5 0 0 1-.07-.26v-4.13c0-1.78-1.71-3.07-3.52-4.45a.51.51 0 0 1-.2-.36.53.53 0 0 1 .14-.4 4.93 4.93 0 0 0 1.07-5.88 5.08 5.08 0 0 0-8.08-1.29l-1.06 1a.48.48 0 0 1-.67 0l-1.06-1a5.09 5.09 0 0 0-8.09 1.29 5 5 0 0 0 1 5.76l7.76 8a1.06 1.06 0 0 0 .77.32 1.08 1.08 0 0 0 .78-.32.64.64 0 0 0 .14-.66 3.8 3.8 0 0 1-.2-1.38 3.75 3.75 0 0 1 4.92-3.37.49.49 0 0 0 .51-.13l.15-.15a.5.5 0 0 1 .66-.05l.3.23c1.22.92 2.73 2.07 2.73 2.85v4.55a1 1 0 0 0 .15.53l2 3.26a1 1 0 1 0 1.7-1z"></path><path fill="#B3B8D2" d="M16.09 13.196a2.37 2.37 0 0 0-3.19 0 2.38 2.38 0 0 0-.18 3.39l1.63 1.77a.55.55 0 0 1 .13.34v1c0 1.3 1.52 2.59 2 2.95a.9.9 0 0 0 .54.19.88.88 0 0 0 .54-1.57 3.9 3.9 0 0 1-1.31-1.57v-1.57a.86.86 0 0 0-.23-.59l-2-2.18a.58.58 0 0 1-.17-.45.66.66 0 0 1 .21-.44.64.64 0 0 1 .85 0l2 1.86a.874.874 0 1 0 1.19-1.28z"></path></svg><span class="alignMiddle_ZeUO">Crawlee is free and open source</span></div></div><div class="col padding-vert--md col--6 text--right"><span class="builtBy_TvsZ"><span class="alignMiddle_ZeUO">Built by</span><a href="https://apify.com/?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.2.1732041318139&__hsfp=317949576"><svg width="91" height="25" fill="none" viewBox="0 0 91 25" class="alignMiddle_ZeUO"><path fill="#97D700" d="M3.135 2.85A3.41 3.41 0 0 0 .227 6.699l2.016 14.398 8.483-19.304z"></path><path fill="#71C5E8" d="M23.604 14.847 22.811 3.78a3.414 3.414 0 0 0-3.64-3.154c-.077 0-.153.014-.228.025l-3.274.452 7.192 16.124c.54-.67.805-1.52.743-2.379"></path><path fill="#FF9013" d="M5.336 24.595c.58.066 1.169-.02 1.706-.248l12.35-5.211L13.514 5.97z"></path><path fill="#fff" d="M33.83 5.304h3.903l5.448 14.623h-3.494l-1.022-2.994h-5.877l-1.025 2.994h-3.384zm-.177 9.032h4.14l-2-5.994h-.086zM58.842 5.304h3.302v14.623h-3.302zM64.634 5.304h10.71v2.7h-7.4v4.101h5.962v2.632h-5.963v5.186h-3.309zM82.116 14.38l-5.498-9.076h3.748l3.428 6.016h.085l3.599-6.016H91l-5.56 9.054v5.569h-3.324zM51.75 5.304h-7.292v14.623h3.3v-4.634h3.993a4.995 4.995 0 1 0 0-9.99m-.364 7.417h-3.628V7.875h3.627a2.423 2.423 0 0 1 0 4.846"></path></svg></a></span></div></div></div></footer></div>\n<!-- Google Tag Manager (noscript) -->\n <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5P7MCS7" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript>\n <!-- End Google Tag Manager (noscript) -->\n<script id="hs-script-loader" text="" charset="" type="text/javascript" src="//js.hs-scripts.com/19497222.js"></script>\n<script type="text/javascript" id="" charset="">!function(d,g,e){d.TiktokAnalyticsObject=e;var a=d[e]=d[e]||[];a.methods="page track identify instances debug on off once ready alias group enableCookie disableCookie holdConsent revokeConsent grantConsent".split(" ");a.setAndDefer=function(b,c){b[c]=function(){b.push([c].concat(Array.prototype.slice.call(arguments,0)))}};for(d=0;d<a.methods.length;d++)a.setAndDefer(a,a.methods[d]);a.instance=function(b){b=a._i[b]||[];for(var c=0;c<a.methods.length;c++)a.setAndDefer(b,a.methods[c]);return b};a.load=\nfunction(b,c){var f="https://analytics.tiktok.com/i18n/pixel/events.js";a._i=a._i||{};a._i[b]=[];a._i[b]._u=f;a._t=a._t||{};a._t[b]=+new Date;a._o=a._o||{};a._o[b]=c||{};c=document.createElement("script");c.type="text/javascript";c.async=!0;c.src=f+"?sdkid\\x3d"+b+"\\x26lib\\x3d"+e;b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(c,b)};a.load("CQHNEL3C77U08RGLR00G");a.page()}(window,document,"ttq");</script>\n\n<img src="https://t.co/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=65f44596-d839-4b21-9f1d-a91bb369958f&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=6eeba56f-e044-4971-91b8-772c50936476&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Fcheerio-crawler-guide&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;"><img src="https://analytics.twitter.com/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=65f44596-d839-4b21-9f1d-a91bb369958f&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=6eeba56f-e044-4971-91b8-772c50936476&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Fcheerio-crawler-guide&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;">\n<div class="go2933276541 go2369186930" id="hs-web-interactives-top-anchor"><div id="hs-interactives-modal-overlay" class="go1632949049"></div></div>\n<div class="go2933276541 go1348078617" id="hs-web-interactives-bottom-anchor"></div>\n<div id="hs-web-interactives-floating-container">\n <div id="hs-web-interactives-floating-top-left-anchor" class="go2417249464 go613305155">\n </div>\n <div id="hs-web-interactives-floating-top-right-anchor" class="go2417249464 go471583506">\n </div>\n <div id="hs-web-interactives-floating-bottom-left-anchor" class="go2417249464 go3921366393">\n </div>\n <div id="hs-web-interactives-floating-bottom-right-anchor" class="go2417249464 go3967842156">\n </div>\n</div>\n<div style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon436484916455"><img style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon136227154137" width="0" height="0" alt="" src="https://bat.bing.com/action/0?ti=187137944&tm=gtm002&Ver=2&mid=f5e6eb5e-d17d-4e41-9e32-816653d24f38&bo=2&sid=06dfa930a6a511efbcb1679499971345&vid=06dfe9c0a6a511efacb4e3a24bfa075b&vids=0&msclkid=N&pi=0&lg=en-US&sw=1280&sh=720&sc=24&nwd=1&tl=CheerioCrawler%20guide%20%7C%20Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&p=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Fcheerio-crawler-guide&r=&lt=5741&evt=pageLoad&sv=1&asc=G&cdb=AQAA&rn=58553"></div><iframe height="0" width="0" style="display: none; visibility: hidden;"></iframe><iframe id="intercom-frame" style="position: absolute !important; opacity: 0 !important; width: 1px !important; height: 1px !important; top: 0 !important; left: 0 !important; border: none !important; display: block !important; z-index: -1 !important; pointer-events: none;" aria-hidden="true" tabindex="-1" title="Intercom"></iframe><div class="intercom-lightweight-app"><style id="intercom-lightweight-app-style" type="text/css">\n @keyframes intercom-lightweight-app-launcher {\n from {\n opacity: 0;\n transform: scale(0.5);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes intercom-lightweight-app-gradient {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes intercom-lightweight-app-messenger {\n 0% {\n opacity: 0;\n transform: scale(0);\n }\n 40% {\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n }\n\n .intercom-lightweight-app {\n position: fixed;\n z-index: 2147483001;\n width: 0;\n height: 0;\n font-family: intercom-font, "Helvetica Neue", "Apple Color Emoji", Helvetica, Arial, sans-serif;\n }\n\n .intercom-lightweight-app-gradient {\n position: fixed;\n z-index: 2147483002;\n width: 500px;\n height: 500px;\n bottom: 0;\n right: 0;\n pointer-events: none;\n background: radial-gradient(\n ellipse at bottom right,\n rgba(29, 39, 54, 0.16) 0%,\n rgba(29, 39, 54, 0) 72%);\n animation: intercom-lightweight-app-gradient 200ms ease-out;\n }\n\n .intercom-lightweight-app-launcher {\n position: fixed;\n z-index: 2147483003;\n padding: 0 !important;\n margin: 0 !important;\n border: none;\n bottom: 20px;\n right: 20px;\n max-width: 48px;\n width: 48px;\n max-height: 48px;\n height: 48px;\n border-radius: 50%;\n background: #1480ff;\n cursor: pointer;\n box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.06), 0 2px 32px 0 rgba(0, 0, 0, 0.16);\n transition: transform 167ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n box-sizing: content-box;\n }\n\n\n .intercom-lightweight-app-launcher:hover {\n transition: transform 250ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n transform: scale(1.1)\n }\n\n .intercom-lightweight-app-launcher:active {\n transform: scale(0.85);\n transition: transform 134ms cubic-bezier(0.45, 0, 0.2, 1);\n }\n\n\n .intercom-lightweight-app-launcher:focus {\n outline: none;\n\n \n }\n\n .intercom-lightweight-app-launcher-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n left: 0;\n width: 48px;\n height: 48px;\n transition: transform 100ms linear, opacity 80ms linear;\n }\n\n .intercom-lightweight-app-launcher-icon-open {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-open svg {\n width: 24px;\n height: 24px;\n }\n\n .intercom-lightweight-app-launcher-icon-open svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg {\n height: 44px;\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-custom-icon-open {\n max-height: 24px;\n max-width: 24px;\n\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize {\n \n opacity: 0;\n transform: rotate(-60deg) scale(0);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-messenger {\n position: fixed;\n z-index: 2147483003;\n overflow: hidden;\n background-color: white;\n animation: intercom-lightweight-app-messenger 250ms cubic-bezier(0, 1, 1, 1);\n transform-origin: bottom right;\n\n \n width: 400px;\n height: calc(100% - 40px);\n max-height: 704px;\n min-height: 250px;\n right: 20px;\n bottom: 20px;\n box-shadow: 0 5px 40px rgba(0,0,0,0.16);\n \n\n border-radius: 16px;\n }\n\n .intercom-lightweight-app-messenger-header {\n height: 64px;\n border-bottom: none;\n background: #1480ff\n\n \n }\n\n .intercom-lightweight-app-messenger-footer{\n position:absolute;\n bottom:0;\n width: 100%;\n height: 80px;\n background: #fff;\n font-size: 14px;\n line-height: 21px;\n border-top: 1px solid rgba(0, 0, 0, 0.05);\n box-shadow: 0px 0px 25px rgba(0, 0, 0, 0.05);\n \n }\n\n @media print {\n .intercom-lightweight-app {\n display: none;\n }\n }\n</style></div></body></html>'}, {'url': 'https://crawlee.dev/docs/guides/jsdom-crawler-guide', 'title': 'JSDOMCrawler guide | Crawlee · Build reliable crawlers. Fast.', 'content': '<!DOCTYPE html><html lang="en" dir="ltr" class="docs-wrapper plugin-docs plugin-id-default docs-version-3.12 docs-doc-page docs-doc-id-guides/jsdom-crawler-guide" data-has-hydrated="true" data-theme="light" data-announcement-bar-initially-dismissed="false" data-rh="lang,dir,class,data-has-hydrated"><head><meta charset="UTF-8"><meta name="generator" content="Docusaurus v3.6.0"><title>JSDOMCrawler guide | Crawlee · Build reliable crawlers. Fast.</title><link data-rh="true" rel="icon" href="/img/favicon.ico"><link rel="alternate" type="application/rss+xml" href="/blog/rss.xml" title="Crawlee · Build reliable crawlers. Fast. RSS Feed"><link rel="alternate" type="application/atom+xml" href="/blog/atom.xml" title="Crawlee · Build reliable crawlers. Fast. Atom Feed"><link rel="search" type="application/opensearchdescription+xml" title="Crawlee · Build reliable crawlers. Fast." href="/opensearch.xml"><!-- Google Tag Manager --><script async="" src="https://www.clarity.ms/s/0.7.56/clarity.js"></script><script async="" src="https://www.clarity.ms/tag/uet/187137944"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://widget.intercom.io/widget/kod1r788"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/identify_45dd5971.js"></script><script src="https://js.hs-banner.com/v2/19497222/banner.js" type="text/javascript" id="cookieBanner-19497222" data-cookieconsent="ignore" data-hs-ignore="true" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hsadspixel.net/fb.js" type="text/javascript" id="hs-ads-pixel-19497222" data-ads-portal-id="19497222" data-ads-env="prod" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script src="https://js.hs-analytics.net/analytics/1732041300000/19497222.js" type="text/javascript" id="hs-analytics"></script><script src="https://js.hubspot.com/web-interactives-embed.js" type="text/javascript" id="hubspot-web-interactives-loader" crossorigin="anonymous" data-loader="hs-scriptloader" data-hsjs-portal="19497222" data-hsjs-env="prod" data-hsjs-hublet="na1"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/static/main.MWQ3ODVjY2ZhNQ.js" data-id="CQHNEL3C77U08RGLR00G"></script><script type="text/javascript" async="" src="https://analytics.tiktok.com/i18n/pixel/events.js?sdkid=CQHNEL3C77U08RGLR00G&lib=ttq"></script><script type="text/javascript" async="" src="https://a.quora.com/qevents.js"></script><script type="text/javascript" async="" src="https://static.ads-twitter.com/uwt.js"></script><script type="text/javascript" async="" src="https://www.redditstatic.com/ads/pixel.js"></script><script type="text/javascript" async="" src="https://snap.licdn.com/li.lms-analytics/insight.min.js"></script><script type="text/javascript" async="" src="https://bat.bing.com/bat.js"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-62P18XN9NS&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script type="text/javascript" async="" src="https://www.googletagmanager.com/gtag/js?id=G-1MGJDMV8DX&l=dataLayer&cx=c&gtm=45He4be0v892235334za200"></script><script async="" src="https://www.googletagmanager.com/gtm.js?id=GTM-5P7MCS7"></script><script>!function(e,t,a,n,r){e[n]=e[n]||[],e[n].push({"gtm.start":new Date().getTime(),event:"gtm.js"});var g=t.getElementsByTagName(a)[0],m=t.createElement(a);m.async=!0,m.src="https://www.googletagmanager.com/gtm.js?id="+r+("dataLayer"!=n?"&l="+n:""),g.parentNode.insertBefore(m,g)}(window,document,"script","dataLayer","GTM-5P7MCS7")</script><!-- End Google Tag Manager --><script>window.intercomSettings={api_base:"https://api-iam.intercom.io",app_id:"kod1r788"},function(){var t=window,e=t.Intercom;if("function"==typeof e)e("reattach_activator"),e("update",t.intercomSettings);else{var n=document,a=function(){a.c(arguments)};a.q=[],a.c=function(t){a.q.push(t)},t.Intercom=a;var i=function(){var t=n.createElement("script");t.type="text/javascript",t.async=!0,t.src="https://widget.intercom.io/widget/kod1r788";var e=n.getElementsByTagName("script")[0];e.parentNode.insertBefore(t,e)};"complete"===document.readyState?i():t.attachEvent?t.attachEvent("onload",i):t.addEventListener("load",i,!1)}}()</script><script src="/js/custom.js"></script><link rel="stylesheet" href="/assets/css/styles.ac465ac2.css"><script src="/assets/js/main.a0f1a072.js" defer=""></script><script src="/assets/js/runtime~main.b70d65a1.js" defer=""></script><style id="_goober"> .go2933276541{position:fixed;display:block;width:100%;height:0px;margin:0px;padding:0px;overflow:visible;transform-style:preserve-3d;background:transparent;backface-visibility:hidden;pointer-events:none;left:0px;z-index:9998;}.go2369186930{top:0px;z-index:9999;height:100%;width:100%;}.go1348078617{bottom:0px;}.go2417249464{position:fixed;z-index:9989;}.go3921366393{left:0;bottom:0;}.go3967842156{right:0;bottom:0;}.go613305155{left:0;top:0;}.go471583506{right:0;top:0;}.go3670563033{position:relative;overflow:hidden;display:none;}.go1041095097{display:block;}.go1632949049{position:absolute;pointer-events:none;width:101vw;height:101vh;background:rgba(0,0,0,0.7);opacity:0;z-index:-1;}.go2512015367{z-index:99998;opacity:0.8;visibility:visible;pointer-events:all;cursor:pointer;}.go1432718904{overflow:hidden;}.go812842568{display:block !important;position:static !important;box-sizing:border-box !important;background:transparent !important;border:none;min-height:0px !important;max-height:none !important;margin:0px;padding:0px !important;height:100% !important;width:1px !important;max-width:100% !important;min-width:100% !important;}.go4194603687{z-index:99999;visibility:hidden;position:absolute;inset:50vh auto auto 50%;transform:translate(-50%,-50%);left:50%;top:150%;pointer-events:none;max-height:95%;max-width:95%;}.go4258295619{pointer-events:auto !important;visibility:visible;top:50%;transition:top 0.75s linear(0,0.006,0.023 2.2%,0.096 4.8%,0.532 15.4%,0.72 21%,0.793,0.853 26.7%,0.902,0.941,0.968 36.2%,0.987 39.7%,1 43.7%,1.007 48.3%,1.009 55.3%,1.002 78.2%,1 );}.go456419034{transition:opacity 0.3s ease-in;}.go3128134379{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transition:max-height 1s ease-in;}.go494047706{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;}.go2481764524{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;bottom:0px;}.go2685733372{visibility:hidden;}.go2985984737{visibility:visible !important;}.go3281949485{pointer-events:auto !important;visibility:visible !important;max-height:95vh !important;transform:none !important;}.go3508454897{z-index:9999;width:100%;max-height:95%;position:fixed;visibility:hidden;transition:transform 1s linear(0,0.006,0.022 2.3%,0.091 5.1%,0.18 7.6%,0.508 16.3%,0.607,0.691,0.762,0.822 28.4%,0.872,0.912 35.1%,0.944 38.9%,0.968 43%,0.985 47.6%,0.996 53.1%,1.001 58.4%,1.003 65.1%,1 );}.go988075951{z-index:9999;position:fixed;left:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go2699082514{z-index:9999;position:fixed;right:10px;top:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1595992025{z-index:9999;position:fixed;left:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go1222083472{z-index:9999;position:fixed;right:10px;bottom:10px;max-height:95vh !important;max-width:95%;visibility:hidden;}.go722322694{transition:none !important;}.go26732895{cursor:pointer;}.go2083580917{display:flex;justify-content:center;align-items:center;}</style><meta name="viewport" content="width=device-width, initial-scale=1.0" data-rh="true"><link rel="canonical" href="https://crawlee.dev/docs/guides/jsdom-crawler-guide" data-rh="true"><link rel="alternate" href="https://crawlee.dev/docs/guides/jsdom-crawler-guide" hreflang="en" data-rh="true"><link rel="alternate" href="https://crawlee.dev/docs/guides/jsdom-crawler-guide" hreflang="x-default" data-rh="true"><meta name="twitter:card" content="summary_large_image" data-rh="true"><meta property="og:image" content="https://crawlee.dev/img/crawlee-og.png" data-rh="true"><meta name="twitter:image" content="https://crawlee.dev/img/crawlee-og.png" data-rh="true"><meta property="og:url" content="https://crawlee.dev/docs/guides/jsdom-crawler-guide" data-rh="true"><meta property="og:locale" content="en" data-rh="true"><meta name="docusaurus_locale" content="en" data-rh="true"><meta name="docsearch:language" content="en" data-rh="true"><meta name="og:description" content="Crawlee helps you build and maintain your crawlers. It\'s open source, but built by developers who scrape millions of pages every day for a living." data-rh="true"><script src="https://bat.bing.com/p/action/187137944.js" type="text/javascript" async="" data-ueto="ueto_d2e746e3ae"></script><script async="" src="https://www.googletagmanager.com/gtag/js?id=AW-695293971"></script><link rel="preconnect" href="https://5JC94MPMLY-dsn.algolia.net" crossorigin="anonymous" data-rh="true"><meta name="docusaurus_version" content="3.12" data-rh="true"><meta name="docusaurus_tag" content="docs-default-3.12" data-rh="true"><meta name="docsearch:version" content="3.12" data-rh="true"><meta name="docsearch:docusaurus_tag" content="docs-default-3.12" data-rh="true"><script type="text/javascript" async="" src="https://googleads.g.doubleclick.net/pagead/viewthroughconversion/695293971/?random=1732041352536&cv=11&fst=1732041352536&bg=ffffff&guid=ON&async=1&gtm=45be4be0v9178109438za200zb892235334&gcd=13t3t3t3t5l1&dma=0&tag_exp=101925629~102067555~102067808~102077855&u_w=1280&u_h=720&url=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Fjsdom-crawler-guide&hn=www.googleadservices.com&frm=0&tiba=Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&did=dZTQ1Zm&gdid=dZTQ1Zm&npa=0&pscdl=noapi&auid=1382210348.1732041319&fdr=QA&data=event%3Dgtag.config&rfmt=3&fmt=4"></script><meta property="og:title" content="JSDOMCrawler guide | Crawlee · Build reliable crawlers. Fast." data-rh="true"><meta name="description" content="Your first steps into the world of scraping with Crawlee" data-rh="true"><meta property="og:description" content="Your first steps into the world of scraping with Crawlee" data-rh="true"><link rel="prefetch" href="/assets/js/c4f5d8e4.e74add4a.js"><link rel="prefetch" href="/assets/js/a7456010.2748ec17.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/fc6fe3c2.ca6fce44.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/14eb3368.22117ead.js"><link rel="prefetch" href="/assets/js/08fa83af.1e79e271.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/b22f5575.2fd431df.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/e4ef868e.c59f73f6.js"><link rel="prefetch" href="/assets/js/3f1bdb35.f55b4b21.js"><link rel="prefetch" href="/assets/js/a6aa9e1f.e11bbbf9.js"><link rel="prefetch" href="/assets/js/36994c47.c3291bce.js"><link rel="prefetch" href="/assets/js/814f3328.14399cf4.js"><link rel="prefetch" href="/assets/js/31276798.d914003a.js"><link rel="prefetch" href="/assets/js/ce44969a.a238b80f.js"><link rel="prefetch" href="/assets/js/9e1c89b6.640fdf1b.js"><link rel="prefetch" href="/assets/js/4ade9265.6073ce08.js"><link rel="prefetch" href="/assets/js/a6ac7fdc.7dc1b603.js"><link rel="prefetch" href="/assets/js/664c1011.5a64a880.js"><link rel="prefetch" href="/assets/js/e882a74a.647051f2.js"><link rel="prefetch" href="/assets/js/a3a97bb2.39475c55.js"><link rel="prefetch" href="/assets/js/80f9a068.d1f1c454.js"><link rel="prefetch" href="/assets/js/81508318.b7a58153.js"><link rel="prefetch" href="/assets/js/c15d9823.d72be663.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/02f8d53f.4d38aa69.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bf1307fc.b1037cc7.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/71a0e788.d6c43f44.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a25251b0.2818bd2a.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/4eeeb220.39fe765d.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/f4a258f4.7f0d0448.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/af65587c.7b684752.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/cca56197.fc43f021.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/076724dc.3da44c93.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb9981df.cc118119.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/1e672e02.087fa5f9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8ff9ed6d.f2051187.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/cb528c50.bb0622aa.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/bb08c9cd.684bb5f9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/3b0078ec.8543dfe3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/8c2b2454.d593d781.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/98e0de98.dba2df92.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/7cda7f66.9b2328a9.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/b1990a74.d7414b1c.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/fccb0471.90923b00.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/b685ae4f.05206890.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/a77706f3.262f93ac.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/7faa3e8c.e78a0dee.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/9517ad39.4d39aeec.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/8c044bee.69fec23a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/2079ebd8.83028885.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/f66ea4d6.4cd5cedf.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/4dd8462f.46e51965.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/ee4763e2.180882c6.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/820fa10b.462e037e.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/a6210f02.f570c547.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/a35c14ad.3f411893.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/c3069cc7.7af90c9a.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/11420efc.f390004d.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/32a5c5bc.2cafbad4.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/d9e76d90.fbaf9ec9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/2e5fb620.ff7e28b9.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/14eb3368.22117ead.js"><link rel="prefetch" href="/assets/js/963c95ea.8d9326d0.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/9f389b39.c721657b.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/aba21aa0.52e7d394.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/0058b4c6.568f0c87.js"><link rel="prefetch" href="/assets/js/a94703ab.c93de335.js"><link rel="prefetch" href="/assets/js/17896441.d2eaaa70.js"><link rel="prefetch" href="/assets/js/04768a69.a6629773.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/49766398.b3c36274.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/5e95c892.e48ad8dc.js"><link rel="prefetch" href="/assets/js/6e719b2a.f09dceaf.js"><link rel="prefetch" href="/assets/js/a7bd4aaa.be6022cd.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"><link rel="prefetch" href="/assets/js/ac14a658.4167c327.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/85c57988.27f971ee.js"><link rel="prefetch" href="/assets/js/6e67859a.3a05ded0.js"><link rel="prefetch" href="/assets/js/8f5f1629.ece68277.js"><link rel="prefetch" href="/assets/js/ccdf801d.d387c8c3.js"></head><body class="navigation-with-keyboard" data-rh="class" style="overflow: visible;"><div id="hs-web-interactives-top-push-anchor" class="go3670563033"></div><script>!function(){var t,e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t=null!==e?e:window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":(window.matchMedia("(prefers-color-scheme: light)").matches,"light"),document.documentElement.setAttribute("data-theme",t)}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id="__docusaurus"><div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#__docusaurus_skipToContent_fallback">Skip to main content</a></div><div class="announcementBar_mb4j" role="banner"><div class="announcementBarPlaceholder_vyr4"></div><div class="content_knG7 announcementBarContent_xLdY">🎉️ <b><a href="https://crawlee.dev/python/">Crawlee for Python is open to early adopters!</a></b> 🥳️</div><button type="button" aria-label="Close" class="clean-btn close closeButton_CVFx announcementBarClose_gvF7"><svg viewBox="0 0 15 15" width="14" height="14"><g stroke="currentColor" stroke-width="3.1"><path d="M.75.75l13.5 13.5M14.25.75L.75 14.25"></path></g></svg></button></div><nav aria-label="Main" class="navbar navbar--fixed-top navbarHideable_m1mJ"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"></div><b class="navbar__title text--truncate">Crawlee</b></a><a class="navbar__item navbar__link" href="/docs/quick-start">Docs</a><a class="navbar__item navbar__link" href="/docs/examples">Examples</a><a class="navbar__item navbar__link" href="/api/core">API</a><a class="navbar__item navbar__link changelog" href="/api/core/changelog">Changelog</a><a class="navbar__item navbar__link" href="/blog">Blog</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Node.js</a><ul class="dropdown__menu"><li><a href="#" class="dropdown__link api-version-bound" rel="dofollow">Node.js</a></li><li><a href="https://crawlee.dev/python" rel="dofollow" class="dropdown__link">Python<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a aria-current="page" class="navbar__link active" aria-haspopup="true" aria-expanded="false" role="button" href="/docs/guides/jsdom-crawler-guide">3.12</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/next/guides/jsdom-crawler-guide">Next</a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/docs/guides/jsdom-crawler-guide">3.12</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.11/guides/jsdom-crawler-guide">3.11</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.10/guides/jsdom-crawler-guide">3.10</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.9/guides/jsdom-crawler-guide">3.9</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.8/guides/jsdom-crawler-guide">3.8</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.7/guides/jsdom-crawler-guide">3.7</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.6/guides/jsdom-crawler-guide">3.6</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.5/guides/jsdom-crawler-guide">3.5</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.4/guides/jsdom-crawler-guide">3.4</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.3/guides/jsdom-crawler-guide">3.3</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.2/guides/jsdom-crawler-guide">3.2</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.1/guides/jsdom-crawler-guide">3.1</a></li><li><a class="dropdown__link api-version-bound" href="/docs/3.0/guides/jsdom-crawler-guide">3.0</a></li><li><a href="https://sdk.apify.com/docs/guides/getting-started?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.3.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link">2.2<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://sdk.apify.com/docs/1.3.1/guides/getting-started?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.3.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="dropdown__link api-version-bound">1.3<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="toggle_MW0i colorModeToggle_x44X"><button class="clean-btn toggleButton_yw5v" type="button" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)"><span><svg viewBox="0 0 13 12" fill="none" width="14" height="14" class="lightToggleIcon_SFTY"><g clip-path="url(#clip0_833_8168)"><path d="M6.59998 8.49999C7.98069 8.49999 9.09998 7.3807 9.09998 5.99999C9.09998 4.61928 7.98069 3.49999 6.59998 3.49999C5.21926 3.49999 4.09998 4.61928 4.09998 5.99999C4.09998 7.3807 5.21926 8.49999 6.59998 8.49999Z" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 0.5V1.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M6.59985 10.5V11.5" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 2.11L3.4199 2.82" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 9.17999L10.4899 9.88999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M1.09998 6H2.09998" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M11.0999 6H12.0999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M2.7099 9.88999L3.4199 9.17999" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path><path d="M9.77991 2.82L10.4899 2.11" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"></path></g><defs><clipPath id="clip0_833_8168"><rect width="12" height="12" fill="white" transform="translate(0.599976)"></rect></clipPath></defs></svg><svg viewBox="0 0 13 12" width="14" height="14" class="darkToggleIcon_ekgs"><path d="M10.7001 6.39501C10.6215 7.24611 10.3021 8.05721 9.77927 8.7334C9.25646 9.40959 8.55189 9.92291 7.748 10.2133C6.9441 10.5036 6.07414 10.5591 5.2399 10.3731C4.40565 10.187 3.64164 9.76728 3.03726 9.1629C2.43287 8.55851 2.01312 7.7945 1.8271 6.96026C1.64108 6.12602 1.6965 5.25605 1.98688 4.45216C2.27725 3.64826 2.79056 2.94369 3.46675 2.42088C4.14294 1.89808 4.95404 1.57866 5.80515 1.50001C5.30685 2.17414 5.06707 3.00473 5.12941 3.84071C5.19175 4.6767 5.55208 5.46254 6.14485 6.05531C6.73762 6.64808 7.52346 7.0084 8.35944 7.07074C9.19542 7.13308 10.026 6.8933 10.7001 6.39501Z" stroke="currentColor" fill="transparent" stroke-linecap="round" stroke-linejoin="round"></path></svg></span></button></div><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="View on GitHub">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="navbar__item navbar__link icon" title="Chat on Discord">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a><div class="navbarSearchContainer_Bca1"><button type="button" class="DocSearch DocSearch-Button" aria-label="Search"><span class="DocSearch-Button-Container"><svg width="20" height="20" class="DocSearch-Search-Icon" viewBox="0 0 20 20" aria-hidden="true"><path d="M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z" stroke="currentColor" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round"></path></svg><span class="DocSearch-Button-Placeholder">Search</span></span><span class="DocSearch-Button-Keys"><kbd class="DocSearch-Button-Key"><svg width="15" height="15" class="DocSearch-Control-Key-Icon"><path d="M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953" stroke-width="1.2" stroke="currentColor" fill="none" stroke-linecap="square"></path></svg></kbd><kbd class="DocSearch-Button-Key">K</kbd></span></button></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="__docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><div class="docsWrapper_hBAB"><button aria-label="Scroll back to top" class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type="button"></button><div class="docRoot_UBD9"><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class="sidebarViewport_aRkj"><div class="sidebar_njMd sidebarWithHideableNavbar_wUlq"><a tabindex="-1" class="sidebarLogo_isFc" href="/"><img src="/img/crawlee-light.svg" alt="" class="themedComponent_mlkZ themedComponent--light_NVdE"><b>Crawlee</b></a><nav aria-label="Docs sidebar" class="menu thin-scrollbar menu_SIkG menuWithAnnouncementBar_GW3s"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-1 menu__list-item"><a class="menu__link" href="/docs/quick-start">Quick Start</a></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/introduction">Introduction</a><button aria-label="Collapse sidebar category \'Introduction\'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/setting-up">Setting up</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/first-crawler">First crawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/adding-urls">Adding more URLs</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/real-world-project">Real-world project</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/crawling">Crawling</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/scraping">Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/saving-data">Saving data</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/refactoring">Refactoring</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/introduction/deployment">Running in the Cloud</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist menu__link--active" href="/docs/guides">Guides</a><button aria-label="Collapse sidebar category \'Guides\'" aria-expanded="true" type="button" class="clean-btn menu__caret"></button></div><ul style="display:block;overflow:visible;height:auto" class="menu__list"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/request-storage">Request Storage</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/result-storage">Result Storage</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/configuration">Configuration</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/cheerio-crawler-guide">CheerioCrawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/javascript-rendering">JavaScript rendering</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/proxy-management">Proxy Management</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/session-management">Session Management</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/scaling-crawlers">Scaling our crawlers</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/avoid-blocking">Avoid getting blocked</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link menu__link--active" aria-current="page" tabindex="0" href="/docs/guides/jsdom-crawler-guide">JSDOMCrawler</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/got-scraping">Got Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/typescript-project">TypeScript Projects</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/docker-images">Running in Docker</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/parallel-scraping">Parallel Scraping</a></li><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class="menu__link" tabindex="0" href="/docs/guides/custom-http-client">Using a custom HTTP client (Experimental)</a></li></ul></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/deployment">Deployment</a><button aria-label="Expand sidebar category \'Deployment\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/examples">Examples</a><button aria-label="Expand sidebar category \'Examples\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/experiments">Experiments</a><button aria-label="Expand sidebar category \'Experiments\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item menu__list-item--collapsed"><div class="menu__list-item-collapsible"><a class="menu__link menu__link--sublist" href="/docs/upgrading">Upgrading</a><button aria-label="Expand sidebar category \'Upgrading\'" aria-expanded="false" type="button" class="clean-btn menu__caret"></button></div></li></ul></nav><button type="button" title="Collapse sidebar" aria-label="Collapse sidebar" class="button button--secondary button--outline collapseSidebarButton_PEFL"><svg width="20" height="20" aria-hidden="true" class="collapseSidebarButtonIcon_kv0_"><g fill="#7a7a7a"><path d="M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"></path><path d="M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"></path></g></svg></button></div></div></aside><main class="docMainContainer_TBSr"><div class="container padding-top--md padding-bottom--lg"><div class="row"><div class="col docItemCol_z5aJ"><div class="docItemContainer_c0TR"><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label="Breadcrumbs"><ul class="breadcrumbs" itemscope="" itemtype="https://schema.org/BreadcrumbList"><li class="breadcrumbs__item"><a aria-label="Home page" class="breadcrumbs__link" href="/"><svg viewBox="0 0 24 24" class="breadcrumbHomeIcon_YNFT"><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill="currentColor"></path></svg></a></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item"><a class="breadcrumbs__link" itemprop="item" href="/docs/guides"><span itemprop="name">Guides</span></a><meta itemprop="position" content="1"></li><li itemscope="" itemprop="itemListElement" itemtype="https://schema.org/ListItem" class="breadcrumbs__item breadcrumbs__item--active"><span class="breadcrumbs__link" itemprop="name">JSDOMCrawler</span><meta itemprop="position" content="2"></li></ul></nav><span class="theme-doc-version-badge badge badge--secondary">Version: 3.12</span><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_ITEo"><button type="button" class="clean-btn tocCollapsibleButton_TO0P">On this page</button></div><div class="theme-doc-markdown markdown"><header><h1>JSDOMCrawler guide</h1></header><p>\u200b<a href="/api/jsdom-crawler/class/JSDOMCrawler"><code>JSDOMCrawler</code></a> is very useful for scraping with the Window API.</p>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="how-the-crawler-works">How the crawler works<a href="#how-the-crawler-works" class="hash-link" aria-label="Direct link to How the crawler works" title="Direct link to How the crawler works">\u200b</a></h2>\n<p>\u200b<a href="/api/jsdom-crawler/class/JSDOMCrawler"><code>JSDOMCrawler</code></a> crawls by making plain HTTP requests to the provided URLs using the specialized <a href="https://github.com/apify/got-scraping" target="_blank" rel="noopener">got-scraping</a> HTTP client. The URLs are fed to the crawler using <a href="/api/core/class/RequestQueue"><code>RequestQueue</code></a>. The HTTP responses it gets back are usually HTML pages. The same pages you would get in your browser when you first load a URL. But it can handle any content types with the help of the <a href="/api/jsdom-crawler/interface/JSDOMCrawlerOptions#additionalMimeTypes"><code>additionalMimeTypes</code></a> option.</p>\n<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>Modern web pages often do not serve all of their content in the first HTML response, but rather the first HTML contains links to other resources such as CSS and JavaScript that get downloaded afterwards, and together they create the final page. To crawl those, see <a href="/api/puppeteer-crawler/class/PuppeteerCrawler"><code>PuppeteerCrawler</code></a> and <a href="/api/playwright-crawler/class/PlaywrightCrawler"><code>PlaywrightCrawler</code></a>.</p></div></div>\n<p>Once the page\'s HTML is retrieved, the crawler will pass it to <a href="https://www.npmjs.com/package/jsdom" target="_blank" rel="noopener">JSDOM</a> for parsing. The result is a <code>window</code> property, which should be familiar to frontend developers. You can use the Window API to do all sorts of lookups and manipulation of the page\'s HTML, but in scraping, you will mostly use it to find specific HTML elements and extract their data.</p>\n<p>Example use of browser JavaScript:</p>\n<div class="language-ts codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-ts codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// Return the page title</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain">document</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">title</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// browsers</span><span class="token plain"></span><br></span><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token plain">window</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">document</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token plain">title</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><span class="token plain"> </span><span class="token comment" style="color: rgb(153, 153, 136); font-style: italic;">// JSDOM</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="when-to-use-jsdomcrawler">When to use <code>JSDOMCrawler</code><a href="#when-to-use-jsdomcrawler" class="hash-link" aria-label="Direct link to when-to-use-jsdomcrawler" title="Direct link to when-to-use-jsdomcrawler">\u200b</a></h2>\n<p><code>JSDOMCrawler</code> really shines when <code>CheerioCrawler</code> is just not enough. There is an entire set of <a href="https://developer.mozilla.org/en-US/docs/Web/API/HTML_DOM_API" target="_blank" rel="noopener">APIs</a> available!</p>\n<p><strong>Advantages:</strong></p>\n<ul>\n<li>Easy to set up</li>\n<li>Familiar for frontend developers</li>\n<li>Content can be manipulated</li>\n<li>Automatically avoids some anti-scraping bans</li>\n</ul>\n<p><strong>Disadvantages:</strong></p>\n<ul>\n<li>Slower than <code>CheerioCrawler</code></li>\n<li>Does not work for websites that require JavaScript rendering</li>\n<li>May easily overload the target website with requests</li>\n</ul>\n<h2 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="example-use-of-element-api">Example use of Element API<a href="#example-use-of-element-api" class="hash-link" aria-label="Direct link to Example use of Element API" title="Direct link to Example use of Element API">\u200b</a></h2>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="find-all-links-on-a-page">Find all links on a page<a href="#find-all-links-on-a-page" class="hash-link" aria-label="Direct link to Find all links on a page" title="Direct link to Find all links on a page">\u200b</a></h3>\n<p>This snippet finds all <code><a></code> elements which have the <code>href</code> attribute and extracts the hrefs into an array.</p>\n<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color: #393A34; --prism-background-color: #f6f8fa;"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color: rgb(57, 58, 52); background-color: rgb(246, 248, 250);"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color: rgb(57, 58, 52);"><span class="token known-class-name class-name">Array</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token keyword module" style="color: rgb(0, 0, 159);">from</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token dom variable" style="color: rgb(54, 172, 170);">document</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token method function property-access" style="color: rgb(215, 58, 73);">querySelectorAll</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token string" style="color: rgb(227, 17, 108);">\'a[href]\'</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token method function property-access" style="color: rgb(215, 58, 73);">map</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token punctuation" style="color: rgb(57, 58, 52);">(</span><span class="token parameter">a</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token plain"> </span><span class="token arrow operator" style="color: rgb(57, 58, 52);">=></span><span class="token plain"> a</span><span class="token punctuation" style="color: rgb(57, 58, 52);">.</span><span class="token property-access">href</span><span class="token punctuation" style="color: rgb(57, 58, 52);">)</span><span class="token punctuation" style="color: rgb(57, 58, 52);">;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" class="clean-btn" aria-label="Toggle word wrap" title="Toggle word wrap"><svg viewBox="0 0 24 24" class="wordWrapButtonIcon_Bwma" aria-hidden="true"><path fill="currentColor" d="M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"></path></svg></button><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>\n<h3 class="anchor anchorWithHideOnScrollNavbar_WYt5" id="other-examples">Other examples<a href="#other-examples" class="hash-link" aria-label="Direct link to Other examples" title="Direct link to Other examples">\u200b</a></h3>\n<p>Visit the <a href="/docs/examples">Examples</a> section to browse examples of <code>JSDOMCrawler</code> usage. Almost all examples show <code>JSDOMCrawler</code> code in their code tabs.</p></div><footer class="theme-doc-footer docusaurus-mt-lg"><div class="row margin-top--sm theme-doc-footer-edit-meta-row"><div class="col"><a href="https://github.com/apify/crawlee/edit/master/website/versioned_docs/version-3.12/guides/jsdom_crawler.mdx" target="_blank" rel="noopener noreferrer" class="theme-edit-this-page"><svg fill="currentColor" height="20" width="20" viewBox="0 0 40 40" class="iconEdit_Z9Sw" aria-hidden="true"><g><path d="m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"></path></g></svg>Edit this page</a></div><div class="col lastUpdated_JAkA"><span class="theme-last-updated">Last updated<!-- --> on <b><time datetime="2024-11-19T17:31:40.000Z" itemprop="dateModified">Nov 19, 2024</time></b> by <b>Saurav Jain</b></span></div></div></footer></article><nav class="pagination-nav docusaurus-mt-lg" aria-label="Docs pages"><a class="pagination-nav__link pagination-nav__link--prev" href="/docs/guides/avoid-blocking"><div class="pagination-nav__sublabel">Previous</div><div class="pagination-nav__label">Avoid getting blocked</div></a><a class="pagination-nav__link pagination-nav__link--next" href="/docs/guides/got-scraping"><div class="pagination-nav__sublabel">Next</div><div class="pagination-nav__label">Got Scraping</div></a></nav><giscus-widget id="giscus-comments" repo="apify/crawlee" repoid="MDEwOlJlcG9zaXRvcnk2NjY3MDgxOQ=" category="Comments" categoryid="DIC_kwDOA_lQ484CQufN" mapping="pathname" strict="1" reactionsenabled="1" emitmetadata="0" inputposition="top" theme="light" lang="en" host="https://giscus.app" loading="eager"></giscus-widget></div></div><div class="col col--3"><div class="tableOfContents_bqdL thin-scrollbar theme-doc-toc-desktop"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#how-the-crawler-works" class="table-of-contents__link toc-highlight">How the crawler works</a></li><li><a href="#when-to-use-jsdomcrawler" class="table-of-contents__link toc-highlight">When to use <code>JSDOMCrawler</code></a></li><li><a href="#example-use-of-element-api" class="table-of-contents__link toc-highlight">Example use of Element API</a><ul><li><a href="#find-all-links-on-a-page" class="table-of-contents__link toc-highlight">Find all links on a page</a></li><li><a href="#other-examples" class="table-of-contents__link toc-highlight">Other examples</a></li></ul></li></ul></div></div></div></div></main></div></div></div><footer class="footer_J6tW light"><div class="container padding-horiz--lg"><div class="row"><div class="col col--5"><div class="row"><div class="col col--6"><div class="footerTitle_tbhc">Docs</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/guides">Guides</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/examples">Examples</a></li><li class="footer__item"><a class="footer__link-item" href="/api/core">API reference</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/upgrading/upgrading-to-v3">Upgrading to v3</a></li></ul></div><div class="col col--6"><div class="footerTitle_tbhc">Community</div><ul class="clean-list"><li class="footer__item"><a class="footer__link-item" href="/blog">Blog</a></li><li class="footer__item"><a href="https://discord.com/invite/jyEM2PRvMU" target="_blank" rel="noopener noreferrer" class="footer__link-item">Discord<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://stackoverflow.com/questions/tagged/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">Stack Overflow<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/apify" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div><div class="col col--7"><div class="row"><div class="col col--3 col--offset-9"><div class="footerTitle_tbhc">More</div><ul class="clean-list"><li class="footer__item"><a href="https://apify.com/?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.3.1732041318139&__hsfp=317949576" target="_blank" rel="noopener noreferrer" class="footer__link-item">Apify Platform<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://docusaurus.io" target="_blank" rel="noopener noreferrer" class="footer__link-item">Docusaurus<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://github.com/apify/crawlee" target="_blank" rel="noopener noreferrer" class="footer__link-item">GitHub<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div></div></div><div class="row padding-vert--md padding-top--lg"><div class="col padding-vert--md col--6"><div class="freeAndOpenSource_V9mY"><svg width="24" height="24" fill="none" viewBox="0 0 24 24" class="alignMiddle_ZeUO"><path fill="#B3B8D2" d="m23.85 21.426-1.78-2.91a.5.5 0 0 1-.07-.26v-4.13c0-1.78-1.71-3.07-3.52-4.45a.51.51 0 0 1-.2-.36.53.53 0 0 1 .14-.4 4.93 4.93 0 0 0 1.07-5.88 5.08 5.08 0 0 0-8.08-1.29l-1.06 1a.48.48 0 0 1-.67 0l-1.06-1a5.09 5.09 0 0 0-8.09 1.29 5 5 0 0 0 1 5.76l7.76 8a1.06 1.06 0 0 0 .77.32 1.08 1.08 0 0 0 .78-.32.64.64 0 0 0 .14-.66 3.8 3.8 0 0 1-.2-1.38 3.75 3.75 0 0 1 4.92-3.37.49.49 0 0 0 .51-.13l.15-.15a.5.5 0 0 1 .66-.05l.3.23c1.22.92 2.73 2.07 2.73 2.85v4.55a1 1 0 0 0 .15.53l2 3.26a1 1 0 1 0 1.7-1z"></path><path fill="#B3B8D2" d="M16.09 13.196a2.37 2.37 0 0 0-3.19 0 2.38 2.38 0 0 0-.18 3.39l1.63 1.77a.55.55 0 0 1 .13.34v1c0 1.3 1.52 2.59 2 2.95a.9.9 0 0 0 .54.19.88.88 0 0 0 .54-1.57 3.9 3.9 0 0 1-1.31-1.57v-1.57a.86.86 0 0 0-.23-.59l-2-2.18a.58.58 0 0 1-.17-.45.66.66 0 0 1 .21-.44.64.64 0 0 1 .85 0l2 1.86a.874.874 0 1 0 1.19-1.28z"></path></svg><span class="alignMiddle_ZeUO">Crawlee is free and open source</span></div></div><div class="col padding-vert--md col--6 text--right"><span class="builtBy_TvsZ"><span class="alignMiddle_ZeUO">Built by</span><a href="https://apify.com/?__hstc=7591405.904387cf2a5648b56e31b15be4b9840e.1732041318139.1732041318139.1732041318139.1&__hssc=7591405.3.1732041318139&__hsfp=317949576"><svg width="91" height="25" fill="none" viewBox="0 0 91 25" class="alignMiddle_ZeUO"><path fill="#97D700" d="M3.135 2.85A3.41 3.41 0 0 0 .227 6.699l2.016 14.398 8.483-19.304z"></path><path fill="#71C5E8" d="M23.604 14.847 22.811 3.78a3.414 3.414 0 0 0-3.64-3.154c-.077 0-.153.014-.228.025l-3.274.452 7.192 16.124c.54-.67.805-1.52.743-2.379"></path><path fill="#FF9013" d="M5.336 24.595c.58.066 1.169-.02 1.706-.248l12.35-5.211L13.514 5.97z"></path><path fill="#fff" d="M33.83 5.304h3.903l5.448 14.623h-3.494l-1.022-2.994h-5.877l-1.025 2.994h-3.384zm-.177 9.032h4.14l-2-5.994h-.086zM58.842 5.304h3.302v14.623h-3.302zM64.634 5.304h10.71v2.7h-7.4v4.101h5.962v2.632h-5.963v5.186h-3.309zM82.116 14.38l-5.498-9.076h3.748l3.428 6.016h.085l3.599-6.016H91l-5.56 9.054v5.569h-3.324zM51.75 5.304h-7.292v14.623h3.3v-4.634h3.993a4.995 4.995 0 1 0 0-9.99m-.364 7.417h-3.628V7.875h3.627a2.423 2.423 0 0 1 0 4.846"></path></svg></a></span></div></div></div></footer></div>\n<!-- Google Tag Manager (noscript) -->\n <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-5P7MCS7" height=0 width=0 style=display:none;visibility:hidden></iframe></noscript>\n <!-- End Google Tag Manager (noscript) -->\n<script id="hs-script-loader" text="" charset="" type="text/javascript" src="//js.hs-scripts.com/19497222.js"></script>\n<script type="text/javascript" id="" charset="">!function(d,g,e){d.TiktokAnalyticsObject=e;var a=d[e]=d[e]||[];a.methods="page track identify instances debug on off once ready alias group enableCookie disableCookie holdConsent revokeConsent grantConsent".split(" ");a.setAndDefer=function(b,c){b[c]=function(){b.push([c].concat(Array.prototype.slice.call(arguments,0)))}};for(d=0;d<a.methods.length;d++)a.setAndDefer(a,a.methods[d]);a.instance=function(b){b=a._i[b]||[];for(var c=0;c<a.methods.length;c++)a.setAndDefer(b,a.methods[c]);return b};a.load=\nfunction(b,c){var f="https://analytics.tiktok.com/i18n/pixel/events.js";a._i=a._i||{};a._i[b]=[];a._i[b]._u=f;a._t=a._t||{};a._t[b]=+new Date;a._o=a._o||{};a._o[b]=c||{};c=document.createElement("script");c.type="text/javascript";c.async=!0;c.src=f+"?sdkid\\x3d"+b+"\\x26lib\\x3d"+e;b=document.getElementsByTagName("script")[0];b.parentNode.insertBefore(c,b)};a.load("CQHNEL3C77U08RGLR00G");a.page()}(window,document,"ttq");</script>\n<img src="https://t.co/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=adf5c404-5108-4114-be9c-907129a14709&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=5be01fb6-320c-495c-bd59-66916b5c1f7c&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Fjsdom-crawler-guide&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;"><img src="https://analytics.twitter.com/1/i/adsct?bci=4&dv=Europe%2FLondon%26en-US%2Cen%26na%26Linux%20x86_64%26255%261280%26720%264%2624%261280%26720%260%26unspecified&eci=3&event=%7B%7D&event_id=adf5c404-5108-4114-be9c-907129a14709&integration=gtm&p_id=Twitter&p_user_id=0&pl_id=5be01fb6-320c-495c-bd59-66916b5c1f7c&tw_document_href=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Fjsdom-crawler-guide&tw_iframe_status=0&txn_id=omnsj&type=javascript&version=2.3.31" height="1" width="1" style="display: none;">\n\n<div class="go2933276541 go2369186930" id="hs-web-interactives-top-anchor"><div id="hs-interactives-modal-overlay" class="go1632949049"></div></div>\n<div class="go2933276541 go1348078617" id="hs-web-interactives-bottom-anchor"></div>\n<div id="hs-web-interactives-floating-container">\n <div id="hs-web-interactives-floating-top-left-anchor" class="go2417249464 go613305155">\n </div>\n <div id="hs-web-interactives-floating-top-right-anchor" class="go2417249464 go471583506">\n </div>\n <div id="hs-web-interactives-floating-bottom-left-anchor" class="go2417249464 go3921366393">\n </div>\n <div id="hs-web-interactives-floating-bottom-right-anchor" class="go2417249464 go3967842156">\n </div>\n</div>\n<div style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon988774485103"><img style="width: 0px; height: 0px; display: none; visibility: hidden;" id="batBeacon906568330069" width="0" height="0" alt="" src="https://bat.bing.com/action/0?ti=187137944&tm=gtm002&Ver=2&mid=9400304f-928c-4edc-9fd0-61d6c73d8e89&bo=2&sid=06dfa930a6a511efbcb1679499971345&vid=06dfe9c0a6a511efacb4e3a24bfa075b&vids=0&msclkid=N&pi=0&lg=en-US&sw=1280&sh=720&sc=24&nwd=1&tl=Crawlee%20%C2%B7%20Build%20reliable%20crawlers.%20Fast.&p=https%3A%2F%2Fcrawlee.dev%2Fdocs%2Fguides%2Fjsdom-crawler-guide&r=&lt=3480&evt=pageLoad&sv=1&asc=G&cdb=AQAQ&rn=497865"></div><iframe height="0" width="0" style="display: none; visibility: hidden;"></iframe><iframe id="intercom-frame" style="position: absolute !important; opacity: 0 !important; width: 1px !important; height: 1px !important; top: 0 !important; left: 0 !important; border: none !important; display: block !important; z-index: -1 !important; pointer-events: none;" aria-hidden="true" tabindex="-1" title="Intercom"></iframe><div class="intercom-lightweight-app"><style id="intercom-lightweight-app-style" type="text/css">\n @keyframes intercom-lightweight-app-launcher {\n from {\n opacity: 0;\n transform: scale(0.5);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n }\n\n @keyframes intercom-lightweight-app-gradient {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n }\n\n @keyframes intercom-lightweight-app-messenger {\n 0% {\n opacity: 0;\n transform: scale(0);\n }\n 40% {\n opacity: 1;\n }\n 100% {\n transform: scale(1);\n }\n }\n\n .intercom-lightweight-app {\n position: fixed;\n z-index: 2147483001;\n width: 0;\n height: 0;\n font-family: intercom-font, "Helvetica Neue", "Apple Color Emoji", Helvetica, Arial, sans-serif;\n }\n\n .intercom-lightweight-app-gradient {\n position: fixed;\n z-index: 2147483002;\n width: 500px;\n height: 500px;\n bottom: 0;\n right: 0;\n pointer-events: none;\n background: radial-gradient(\n ellipse at bottom right,\n rgba(29, 39, 54, 0.16) 0%,\n rgba(29, 39, 54, 0) 72%);\n animation: intercom-lightweight-app-gradient 200ms ease-out;\n }\n\n .intercom-lightweight-app-launcher {\n position: fixed;\n z-index: 2147483003;\n padding: 0 !important;\n margin: 0 !important;\n border: none;\n bottom: 20px;\n right: 20px;\n max-width: 48px;\n width: 48px;\n max-height: 48px;\n height: 48px;\n border-radius: 50%;\n background: #1480ff;\n cursor: pointer;\n box-shadow: 0 1px 6px 0 rgba(0, 0, 0, 0.06), 0 2px 32px 0 rgba(0, 0, 0, 0.16);\n transition: transform 167ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n box-sizing: content-box;\n }\n\n\n .intercom-lightweight-app-launcher:hover {\n transition: transform 250ms cubic-bezier(0.33, 0.00, 0.00, 1.00);\n transform: scale(1.1)\n }\n\n .intercom-lightweight-app-launcher:active {\n transform: scale(0.85);\n transition: transform 134ms cubic-bezier(0.45, 0, 0.2, 1);\n }\n\n\n .intercom-lightweight-app-launcher:focus {\n outline: none;\n\n \n }\n\n .intercom-lightweight-app-launcher-icon {\n display: flex;\n align-items: center;\n justify-content: center;\n position: absolute;\n top: 0;\n left: 0;\n width: 48px;\n height: 48px;\n transition: transform 100ms linear, opacity 80ms linear;\n }\n\n .intercom-lightweight-app-launcher-icon-open {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-open svg {\n width: 24px;\n height: 24px;\n }\n\n .intercom-lightweight-app-launcher-icon-open svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve {\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg {\n height: 44px;\n }\n\n .intercom-lightweight-app-launcher-icon-self-serve svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-launcher-custom-icon-open {\n max-height: 24px;\n max-width: 24px;\n\n \n opacity: 1;\n transform: rotate(0deg) scale(1);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize {\n \n opacity: 0;\n transform: rotate(-60deg) scale(0);\n \n }\n\n .intercom-lightweight-app-launcher-icon-minimize svg path {\n fill: rgb(255, 255, 255);\n }\n\n .intercom-lightweight-app-messenger {\n position: fixed;\n z-index: 2147483003;\n overflow: hidden;\n background-color: white;\n animation: intercom-lightweight-app-messenger 250ms cubic-bezier(0, 1, 1, 1);\n transform-origin: bottom right;\n\n \n width: 400px;\n height: calc(100% - 40px);\n max-height: 704px;\n min-height: 250px;\n right: 20px;\n bottom: 20px;\n box-shadow: 0 5px 40px rgba(0,0,0,0.16);\n \n\n border-radius: 16px;\n }\n\n .intercom-lightweight-app-messenger-header {\n height: 64px;\n border-bottom: none;\n background: #1480ff\n\n \n }\n\n .intercom-lightweight-app-messenger-footer{\n position:absolute;\n bottom:0;\n width: 100%;\n height: 80px;\n background: #fff;\n font-size: 14px;\n line-height: 21px;\n border-top: 1px solid rgba(0, 0, 0, 0.05);\n box-shadow: 0px 0px 25px rgba(0, 0, 0, 0.05);\n \n }\n\n @media print {\n .intercom-lightweight-app {\n display: none;\n }\n }\n</style></div></body></html>'}]
type(data)
bytes
"utf-8") data.decode(
'<!DOCTYPE html>\n<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>\n\n<meta charset="utf-8">\n<meta name="generator" content="quarto-1.3.450">\n\n<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">\n\n\n<title>Alex Paul Kelly - AI: The Catalyst of the 4th Industrial transformation</title>\n<style>\ncode{white-space: pre-wrap;}\nspan.smallcaps{font-variant: small-caps;}\ndiv.columns{display: flex; gap: min(4vw, 1.5em);}\ndiv.column{flex: auto; overflow-x: auto;}\ndiv.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}\nul.task-list{list-style: none;}\nul.task-list li input[type="checkbox"] {\n width: 0.8em;\n margin: 0 0.8em 0.2em -1em; /* quarto-specific, see https://github.com/quarto-dev/quarto-cli/issues/4556 */ \n vertical-align: middle;\n}\n</style>\n\n\n<script src="site_libs/quarto-nav/quarto-nav.js"></script>\n<script src="site_libs/quarto-nav/headroom.min.js"></script>\n<script src="site_libs/clipboard/clipboard.min.js"></script>\n<script src="site_libs/quarto-search/autocomplete.umd.js"></script>\n<script src="site_libs/quarto-search/fuse.min.js"></script>\n<script src="site_libs/quarto-search/quarto-search.js"></script>\n<meta name="quarto:offset" content="./">\n<script src="site_libs/quarto-listing/list.min.js"></script>\n<script src="site_libs/quarto-listing/quarto-listing.js"></script>\n<script src="site_libs/quarto-html/quarto.js"></script>\n<script src="site_libs/quarto-html/popper.min.js"></script>\n<script src="site_libs/quarto-html/tippy.umd.min.js"></script>\n<script src="site_libs/quarto-html/anchor.min.js"></script>\n<link href="site_libs/quarto-html/tippy.css" rel="stylesheet">\n<link href="site_libs/quarto-html/quarto-syntax-highlighting.css" rel="stylesheet" id="quarto-text-highlighting-styles">\n<script src="site_libs/bootstrap/bootstrap.min.js"></script>\n<link href="site_libs/bootstrap/bootstrap-icons.css" rel="stylesheet">\n<link href="site_libs/bootstrap/bootstrap.min.css" rel="stylesheet" id="quarto-bootstrap" data-mode="light">\n<script id="quarto-search-options" type="application/json">{\n "location": "navbar",\n "copy-button": false,\n "collapse-after": 3,\n "panel-placement": "end",\n "type": "overlay",\n "limit": 20,\n "language": {\n "search-no-results-text": "No results",\n "search-matching-documents-text": "matching documents",\n "search-copy-link-title": "Copy link to search",\n "search-hide-matches-text": "Hide additional matches",\n "search-more-match-text": "more match in this document",\n "search-more-matches-text": "more matches in this document",\n "search-clear-button-title": "Clear",\n "search-detached-cancel-button-title": "Cancel",\n "search-submit-button-title": "Submit",\n "search-label": "Search"\n }\n}</script>\n<script>\n\n window.document.addEventListener("DOMContentLoaded", function (_event) {\n const listingTargetEl = window.document.querySelector(\'#listing-listing .list\');\n if (!listingTargetEl) {\n // No listing discovered, do not attach.\n return; \n }\n\n const options = {\n valueNames: [\'listing-date\',\'listing-title\',\'listing-author\',\'listing-image\',\'listing-description\',\'listing-categories\',{ data: [\'index\'] },{ data: [\'categories\'] },{ data: [\'listing-date-sort\'] },{ data: [\'listing-file-modified-sort\'] }],\n \n searchColumns: ["listing-date","listing-title","listing-author","listing-image","listing-description","listing-categories"],\n };\n\n window[\'quarto-listings\'] = window[\'quarto-listings\'] || {};\n window[\'quarto-listings\'][\'listing-listing\'] = new List(\'listing-listing\', options);\n\n if (window[\'quarto-listing-loaded\']) {\n window[\'quarto-listing-loaded\']();\n }\n });\n\n window.addEventListener(\'hashchange\',() => {\n if (window[\'quarto-listing-loaded\']) {\n window[\'quarto-listing-loaded\']();\n }\n })\n </script>\n\n <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script>\n <script src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js" type="text/javascript"></script>\n\n<link rel="stylesheet" href="styles.css">\n</head>\n\n<body class="nav-fixed">\n\n<div id="quarto-search-results"></div>\n <header id="quarto-header" class="headroom fixed-top">\n <nav class="navbar navbar-expand-lg navbar-dark ">\n <div class="navbar-container container-fluid">\n <div class="navbar-brand-container">\n <a class="navbar-brand" href="./index.html">\n <span class="navbar-title">Alex Paul Kelly</span>\n </a>\n </div>\n <div id="quarto-search" class="" title="Search"></div>\n <button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation" onclick="if (window.quartoToggleHeadroom) { window.quartoToggleHeadroom(); }">\n <span class="navbar-toggler-icon"></span>\n</button>\n <div class="collapse navbar-collapse" id="navbarCollapse">\n <ul class="navbar-nav navbar-nav-scroll ms-auto">\n <li class="nav-item">\n <a class="nav-link" href="./about.html" rel="" target="">\n <span class="menu-text">About</span></a>\n </li> \n <li class="nav-item compact">\n <a class="nav-link" href="https://github.com/resolver101757" rel="" target=""><i class="bi bi-github" role="img">\n</i> \n <span class="menu-text"></span></a>\n </li> \n <li class="nav-item compact">\n <a class="nav-link" href="https://twitter.com/alex_paul_kelly" rel="" target=""><i class="bi bi-twitter" role="img">\n</i> \n <span class="menu-text"></span></a>\n </li> \n <li class="nav-item compact">\n <a class="nav-link" href="https://www.linkedin.com/in/alexpkelly/" rel="" target=""><i class="bi bi-linkedin" role="img">\n</i> \n <span class="menu-text"></span></a>\n </li> \n</ul>\n <div class="quarto-navbar-tools">\n</div>\n </div> <!-- /navcollapse -->\n </div> <!-- /container-fluid -->\n </nav>\n</header>\n<!-- content -->\n<header id="title-block-header" class="quarto-title-block default page-columns page-full">\n <div class="quarto-title-banner page-columns page-full">\n <div class="quarto-title column-page-left">\n <h1 class="title">AI: The Catalyst of the 4th Industrial transformation</h1>\n </div>\n </div>\n \n \n <div class="quarto-title-meta">\n\n \n \n \n </div>\n \n \n </header><div id="quarto-content" class="quarto-container page-columns page-rows-contents page-layout-full page-navbar">\n<!-- sidebar -->\n<!-- margin-sidebar -->\n <div id="quarto-margin-sidebar" class="sidebar margin-sidebar">\n \n <h5 class="quarto-listing-category-title">Categories</h5><div class="quarto-listing-category category-default"><div class="category" data-category="">All <span class="quarto-category-count">(25)</span></div><div class="category" data-category="2020">2020 <span class="quarto-category-count">(1)</span></div><div class="category" data-category="AI">AI <span class="quarto-category-count">(5)</span></div><div class="category" data-category="Attention">Attention <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Computer Vision">Computer Vision <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Deep Learning">Deep Learning <span class="quarto-category-count">(1)</span></div><div class="category" data-category="EEUK">EEUK <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Education">Education <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Event">Event <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Grafana">Grafana <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Industrial IoT">Industrial IoT <span class="quarto-category-count">(1)</span></div><div class="category" data-category="InfluxDB">InfluxDB <span class="quarto-category-count">(1)</span></div><div class="category" data-category="IoT">IoT <span class="quarto-category-count">(2)</span></div><div class="category" data-category="Leadership">Leadership <span class="quarto-category-count">(1)</span></div><div class="category" data-category="LoRaWAN">LoRaWAN <span class="quarto-category-count">(2)</span></div><div class="category" data-category="Machine Learning">Machine Learning <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Makerspaces">Makerspaces <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Manufacturing">Manufacturing <span class="quarto-category-count">(1)</span></div><div class="category" data-category="NLP">NLP <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Raspberry Pi">Raspberry Pi <span class="quarto-category-count">(1)</span></div><div class="category" data-category="SELA">SELA <span class="quarto-category-count">(1)</span></div><div class="category" data-category="Transformer">Transformer <span class="quarto-category-count">(1)</span></div><div class="category" data-category="ai">ai <span class="quarto-category-count">(2)</span></div><div class="category" data-category="audio">audio <span class="quarto-category-count">(1)</span></div><div class="category" data-category="automation">automation <span class="quarto-category-count">(1)</span></div><div class="category" data-category="chatbot">chatbot <span class="quarto-category-count">(1)</span></div><div class="category" data-category="chatgpt">chatgpt <span class="quarto-category-count">(1)</span></div><div class="category" data-category="computer vision">computer vision <span class="quarto-category-count">(1)</span></div><div class="category" data-category="data">data <span class="quarto-category-count">(3)</span></div><div class="category" data-category="deep learning">deep learning <span class="quarto-category-count">(1)</span></div><div class="category" data-category="ethics">ethics <span class="quarto-category-count">(1)</span></div><div class="category" data-category="eye-tracking">eye-tracking <span class="quarto-category-count">(1)</span></div><div class="category" data-category="fastai">fastai <span class="quarto-category-count">(2)</span></div><div class="category" data-category="fasthtml">fasthtml <span class="quarto-category-count">(2)</span></div><div class="category" data-category="gpt">gpt <span class="quarto-category-count">(1)</span></div><div class="category" data-category="gpt4">gpt4 <span class="quarto-category-count">(1)</span></div><div class="category" data-category="htmx">htmx <span class="quarto-category-count">(2)</span></div><div class="category" data-category="jobs">jobs <span class="quarto-category-count">(1)</span></div><div class="category" data-category="manufacturing">manufacturing <span class="quarto-category-count">(2)</span></div><div class="category" data-category="nlp">nlp <span class="quarto-category-count">(2)</span></div><div class="category" data-category="rag">rag <span class="quarto-category-count">(1)</span></div><div class="category" data-category="regulation">regulation <span class="quarto-category-count">(1)</span></div><div class="category" data-category="robotics">robotics <span class="quarto-category-count">(1)</span></div><div class="category" data-category="rpa">rpa <span class="quarto-category-count">(1)</span></div></div></div>\n<!-- main -->\n<main class="content quarto-banner-title-block column-page-left" id="quarto-document-content">\n\n\n\n\n<section id="stepping-into-the-heart-of-the-4th-industrial-revolution-this-blog-series-examines-the-future-of-manufacturing-with-ai-and-data-analytics-positioned-at-the-core-of-this-momentous-transformation." class="level3">\n<h3 class="anchored" data-anchor-id="stepping-into-the-heart-of-the-4th-industrial-revolution-this-blog-series-examines-the-future-of-manufacturing-with-ai-and-data-analytics-positioned-at-the-core-of-this-momentous-transformation.">Stepping into the heart of the 4th industrial revolution, this blog series examines the future of manufacturing, with AI and data analytics positioned at the core of this momentous transformation.</h3>\n<p><br></p>\n\n\n\n</section>\n\n<div class="quarto-listing quarto-listing-container-default" id="listing-listing">\n<div class="list quarto-listing-default">\n<div class="quarto-post image-right" data-index="0" data-categories="fasthtml,htmx" data-listing-date-sort="1731283200000" data-listing-file-modified-sort="1731523067771" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="5">\n<div class="thumbnail">\n<p><a href="./posts/2024-11-11_FastHTML_app/fasthtml_app.html"> <img src="./posts/2024-11-11_FastHTML_app/fasthtml_logo.png" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2024-11-11_FastHTML_app/fasthtml_app.html">\n<h3 class="no-anchor listing-title">\nFastHTML + AI: Building a Revenue-Ready Application from Scratch\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'fasthtml\'); return false;">\nfasthtml\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'htmx\'); return false;">\nhtmx\n</div>\n</div>\n<a href="./posts/2024-11-11_FastHTML_app/fasthtml_app.html">\n<div class="listing-description">\nThe SafeFast Virtual Tours web app offers an immersive, AI-powered experience that transports you back to ancient Rome through interactive virtual tours. Using a…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2024-11-11_FastHTML_app/fasthtml_app.html">\n<div class="listing-date">\nNov 11, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="1" data-categories="robotics,AI" data-listing-date-sort="1728255600000" data-listing-file-modified-sort="1728409242664" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="5">\n<div class="thumbnail">\n<p><a href="./posts/2024-10-03_robotics/robot.html"> <img src="./posts/2024-10-03_robotics/robot_hackspace.jpg" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2024-10-03_robotics/robot.html">\n<h3 class="no-anchor listing-title">\nRobotics\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'robotics\'); return false;">\nrobotics\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'AI\'); return false;">\nAI\n</div>\n</div>\n<a href="./posts/2024-10-03_robotics/robot.html">\n<div class="listing-description">\nI work for a manufacturing company where robots perform tasks like welding and transporting parts. I’m at an interesting intersection where both AI and robotics are my…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2024-10-03_robotics/robot.html">\n<div class="listing-date">\nOct 7, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="2" data-categories="fasthtml,htmx" data-listing-date-sort="1726614000000" data-listing-file-modified-sort="1727962214131" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="7">\n<div class="thumbnail">\n<p><a href="./posts/2024-09-18_fast_html/fasthtml.html"> <img src="./posts/2024-09-18_fast_html/fasthtml_logo.png" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2024-09-18_fast_html/fasthtml.html">\n<h3 class="no-anchor listing-title">\nExperimenting with FastHTML and HTMX\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'fasthtml\'); return false;">\nfasthtml\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'htmx\'); return false;">\nhtmx\n</div>\n</div>\n<a href="./posts/2024-09-18_fast_html/fasthtml.html">\n<div class="listing-description">\nWelcome to my thoughts and learnings from developing a FastHTML app. I wanted to learn a web technology that is simple and fun, allowing me to focus on my main project. It…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2024-09-18_fast_html/fasthtml.html">\n<div class="listing-date">\nSep 18, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="3" data-listing-date-sort="1723935600000" data-listing-file-modified-sort="1724085395723" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">\n<div class="thumbnail">\n<p><a href="./posts/2024-08-18_cursor_ai/cursor_ai.html"> <img src="./posts/2024-08-18_cursor_ai/cursor_ai_logo.jfif" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2024-08-18_cursor_ai/cursor_ai.html">\n<h3 class="no-anchor listing-title">\nCursor AI - The AI code editor\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nIn this blog post, I’ve shared my experience with Cursor AI, a powerful AI-assisted code editor that I’ve been using for a few weeks. Here are the key points:\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2024-08-18_cursor_ai/cursor_ai.html">\n<div class="listing-date">\nAug 18, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="4" data-listing-date-sort="1721689200000" data-listing-file-modified-sort="1722360893297" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">\n<div class="thumbnail">\n<p><a href="./posts/2024-07-23_copilot_studio/copilot_studio.html"> <img src="./posts/2024-07-23_copilot_studio/microsoft-copilot.jpg" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2024-07-23_copilot_studio/copilot_studio.html">\n<h3 class="no-anchor listing-title">\nCo-pilot studio initial thoughts\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nSomeone…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2024-07-23_copilot_studio/copilot_studio.html">\n<div class="listing-date">\nJul 23, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="5" data-listing-date-sort="1719183600000" data-listing-file-modified-sort="1726759127571" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">\n<div class="thumbnail">\n<p><a href="./posts/2024-06-24_smart_factory_2024/smart_factory_2024.html"> <p class="card-img-top"><img src="posts\\2024-06-24_smart_factory_2024\\sound_cam_uk.jpg" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2024-06-24_smart_factory_2024/smart_factory_2024.html">\n<h3 class="no-anchor listing-title">\nSmart manufacturing expo 2024\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nFirst time out of the office in a while but I’ve finally…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2024-06-24_smart_factory_2024/smart_factory_2024.html">\n<div class="listing-date">\nJun 24, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="6" data-listing-date-sort="1713740400000" data-listing-file-modified-sort="1714049854916" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="8">\n<div class="thumbnail">\n<p><a href="./posts/2024-04-22_tiny_llava/tiny_llava.html"> <p class="card-img-top"><img src="posts\\2024-04-22_tiny_llava\\diagram.png" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2024-04-22_tiny_llava/tiny_llava.html">\n<h3 class="no-anchor listing-title">\nScaling Down to Scale Up: Exploring TinyLLaVA’s Multimodal Framework\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nThe TinyLLaVA paper shows the usual multimodeal model of image and text in and text out but there are many more modalities. One thing I keep asking myself is why am I still…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2024-04-22_tiny_llava/tiny_llava.html">\n<div class="listing-date">\nApr 22, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="7" data-categories="AI,NLP,Attention,Transformer" data-listing-date-sort="1711756800000" data-listing-file-modified-sort="1712156726586" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="9">\n<div class="thumbnail">\n<p><a href="./posts/transformers_paper/paper_explanation.html"> <p class="card-img-top"><img src="posts\\transformers_paper\\transformer.png" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/transformers_paper/paper_explanation.html">\n<h3 class="no-anchor listing-title">\nPaper reading group - Attention is All You Need\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'AI\'); return false;">\nAI\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'NLP\'); return false;">\nNLP\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Attention\'); return false;">\nAttention\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Transformer\'); return false;">\nTransformer\n</div>\n</div>\n<a href="./posts/transformers_paper/paper_explanation.html">\n<div class="listing-description">\nEvery 2nd Saturday we have a paper reading group where we submit papers we are interested in reading and vote for our favorite paper to read together. This week we discussed…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/transformers_paper/paper_explanation.html">\n<div class="listing-date">\nMar 30, 2024\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="8" data-categories="data" data-listing-date-sort="1709596800000" data-listing-file-modified-sort="1712596897555" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="5">\n<div class="thumbnail">\n<p><a href="./posts/apache_arrow/apache_arrow.html"> <img src="./posts/apache_arrow/arrow.png" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/apache_arrow/apache_arrow.html">\n<h3 class="no-anchor listing-title">\nThe rise of Apache Arrow\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'data\'); return false;">\ndata\n</div>\n</div>\n<a href="./posts/apache_arrow/apache_arrow.html">\n<div class="listing-description">\nI came across…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/apache_arrow/apache_arrow.html">\n<div class="listing-date">\nMar 5, 2024\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="9" data-listing-date-sort="1708560000000" data-listing-file-modified-sort="1712596897480" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="4">\n<div class="thumbnail">\n<p><a href="./posts/WeightsAndBias/WeightsAndBias.html"> <img src="./posts/WeightsAndBias/wand-weights-neg-white.webp" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/WeightsAndBias/WeightsAndBias.html">\n<h3 class="no-anchor listing-title">\nWeights and bias to keep track of training run\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nThe blog will run you through a simple training loop and help understand how to intergrate weights and bias into your training loops using the mini ai from Fast AI.\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/WeightsAndBias/WeightsAndBias.html">\n<div class="listing-date">\nFeb 22, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="10" data-categories="Machine Learning,Deep Learning,Computer Vision" data-listing-date-sort="1707177600000" data-listing-file-modified-sort="1707325268272" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="14">\n<div class="thumbnail">\n<p><a href="./posts/hugging_face_datasets_library/Hugging_face_datasets.html"> <p class="card-img-top"><img src="posts\\hugging_face_datasets_library\\ac04bdd3-4808-4fd1-ad9c-58953c15684c.webp" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/hugging_face_datasets_library/Hugging_face_datasets.html">\n<h3 class="no-anchor listing-title">\nLeveraging Hugging Face for Deep Learning: A Guide to Datasets to Model Training - part 1 Eye-Tracking\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'Machine Learning\'); return false;">\nMachine Learning\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Deep Learning\'); return false;">\nDeep Learning\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Computer Vision\'); return false;">\nComputer Vision\n</div>\n</div>\n<a href="./posts/hugging_face_datasets_library/Hugging_face_datasets.html">\n<div class="listing-description">\nThis blog aims to provide a brief overview of the creation of a machine learning workflow from creating a dataset up to…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/hugging_face_datasets_library/Hugging_face_datasets.html">\n<div class="listing-date">\nFeb 6, 2024\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="11" data-categories="AI,computer vision,eye-tracking" data-listing-date-sort="1705881600000" data-listing-file-modified-sort="1706870975658" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">\n<div class="thumbnail">\n<p><a href="./posts/eye_tracking_start/eye_tracking.html"> <p class="card-img-top"><img src="posts\\eye_tracking_start\\eye_tracking.png" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/eye_tracking_start/eye_tracking.html">\n<h3 class="no-anchor listing-title">\nEye-Tracking: quick overview of the project\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'AI\'); return false;">\nAI\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'computer vision\'); return false;">\ncomputer vision\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'eye-tracking\'); return false;">\neye-tracking\n</div>\n</div>\n<a href="./posts/eye_tracking_start/eye_tracking.html">\n<div class="listing-description">\nIn the realm of human-computer interaction, the mouse has been a stalwart companion. However, with advancements in AI and computer vision and modern hardware…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/eye_tracking_start/eye_tracking.html">\n<div class="listing-date">\nJan 22, 2024\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="12" data-categories="AI,ethics,regulation" data-listing-date-sort="1705622400000" data-listing-file-modified-sort="1706023459087" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="4">\n<div class="thumbnail">\n<p><a href="./posts/AI_ethics/index.html"> <p class="card-img-top"><img src="posts\\AI_ethics\\ethics.png" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/AI_ethics/index.html">\n<h3 class="no-anchor listing-title">\nNavigating the Evolving Landscape of AI Ethics and Regulation: Key Insights from a Recent Discussion with AI Tech North\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'AI\'); return false;">\nAI\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'ethics\'); return false;">\nethics\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'regulation\'); return false;">\nregulation\n</div>\n</div>\n<a href="./posts/AI_ethics/index.html">\n<div class="listing-description">\nThe world of Artificial Intelligence (AI) is witnessing a significant transformation, not just technologically, but also in terms of ethics, regulations, and legal…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/AI_ethics/index.html">\n<div class="listing-date">\nJan 19, 2024\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="13" data-listing-date-sort="1705536000000" data-listing-file-modified-sort="1707844730896" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="22">\n<div class="thumbnail">\n<p><a href="./posts/adam_optimizer/index.html"> <p class="card-img-top"><img src="posts\\adam_optimizer\\index_files\\figure-html\\cell-13-output-3.png" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/adam_optimizer/index.html">\n<h3 class="no-anchor listing-title">\nAdam optimizer with annealing learning rate\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nThe aim of this blog is to explain the role of a optimizer in a neural network training loop. I will explain what a neural network…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/adam_optimizer/index.html">\n<div class="listing-date">\nJan 18, 2024\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="14" data-categories="AI,manufacturing,jobs" data-listing-date-sort="1705449600000" data-listing-file-modified-sort="1705667592132" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="20">\n<div class="thumbnail">\n<p><a href="./posts/future_skills_in_ai/index.html"> <p class="card-img-top"><img src="posts\\future_skills_in_ai\\Industry5.jpg" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/future_skills_in_ai/index.html">\n<h3 class="no-anchor listing-title">\nAI’s Evolution in Manufacturing: Shaping Jobs and the Workforce of Tomorrow.\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'AI\'); return false;">\nAI\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'manufacturing\'); return false;">\nmanufacturing\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'jobs\'); return false;">\njobs\n</div>\n</div>\n<a href="./posts/future_skills_in_ai/index.html">\n<div class="listing-description">\nManufacturing is a key sector for the UK economy, accounting for 10% of GDP and 44% of exports, the UK is the 8th largest exporter in the world, its important. In this article, we delve into the transformative impact of Artificial Intelligence (AI) on the manufacturing sector, a pivotal segment of the UK economy.…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/future_skills_in_ai/index.html">\n<div class="listing-date">\nJan 17, 2024\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="15" data-categories="deep learning,nlp,rag" data-listing-date-sort="1700611200000" data-listing-file-modified-sort="1724078861877" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="4">\n<div class="thumbnail">\n<p><a href="./posts/all_things_RAG_paper_discussion/all_things_rag_paper_discussion.html"> <img src="./posts/all_things_RAG_paper_discussion/RAG.webp" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/all_things_RAG_paper_discussion/all_things_rag_paper_discussion.html">\n<h3 class="no-anchor listing-title">\nThe Power of Retrieval-Augmented Generation in AI Language Models\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'deep learning\'); return false;">\ndeep learning\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'nlp\'); return false;">\nnlp\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'rag\'); return false;">\nrag\n</div>\n</div>\n<a href="./posts/all_things_RAG_paper_discussion/all_things_rag_paper_discussion.html">\n<div class="listing-description">\nI’ve recently joined a discord group where we discuss deep learning papers and this week its about RAG (Retrieval-Augmented Generation). It consisted listening to the author…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/all_things_RAG_paper_discussion/all_things_rag_paper_discussion.html">\n<div class="listing-date">\nNov 22, 2023\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="16" data-listing-date-sort="1699574400000" data-listing-file-modified-sort="1702645306174" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="12">\n<div class="thumbnail">\n<p><a href="./posts/initialization_neural_networks/index.html"> <p class="card-img-top"><img src="posts\\initialization_neural_networks\\weight_initialization.png" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/initialization_neural_networks/index.html">\n<h3 class="no-anchor listing-title">\nThe Importance of Proper Initialization.\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nI’m watching online videos series by Fast.ai where we are looking at re-creating neural networks from scratch using Python ensuring we fully understand the inner…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/initialization_neural_networks/index.html">\n<div class="listing-date">\nNov 10, 2023\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="17" data-categories="ai,fastai,chatbot,gpt,nlp,audio" data-listing-date-sort="1698274800000" data-listing-file-modified-sort="1698341267207" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="5">\n<div class="thumbnail">\n<p><a href="./posts/chatGPT_audio_conversation/index.html"> <p class="card-img-top"><img src="posts\\chatGPT_audio_conversation\\Car_ai_asistant.png" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/chatGPT_audio_conversation/index.html">\n<h3 class="no-anchor listing-title">\nMaximizing Your Commute: Learning on the Go with ChatGPT Voice\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'ai\'); return false;">\nai\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'fastai\'); return false;">\nfastai\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'chatbot\'); return false;">\nchatbot\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'gpt\'); return false;">\ngpt\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'nlp\'); return false;">\nnlp\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'audio\'); return false;">\naudio\n</div>\n</div>\n<a href="./posts/chatGPT_audio_conversation/index.html">\n<div class="listing-description">\nI have 20 minute drive into work and back home everyday where I usually listen to a podcast, audio book or sometimes just stair at…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/chatGPT_audio_conversation/index.html">\n<div class="listing-date">\nOct 26, 2023\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="18" data-categories="ai,manufacturing,fastai,gpt4,chatgpt,rpa,automation" data-listing-date-sort="1698188400000" data-listing-file-modified-sort="1698266876353" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="7">\n<div class="thumbnail">\n<p><a href="./posts/Exploring_GTP4V_paper/index.html"> <p class="card-img-top"><img src="posts\\Exploring_GTP4V_paper\\dawn_of_AI.png" class="thumbnail-image card-img"/></p> </a></p>\n</div>\n<div class="body">\n<a href="./posts/Exploring_GTP4V_paper/index.html">\n<h3 class="no-anchor listing-title">\nExploring GPT4 vision, fastai study hacks and what it means for industry 4.0\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'ai\'); return false;">\nai\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'manufacturing\'); return false;">\nmanufacturing\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'fastai\'); return false;">\nfastai\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'gpt4\'); return false;">\ngpt4\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'chatgpt\'); return false;">\nchatgpt\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'rpa\'); return false;">\nrpa\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'automation\'); return false;">\nautomation\n</div>\n</div>\n<a href="./posts/Exploring_GTP4V_paper/index.html">\n<div class="listing-description">\nHi, this is a explority view of GPT4 vision, study hacks and it’s uses in manufacturing and industry 4.0. Its a commentary of microsoft paper TheDawnofLMMs…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/Exploring_GTP4V_paper/index.html">\n<div class="listing-date">\nOct 25, 2023\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="19" data-categories="IoT,Manufacturing,LoRaWAN,Industrial IoT,Raspberry Pi,InfluxDB,Grafana,data" data-listing-date-sort="1658185200000" data-listing-file-modified-sort="1712596897861" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">\n<div class="thumbnail">\n<p><a href="./posts/iot_in_a_factory/index.html"> <img src="./posts/iot_in_a_factory/IOT_in_manufacturing.png" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/iot_in_a_factory/index.html">\n<h3 class="no-anchor listing-title">\nEmbracing IoT in Manufacturing: My Journey to Transforming Factory Operations\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'IoT\'); return false;">\nIoT\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Manufacturing\'); return false;">\nManufacturing\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'LoRaWAN\'); return false;">\nLoRaWAN\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Industrial IoT\'); return false;">\nIndustrial IoT\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Raspberry Pi\'); return false;">\nRaspberry Pi\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'InfluxDB\'); return false;">\nInfluxDB\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Grafana\'); return false;">\nGrafana\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'data\'); return false;">\ndata\n</div>\n</div>\n<a href="./posts/iot_in_a_factory/index.html">\n<div class="listing-description">\nAs someone deeply involved in factory operations, I’ve witnessed firsthand the remarkable transformation brought about by the Internet of…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/iot_in_a_factory/index.html">\n<div class="listing-date">\nJul 19, 2022\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="20" data-listing-date-sort="1623884400000" data-listing-file-modified-sort="1712586407484" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">\n<div class="thumbnail">\n<p><a href="./posts/2020-09-09_pcb_in_15_minutes/pcb.html"> <div class="listing-item-img-placeholder card-img-top" > </div> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2020-09-09_pcb_in_15_minutes/pcb.html">\n<h3 class="no-anchor listing-title">\norder PCB with surface mount components in under 15 minutes with easyEDA circuit design\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nIn this blog post, we delve into the world of electrical circuit design, particularly focusing on software that simplifies this complex task for…<strong></strong>\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2020-09-09_pcb_in_15_minutes/pcb.html">\n<div class="listing-date">\nJun 17, 2021\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="21" data-listing-date-sort="1623884400000" data-listing-file-modified-sort="1712585927628" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">\n<div class="thumbnail">\n<p><a href="./posts/2021-01-27_exploring_wireless_spectrum/wirelss_spectrum.html"> <div class="listing-item-img-placeholder card-img-top" > </div> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2021-01-27_exploring_wireless_spectrum/wirelss_spectrum.html">\n<h3 class="no-anchor listing-title">\nIntegrating AI with LoRaWAN: A guide using edge impulse\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nI recently acquired a spectrum analyzer to help resolve a problem with wireless signals at the 2.4 GHz frequency. The specs show that it works at the 240 to 960 MHz range…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2021-01-27_exploring_wireless_spectrum/wirelss_spectrum.html">\n<div class="listing-date">\nJun 17, 2021\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="22" data-listing-date-sort="1623884400000" data-listing-file-modified-sort="1712585106285" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2">\n<div class="thumbnail">\n<p><a href="./posts/2024-04-24_AI_LORAWAN_portenta/Arduino.html"> <div class="listing-item-img-placeholder card-img-top" > </div> </a></p>\n</div>\n<div class="body">\n<a href="./posts/2024-04-24_AI_LORAWAN_portenta/Arduino.html">\n<h3 class="no-anchor listing-title">\nIntegrating AI with LoRaWAN: A guide using edge impulse\n</h3>\n<div class="listing-subtitle">\n\n</div>\n<div class="listing-description">\nIn this short video, we demonstrate how to use an <strong>Arduino Portenta Laura Board</strong>, equipped with a camera and AI capabilities. We’ll…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/2024-04-24_AI_LORAWAN_portenta/Arduino.html">\n<div class="listing-date">\nJun 17, 2021\n</div>\n<div class="listing-author">\nAlex Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="23" data-categories="Leadership,Education,EEUK,Event,2020" data-listing-date-sort="1602802800000" data-listing-file-modified-sort="1712596897580" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="2">\n<div class="thumbnail">\n<p><a href="./posts/developing_the_skils_for_smart_futures/index.html"> <img src="./posts/developing_the_skils_for_smart_futures/leadership_skills.jpg" class="thumbnail-image"> </a></p>\n</div>\n<div class="body">\n<a href="./posts/developing_the_skils_for_smart_futures/index.html">\n<h3 class="no-anchor listing-title">\nNurturing Leadership Skills for Smart Futures: Insights from the EEUK Leadership Event 2020\n</h3>\n<div class="listing-subtitle">\n\n</div>\n</a>\n<div class="listing-categories">\n<div class="listing-category" onclick="window.quartoListingCategory(\'Leadership\'); return false;">\nLeadership\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Education\'); return false;">\nEducation\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'EEUK\'); return false;">\nEEUK\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'Event\'); return false;">\nEvent\n</div>\n<div class="listing-category" onclick="window.quartoListingCategory(\'2020\'); return false;">\n2020\n</div>\n</div>\n<a href="./posts/developing_the_skils_for_smart_futures/index.html">\n<div class="listing-description">\nIn an era where leadership skills are pivotal for success across various sectors, the EEUK Leadership Event 2020 provided a platform for vibrant discussions and shared…\n</div>\n</a>\n</div>\n<div class="metadata">\n<a href="./posts/developing_the_skils_for_smart_futures/index.html">\n<div class="listing-date">\nOct 16, 2020\n</div>\n<div class="listing-author">\nAlex Paul Kelly\n</div>\n</a>\n</div>\n</div>\n<div class="quarto-post image-right" data-index="24" data-categories="IoT,LoRaWAN,Makerspaces,SELA,data" data-listing-date-sort="1599519600000" data-listing-file-modified-sort="1712596897878" data-listing-date-modified-sort="NaN" data-listing-reading-time-sort="3">\n<div class="thumbnail">\n<p><a href="./posts/the_makers_journey_unimaker/index.html"> <img src="./posts/the_makers_journey_unimaker/maker_space.jpg" class="thumbnail-image"> </a></p>\