gitextract_o1cy5s8w/ ├── .editorconfig ├── .github/ │ ├── CODEOWNERS │ ├── pull_request_template.md │ └── workflows/ │ ├── _check_code.yaml │ ├── _check_docs.yaml │ ├── _release_docs.yaml │ ├── _tests.yaml │ ├── manual_release_stable.yaml │ ├── on_issue.yaml │ ├── on_master.yaml │ ├── on_pull_request.yaml │ └── on_schedule_tests.yaml ├── .gitignore ├── .markdownlint.yaml ├── .pre-commit-config.yaml ├── .rules.md ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── codecov.yaml ├── docs/ │ ├── deployment/ │ │ ├── apify_platform.mdx │ │ ├── aws_lambda.mdx │ │ ├── code_examples/ │ │ │ ├── apify/ │ │ │ │ ├── crawler_as_actor_example.py │ │ │ │ ├── get_public_url.py │ │ │ │ ├── log_with_config_example.py │ │ │ │ ├── proxy_advanced_example.py │ │ │ │ └── proxy_example.py │ │ │ ├── aws/ │ │ │ │ ├── beautifulsoup_crawler_lambda.py │ │ │ │ ├── playwright_crawler_lambda.py │ │ │ │ └── playwright_dockerfile │ │ │ └── google/ │ │ │ ├── cloud_run_example.py │ │ │ └── google_example.py │ │ ├── google_cloud.mdx │ │ └── google_cloud_run.mdx │ ├── examples/ │ │ ├── add_data_to_dataset.mdx │ │ ├── beautifulsoup_crawler.mdx │ │ ├── capture_screenshot_using_playwright.mdx │ │ ├── capturing_page_snapshots_with_error_snapshotter.mdx │ │ ├── code_examples/ │ │ │ ├── adaptive_playwright_crawler.py │ │ │ ├── add_data_to_dataset_bs.py │ │ │ ├── add_data_to_dataset_dataset.py │ │ │ ├── add_data_to_dataset_pw.py │ │ │ ├── beautifulsoup_crawler.py │ │ │ ├── beautifulsoup_crawler_keep_alive.py │ │ │ ├── beautifulsoup_crawler_stop.py │ │ │ ├── capture_screenshot_using_playwright.py │ │ │ ├── configure_json_logging.py │ │ │ ├── crawl_all_links_on_website_bs.py │ │ │ ├── crawl_all_links_on_website_pw.py │ │ │ ├── crawl_multiple_urls_bs.py │ │ │ ├── crawl_multiple_urls_pw.py │ │ │ ├── crawl_specific_links_on_website_bs.py │ │ │ ├── crawl_specific_links_on_website_pw.py │ │ │ ├── crawl_website_with_relative_links_all_links.py │ │ │ ├── crawl_website_with_relative_links_same_domain.py │ │ │ ├── crawl_website_with_relative_links_same_hostname.py │ │ │ ├── crawl_website_with_relative_links_same_origin.py │ │ │ ├── export_entire_dataset_to_file_csv.py │ │ │ ├── export_entire_dataset_to_file_json.py │ │ │ ├── extract_and_add_specific_links_on_website_bs.py │ │ │ ├── extract_and_add_specific_links_on_website_pw.py │ │ │ ├── fill_and_submit_web_form_crawler.py │ │ │ ├── fill_and_submit_web_form_request.py │ │ │ ├── parsel_crawler.py │ │ │ ├── parsel_crawler_with_error_snapshotter.py │ │ │ ├── playwright_block_requests.py │ │ │ ├── playwright_crawler.py │ │ │ ├── playwright_crawler_with_camoufox.py │ │ │ ├── playwright_crawler_with_error_snapshotter.py │ │ │ ├── playwright_crawler_with_fingerprint_generator.py │ │ │ ├── respect_robots_on_skipped_request.py │ │ │ ├── respect_robots_txt_file.py │ │ │ ├── resuming_paused_crawl.py │ │ │ ├── run_parallel_crawlers.py │ │ │ ├── using_browser_profiles_chrome.py │ │ │ ├── using_browser_profiles_firefox.py │ │ │ └── using_sitemap_request_loader.py │ │ ├── crawl_all_links_on_website.mdx │ │ ├── crawl_multiple_urls.mdx │ │ ├── crawl_specific_links_on_website.mdx │ │ ├── crawl_website_with_relative_links.mdx │ │ ├── crawler_keep_alive.mdx │ │ ├── crawler_stop.mdx │ │ ├── export_entire_dataset_to_file.mdx │ │ ├── fill_and_submit_web_form.mdx │ │ ├── json_logging.mdx │ │ ├── parsel_crawler.mdx │ │ ├── playwright_crawler.mdx │ │ ├── playwright_crawler_adaptive.mdx │ │ ├── playwright_crawler_with_block_requests.mdx │ │ ├── playwright_crawler_with_camoufox.mdx │ │ ├── playwright_crawler_with_fingerprint_generator.mdx │ │ ├── respect_robots_txt_file.mdx │ │ ├── resuming_paused_crawl.mdx │ │ ├── run_parallel_crawlers.mdx │ │ ├── using_browser_profile.mdx │ │ └── using_sitemap_request_loader.mdx │ ├── guides/ │ │ ├── architecture_overview.mdx │ │ ├── avoid_blocking.mdx │ │ ├── code_examples/ │ │ │ ├── avoid_blocking/ │ │ │ │ ├── default_fingerprint_generator_with_args.py │ │ │ │ └── playwright_with_fingerprint_generator.py │ │ │ ├── creating_web_archive/ │ │ │ │ ├── manual_archiving_parsel_crawler.py │ │ │ │ ├── manual_archiving_playwright_crawler.py │ │ │ │ └── simple_pw_through_proxy_pywb_server.py │ │ │ ├── error_handling/ │ │ │ │ ├── change_handle_error_status.py │ │ │ │ ├── disable_retry.py │ │ │ │ └── handle_proxy_error.py │ │ │ ├── http_clients/ │ │ │ │ ├── parsel_curl_impersonate_example.py │ │ │ │ ├── parsel_httpx_example.py │ │ │ │ └── parsel_impit_example.py │ │ │ ├── http_crawlers/ │ │ │ │ ├── __init__.py │ │ │ │ ├── beautifulsoup_example.py │ │ │ │ ├── custom_crawler_example.py │ │ │ │ ├── http_example.py │ │ │ │ ├── lexbor_parser.py │ │ │ │ ├── lxml_parser.py │ │ │ │ ├── lxml_saxonche_parser.py │ │ │ │ ├── parsel_example.py │ │ │ │ ├── pyquery_parser.py │ │ │ │ ├── scrapling_parser.py │ │ │ │ ├── selectolax_adaptive_run.py │ │ │ │ ├── selectolax_context.py │ │ │ │ ├── selectolax_crawler.py │ │ │ │ ├── selectolax_crawler_run.py │ │ │ │ └── selectolax_parser.py │ │ │ ├── login_crawler/ │ │ │ │ ├── http_login.py │ │ │ │ └── playwright_login.py │ │ │ ├── playwright_crawler/ │ │ │ │ ├── browser_configuration_example.py │ │ │ │ ├── browser_pool_page_hooks_example.py │ │ │ │ ├── multiple_launch_example.py │ │ │ │ ├── navigation_hooks_example.py │ │ │ │ └── plugin_browser_configuration_example.py │ │ │ ├── playwright_crawler_adaptive/ │ │ │ │ ├── handler.py │ │ │ │ ├── init_beautifulsoup.py │ │ │ │ ├── init_parsel.py │ │ │ │ ├── init_prediction.py │ │ │ │ └── pre_nav_hooks.py │ │ │ ├── playwright_crawler_stagehand/ │ │ │ │ ├── __init__.py │ │ │ │ ├── browser_classes.py │ │ │ │ ├── stagehand_run.py │ │ │ │ └── support_classes.py │ │ │ ├── proxy_management/ │ │ │ │ ├── inspecting_bs_example.py │ │ │ │ ├── inspecting_pw_example.py │ │ │ │ ├── integration_bs_example.py │ │ │ │ ├── integration_pw_example.py │ │ │ │ ├── quick_start_example.py │ │ │ │ ├── session_bs_example.py │ │ │ │ ├── session_pw_example.py │ │ │ │ ├── tiers_bs_example.py │ │ │ │ └── tiers_pw_example.py │ │ │ ├── request_loaders/ │ │ │ │ ├── rl_basic_example.py │ │ │ │ ├── rl_basic_example_with_persist.py │ │ │ │ ├── rl_tandem_example.py │ │ │ │ ├── rl_tandem_example_explicit.py │ │ │ │ ├── sitemap_basic_example.py │ │ │ │ ├── sitemap_example_with_persist.py │ │ │ │ ├── sitemap_tandem_example.py │ │ │ │ └── sitemap_tandem_example_explicit.py │ │ │ ├── request_router/ │ │ │ │ ├── adaptive_crawler_handlers.py │ │ │ │ ├── basic_request_handlers.py │ │ │ │ ├── custom_router_default_only.py │ │ │ │ ├── error_handler.py │ │ │ │ ├── failed_request_handler.py │ │ │ │ ├── http_pre_navigation.py │ │ │ │ ├── playwright_pre_navigation.py │ │ │ │ └── simple_default_handler.py │ │ │ ├── running_in_web_server/ │ │ │ │ ├── __init__.py │ │ │ │ ├── crawler.py │ │ │ │ └── server.py │ │ │ ├── scaling_crawlers/ │ │ │ │ ├── max_tasks_per_minute_example.py │ │ │ │ └── min_and_max_concurrency_example.py │ │ │ ├── service_locator/ │ │ │ │ ├── service_conflicts.py │ │ │ │ ├── service_crawler_configuration.py │ │ │ │ ├── service_crawler_event_manager.py │ │ │ │ ├── service_crawler_storage_client.py │ │ │ │ ├── service_locator_configuration.py │ │ │ │ ├── service_locator_event_manager.py │ │ │ │ ├── service_locator_storage_client.py │ │ │ │ ├── service_storage_configuration.py │ │ │ │ └── service_storage_storage_client.py │ │ │ ├── session_management/ │ │ │ │ ├── multi_sessions_http.py │ │ │ │ ├── one_session_http.py │ │ │ │ ├── sm_basic.py │ │ │ │ ├── sm_beautifulsoup.py │ │ │ │ ├── sm_http.py │ │ │ │ ├── sm_parsel.py │ │ │ │ ├── sm_playwright.py │ │ │ │ └── sm_standalone.py │ │ │ ├── storage_clients/ │ │ │ │ ├── custom_storage_client_example.py │ │ │ │ ├── file_system_storage_client_basic_example.py │ │ │ │ ├── file_system_storage_client_configuration_example.py │ │ │ │ ├── memory_storage_client_basic_example.py │ │ │ │ ├── redis_storage_client_basic_example.py │ │ │ │ ├── redis_storage_client_configuration_example.py │ │ │ │ ├── registering_storage_clients_example.py │ │ │ │ ├── sql_storage_client_basic_example.py │ │ │ │ └── sql_storage_client_configuration_example.py │ │ │ ├── storages/ │ │ │ │ ├── cleaning_do_not_purge_example.py │ │ │ │ ├── cleaning_purge_explicitly_example.py │ │ │ │ ├── dataset_basic_example.py │ │ │ │ ├── dataset_with_crawler_example.py │ │ │ │ ├── dataset_with_crawler_explicit_example.py │ │ │ │ ├── helper_add_requests_example.py │ │ │ │ ├── helper_enqueue_links_example.py │ │ │ │ ├── kvs_basic_example.py │ │ │ │ ├── kvs_with_crawler_example.py │ │ │ │ ├── kvs_with_crawler_explicit_example.py │ │ │ │ ├── opening.py │ │ │ │ ├── rq_basic_example.py │ │ │ │ ├── rq_with_crawler_example.py │ │ │ │ └── rq_with_crawler_explicit_example.py │ │ │ └── trace_and_monitor_crawlers/ │ │ │ └── instrument_crawler.py │ │ ├── crawler_login.mdx │ │ ├── creating_web_archive.mdx │ │ ├── error_handling.mdx │ │ ├── http_clients.mdx │ │ ├── http_crawlers.mdx │ │ ├── playwright_crawler.mdx │ │ ├── playwright_crawler_adaptive.mdx │ │ ├── playwright_crawler_stagehand.mdx │ │ ├── proxy_management.mdx │ │ ├── request_loaders.mdx │ │ ├── request_router.mdx │ │ ├── running_in_web_server.mdx │ │ ├── scaling_crawlers.mdx │ │ ├── service_locator.mdx │ │ ├── session_management.mdx │ │ ├── storage_clients.mdx │ │ ├── storages.mdx │ │ └── trace_and_monitor_crawlers.mdx │ ├── introduction/ │ │ ├── 01_setting_up.mdx │ │ ├── 02_first_crawler.mdx │ │ ├── 03_adding_more_urls.mdx │ │ ├── 04_real_world_project.mdx │ │ ├── 05_crawling.mdx │ │ ├── 06_scraping.mdx │ │ ├── 07_saving_data.mdx │ │ ├── 08_refactoring.mdx │ │ ├── 09_running_in_cloud.mdx │ │ ├── code_examples/ │ │ │ ├── 02_bs.py │ │ │ ├── 02_bs_better.py │ │ │ ├── 02_request_queue.py │ │ │ ├── 03_enqueue_strategy.py │ │ │ ├── 03_finding_new_links.py │ │ │ ├── 03_globs.py │ │ │ ├── 03_original_code.py │ │ │ ├── 03_transform_request.py │ │ │ ├── 04_sanity_check.py │ │ │ ├── 05_crawling_detail.py │ │ │ ├── 05_crawling_listing.py │ │ │ ├── 06_scraping.py │ │ │ ├── 07_final_code.py │ │ │ ├── 07_first_code.py │ │ │ ├── 08_main.py │ │ │ ├── 08_routes.py │ │ │ ├── 09_apify_sdk.py │ │ │ ├── __init__.py │ │ │ └── routes.py │ │ └── index.mdx │ ├── pyproject.toml │ ├── quick-start/ │ │ ├── code_examples/ │ │ │ ├── beautifulsoup_crawler_example.py │ │ │ ├── parsel_crawler_example.py │ │ │ ├── playwright_crawler_example.py │ │ │ └── playwright_crawler_headful_example.py │ │ └── index.mdx │ └── upgrading/ │ ├── upgrading_to_v0x.md │ └── upgrading_to_v1.md ├── pyproject.toml ├── renovate.json ├── src/ │ └── crawlee/ │ ├── __init__.py │ ├── _autoscaling/ │ │ ├── __init__.py │ │ ├── _types.py │ │ ├── autoscaled_pool.py │ │ ├── py.typed │ │ ├── snapshotter.py │ │ └── system_status.py │ ├── _cli.py │ ├── _consts.py │ ├── _log_config.py │ ├── _request.py │ ├── _service_locator.py │ ├── _types.py │ ├── _utils/ │ │ ├── __init__.py │ │ ├── blocked.py │ │ ├── byte_size.py │ │ ├── console.py │ │ ├── context.py │ │ ├── crypto.py │ │ ├── docs.py │ │ ├── file.py │ │ ├── globs.py │ │ ├── html_to_text.py │ │ ├── models.py │ │ ├── raise_if_too_many_kwargs.py │ │ ├── recoverable_state.py │ │ ├── recurring_task.py │ │ ├── requests.py │ │ ├── robots.py │ │ ├── sitemap.py │ │ ├── system.py │ │ ├── time.py │ │ ├── try_import.py │ │ ├── urls.py │ │ ├── wait.py │ │ └── web.py │ ├── browsers/ │ │ ├── __init__.py │ │ ├── _browser_controller.py │ │ ├── _browser_plugin.py │ │ ├── _browser_pool.py │ │ ├── _playwright_browser.py │ │ ├── _playwright_browser_controller.py │ │ ├── _playwright_browser_plugin.py │ │ ├── _types.py │ │ └── py.typed │ ├── configuration.py │ ├── crawlers/ │ │ ├── __init__.py │ │ ├── _abstract_http/ │ │ │ ├── __init__.py │ │ │ ├── _abstract_http_crawler.py │ │ │ ├── _abstract_http_parser.py │ │ │ ├── _http_crawling_context.py │ │ │ └── py.typed │ │ ├── _adaptive_playwright/ │ │ │ ├── __init__.py │ │ │ ├── _adaptive_playwright_crawler.py │ │ │ ├── _adaptive_playwright_crawler_statistics.py │ │ │ ├── _adaptive_playwright_crawling_context.py │ │ │ ├── _rendering_type_predictor.py │ │ │ ├── _result_comparator.py │ │ │ └── _utils.py │ │ ├── _basic/ │ │ │ ├── __init__.py │ │ │ ├── _basic_crawler.py │ │ │ ├── _basic_crawling_context.py │ │ │ ├── _context_pipeline.py │ │ │ ├── _context_utils.py │ │ │ ├── _logging_utils.py │ │ │ └── py.typed │ │ ├── _beautifulsoup/ │ │ │ ├── __init__.py │ │ │ ├── _beautifulsoup_crawler.py │ │ │ ├── _beautifulsoup_crawling_context.py │ │ │ ├── _beautifulsoup_parser.py │ │ │ ├── _utils.py │ │ │ └── py.typed │ │ ├── _http/ │ │ │ ├── __init__.py │ │ │ ├── _http_crawler.py │ │ │ └── _http_parser.py │ │ ├── _parsel/ │ │ │ ├── __init__.py │ │ │ ├── _parsel_crawler.py │ │ │ ├── _parsel_crawling_context.py │ │ │ ├── _parsel_parser.py │ │ │ └── _utils.py │ │ ├── _playwright/ │ │ │ ├── __init__.py │ │ │ ├── _playwright_crawler.py │ │ │ ├── _playwright_crawling_context.py │ │ │ ├── _playwright_http_client.py │ │ │ ├── _playwright_post_nav_crawling_context.py │ │ │ ├── _playwright_pre_nav_crawling_context.py │ │ │ ├── _types.py │ │ │ └── _utils.py │ │ ├── _types.py │ │ └── py.typed │ ├── errors.py │ ├── events/ │ │ ├── __init__.py │ │ ├── _event_manager.py │ │ ├── _local_event_manager.py │ │ ├── _types.py │ │ └── py.typed │ ├── fingerprint_suite/ │ │ ├── __init__.py │ │ ├── _browserforge_adapter.py │ │ ├── _consts.py │ │ ├── _fingerprint_generator.py │ │ ├── _header_generator.py │ │ ├── _types.py │ │ └── py.typed │ ├── http_clients/ │ │ ├── __init__.py │ │ ├── _base.py │ │ ├── _curl_impersonate.py │ │ ├── _httpx.py │ │ └── _impit.py │ ├── otel/ │ │ ├── __init__.py │ │ └── crawler_instrumentor.py │ ├── project_template/ │ │ ├── cookiecutter.json │ │ ├── hooks/ │ │ │ ├── post_gen_project.py │ │ │ └── pre_gen_project.py │ │ ├── templates/ │ │ │ ├── main.py │ │ │ ├── main_beautifulsoup.py │ │ │ ├── main_parsel.py │ │ │ ├── main_playwright.py │ │ │ ├── main_playwright_camoufox.py │ │ │ ├── main_playwright_chrome.py │ │ │ ├── main_playwright_firefox.py │ │ │ ├── main_playwright_webkit.py │ │ │ ├── routes_beautifulsoup.py │ │ │ ├── routes_parsel.py │ │ │ └── routes_playwright.py │ │ └── {{cookiecutter.project_name}}/ │ │ ├── .dockerignore │ │ ├── Dockerfile │ │ ├── README.md │ │ ├── pyproject.toml │ │ ├── requirements.txt │ │ └── {{cookiecutter.__package_name}}/ │ │ ├── __init__.py │ │ ├── __main__.py │ │ ├── main.py │ │ └── routes.py │ ├── proxy_configuration.py │ ├── py.typed │ ├── request_loaders/ │ │ ├── __init__.py │ │ ├── _request_list.py │ │ ├── _request_loader.py │ │ ├── _request_manager.py │ │ ├── _request_manager_tandem.py │ │ └── _sitemap_request_loader.py │ ├── router.py │ ├── sessions/ │ │ ├── __init__.py │ │ ├── _cookies.py │ │ ├── _models.py │ │ ├── _session.py │ │ ├── _session_pool.py │ │ └── py.typed │ ├── statistics/ │ │ ├── __init__.py │ │ ├── _error_snapshotter.py │ │ ├── _error_tracker.py │ │ ├── _models.py │ │ └── _statistics.py │ ├── storage_clients/ │ │ ├── __init__.py │ │ ├── _base/ │ │ │ ├── __init__.py │ │ │ ├── _dataset_client.py │ │ │ ├── _key_value_store_client.py │ │ │ ├── _request_queue_client.py │ │ │ ├── _storage_client.py │ │ │ └── py.typed │ │ ├── _file_system/ │ │ │ ├── __init__.py │ │ │ ├── _dataset_client.py │ │ │ ├── _key_value_store_client.py │ │ │ ├── _request_queue_client.py │ │ │ ├── _storage_client.py │ │ │ ├── _utils.py │ │ │ └── py.typed │ │ ├── _memory/ │ │ │ ├── __init__.py │ │ │ ├── _dataset_client.py │ │ │ ├── _key_value_store_client.py │ │ │ ├── _request_queue_client.py │ │ │ ├── _storage_client.py │ │ │ └── py.typed │ │ ├── _redis/ │ │ │ ├── __init__.py │ │ │ ├── _client_mixin.py │ │ │ ├── _dataset_client.py │ │ │ ├── _key_value_store_client.py │ │ │ ├── _request_queue_client.py │ │ │ ├── _storage_client.py │ │ │ ├── _utils.py │ │ │ ├── lua_scripts/ │ │ │ │ ├── atomic_bloom_add_requests.lua │ │ │ │ ├── atomic_fetch_request.lua │ │ │ │ ├── atomic_set_add_requests.lua │ │ │ │ └── reclaim_stale_requests.lua │ │ │ └── py.typed │ │ ├── _sql/ │ │ │ ├── __init__.py │ │ │ ├── _client_mixin.py │ │ │ ├── _dataset_client.py │ │ │ ├── _db_models.py │ │ │ ├── _key_value_store_client.py │ │ │ ├── _request_queue_client.py │ │ │ ├── _storage_client.py │ │ │ └── py.typed │ │ ├── models.py │ │ └── py.typed │ └── storages/ │ ├── __init__.py │ ├── _base.py │ ├── _dataset.py │ ├── _key_value_store.py │ ├── _request_queue.py │ ├── _storage_instance_manager.py │ ├── _utils.py │ └── py.typed ├── tests/ │ ├── __init__.py │ ├── e2e/ │ │ ├── __init__.py │ │ ├── conftest.py │ │ └── project_template/ │ │ ├── test_static_crawlers_templates.py │ │ └── utils.py │ └── unit/ │ ├── README.md │ ├── __init__.py │ ├── _autoscaling/ │ │ ├── test_autoscaled_pool.py │ │ ├── test_snapshotter.py │ │ └── test_system_status.py │ ├── _statistics/ │ │ ├── test_error_tracker.py │ │ ├── test_periodic_logging.py │ │ ├── test_persistence.py │ │ ├── test_request_max_duration.py │ │ └── test_request_processing_record.py │ ├── _utils/ │ │ ├── test_byte_size.py │ │ ├── test_console.py │ │ ├── test_crypto.py │ │ ├── test_file.py │ │ ├── test_globs.py │ │ ├── test_html_to_text.py │ │ ├── test_measure_time.py │ │ ├── test_raise_if_too_many_kwargs.py │ │ ├── test_recurring_task.py │ │ ├── test_requests.py │ │ ├── test_robots.py │ │ ├── test_shared_timeout.py │ │ ├── test_sitemap.py │ │ ├── test_system.py │ │ ├── test_timedelta_ms.py │ │ └── test_urls.py │ ├── browsers/ │ │ ├── test_browser_pool.py │ │ ├── test_playwright_browser.py │ │ ├── test_playwright_browser_controller.py │ │ └── test_playwright_browser_plugin.py │ ├── conftest.py │ ├── crawlers/ │ │ ├── _adaptive_playwright/ │ │ │ ├── test_adaptive_playwright_crawler.py │ │ │ ├── test_adaptive_playwright_crawler_statistics.py │ │ │ ├── test_adaptive_playwright_crawling_context.py │ │ │ └── test_predictor.py │ │ ├── _basic/ │ │ │ ├── test_basic_crawler.py │ │ │ └── test_context_pipeline.py │ │ ├── _beautifulsoup/ │ │ │ └── test_beautifulsoup_crawler.py │ │ ├── _http/ │ │ │ └── test_http_crawler.py │ │ ├── _parsel/ │ │ │ └── test_parsel_crawler.py │ │ └── _playwright/ │ │ ├── test_playwright_crawler.py │ │ └── test_utils.py │ ├── events/ │ │ ├── test_event_manager.py │ │ └── test_local_event_manager.py │ ├── fingerprint_suite/ │ │ ├── test_adapters.py │ │ └── test_header_generator.py │ ├── http_clients/ │ │ ├── test_http_clients.py │ │ └── test_httpx.py │ ├── otel/ │ │ └── test_crawler_instrumentor.py │ ├── proxy_configuration/ │ │ ├── test_new_proxy_info.py │ │ └── test_tiers.py │ ├── request_loaders/ │ │ ├── test_request_list.py │ │ └── test_sitemap_request_loader.py │ ├── server.py │ ├── server_endpoints.py │ ├── server_static/ │ │ └── test.js │ ├── sessions/ │ │ ├── test_cookies.py │ │ ├── test_models.py │ │ ├── test_session.py │ │ └── test_session_pool.py │ ├── storage_clients/ │ │ ├── _file_system/ │ │ │ ├── test_fs_dataset_client.py │ │ │ ├── test_fs_kvs_client.py │ │ │ └── test_fs_rq_client.py │ │ ├── _memory/ │ │ │ ├── test_memory_dataset_client.py │ │ │ ├── test_memory_kvs_client.py │ │ │ └── test_memory_rq_client.py │ │ ├── _redis/ │ │ │ ├── test_redis_dataset_client.py │ │ │ ├── test_redis_kvs_client.py │ │ │ └── test_redis_rq_client.py │ │ └── _sql/ │ │ ├── test_sql_dataset_client.py │ │ ├── test_sql_kvs_client.py │ │ └── test_sql_rq_client.py │ ├── storages/ │ │ ├── conftest.py │ │ ├── test_dataset.py │ │ ├── test_key_value_store.py │ │ ├── test_request_manager_tandem.py │ │ ├── test_request_queue.py │ │ └── test_storage_instance_manager.py │ ├── test_cli.py │ ├── test_configuration.py │ ├── test_log_config.py │ ├── test_router.py │ ├── test_service_locator.py │ └── utils.py ├── typos.toml └── website/ ├── .eslintrc.json ├── .yarnrc.yml ├── babel.config.js ├── build_api_reference.sh ├── docusaurus.config.js ├── generate_module_shortcuts.py ├── package.json ├── patches/ │ ├── @docusaurus+core+3.4.0.patch │ └── @docusaurus+core+3.5.2.patch ├── roa-loader/ │ ├── index.js │ └── package.json ├── sidebars.js ├── src/ │ ├── components/ │ │ ├── ApiLink.jsx │ │ ├── Button.jsx │ │ ├── Button.module.css │ │ ├── CopyButton.jsx │ │ ├── CopyButton.module.css │ │ ├── Gradients.jsx │ │ ├── Highlights.jsx │ │ ├── Highlights.module.css │ │ ├── Homepage/ │ │ │ ├── HomepageCliExample.jsx │ │ │ ├── HomepageCliExample.module.css │ │ │ ├── HomepageCtaSection.jsx │ │ │ ├── HomepageCtaSection.module.css │ │ │ ├── HomepageHeroSection.jsx │ │ │ ├── HomepageHeroSection.module.css │ │ │ ├── LanguageInfoWidget.jsx │ │ │ ├── LanguageInfoWidget.module.css │ │ │ ├── LanguageSwitch.jsx │ │ │ ├── LanguageSwitch.module.css │ │ │ ├── RiverSection.jsx │ │ │ ├── RiverSection.module.css │ │ │ ├── ThreeCardsWithIcon.jsx │ │ │ └── ThreeCardsWithIcon.module.css │ │ ├── LLMButtons.jsx │ │ ├── LLMButtons.module.css │ │ ├── RunnableCodeBlock.jsx │ │ └── RunnableCodeBlock.module.css │ ├── css/ │ │ └── custom.css │ ├── pages/ │ │ ├── home_page_example.py │ │ ├── index.js │ │ └── index.module.css │ ├── plugins/ │ │ └── docusaurus-plugin-segment/ │ │ ├── index.js │ │ └── segment.js │ └── theme/ │ ├── ColorModeToggle/ │ │ ├── index.js │ │ └── styles.module.css │ ├── DocItem/ │ │ ├── Content/ │ │ │ ├── index.js │ │ │ └── styles.module.css │ │ └── Layout/ │ │ ├── index.js │ │ └── styles.module.css │ ├── Footer/ │ │ ├── LinkItem/ │ │ │ ├── index.js │ │ │ └── index.module.css │ │ ├── index.js │ │ └── index.module.css │ ├── MDXComponents/ │ │ └── A.js │ ├── Navbar/ │ │ ├── Content/ │ │ │ ├── index.js │ │ │ └── styles.module.css │ │ ├── Logo/ │ │ │ ├── index.js │ │ │ └── index.module.css │ │ └── MobileSidebar/ │ │ ├── Header/ │ │ │ ├── index.js │ │ │ └── index.module.css │ │ ├── Layout/ │ │ │ └── index.js │ │ ├── PrimaryMenu/ │ │ │ └── index.js │ │ └── index.js │ └── NavbarItem/ │ └── ComponentTypes.js ├── static/ │ ├── .nojekyll │ ├── js/ │ │ └── custom.js │ └── robots.txt ├── tools/ │ ├── docs-prettier.config.js │ ├── utils/ │ │ └── externalLink.js │ └── website_gif/ │ └── website_gif.mjs └── tsconfig.eslint.json