crawlee 1.0.0__tar.gz → 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (675) hide show
  1. {crawlee-1.0.0 → crawlee-1.0.1}/.github/workflows/pre_release.yaml +1 -1
  2. {crawlee-1.0.0 → crawlee-1.0.1}/CHANGELOG.md +8 -0
  3. {crawlee-1.0.0 → crawlee-1.0.1}/PKG-INFO +1 -3
  4. {crawlee-1.0.0 → crawlee-1.0.1}/README.md +0 -2
  5. {crawlee-1.0.0 → crawlee-1.0.1}/pyproject.toml +2 -2
  6. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/_playwright_browser_controller.py +20 -14
  7. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/pyproject.toml +2 -2
  8. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/requirements.txt +3 -0
  9. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/browsers/test_playwright_browser_controller.py +28 -2
  10. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/conftest.py +5 -2
  11. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_basic/test_basic_crawler.py +1 -1
  12. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_sql/test_sql_dataset_client.py +0 -5
  13. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_sql/test_sql_kvs_client.py +0 -5
  14. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_sql/test_sql_rq_client.py +0 -5
  15. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storages/conftest.py +1 -4
  16. {crawlee-1.0.0 → crawlee-1.0.1}/uv.lock +1212 -1027
  17. {crawlee-1.0.0 → crawlee-1.0.1}/website/docusaurus.config.js +4 -0
  18. {crawlee-1.0.0 → crawlee-1.0.1}/website/package.json +6 -6
  19. {crawlee-1.0.0 → crawlee-1.0.1}/website/yarn.lock +767 -742
  20. {crawlee-1.0.0 → crawlee-1.0.1}/.editorconfig +0 -0
  21. {crawlee-1.0.0 → crawlee-1.0.1}/.github/CODEOWNERS +0 -0
  22. {crawlee-1.0.0 → crawlee-1.0.1}/.github/pull_request_template.md +0 -0
  23. {crawlee-1.0.0 → crawlee-1.0.1}/.github/workflows/build_and_deploy_docs.yaml +0 -0
  24. {crawlee-1.0.0 → crawlee-1.0.1}/.github/workflows/check_pr_title.yaml +0 -0
  25. {crawlee-1.0.0 → crawlee-1.0.1}/.github/workflows/release.yaml +0 -0
  26. {crawlee-1.0.0 → crawlee-1.0.1}/.github/workflows/run_code_checks.yaml +0 -0
  27. {crawlee-1.0.0 → crawlee-1.0.1}/.github/workflows/templates_e2e_tests.yaml +0 -0
  28. {crawlee-1.0.0 → crawlee-1.0.1}/.github/workflows/update_new_issue.yaml +0 -0
  29. {crawlee-1.0.0 → crawlee-1.0.1}/.gitignore +0 -0
  30. {crawlee-1.0.0 → crawlee-1.0.1}/.markdownlint.yaml +0 -0
  31. {crawlee-1.0.0 → crawlee-1.0.1}/.pre-commit-config.yaml +0 -0
  32. {crawlee-1.0.0 → crawlee-1.0.1}/CONTRIBUTING.md +0 -0
  33. {crawlee-1.0.0 → crawlee-1.0.1}/LICENSE +0 -0
  34. {crawlee-1.0.0 → crawlee-1.0.1}/Makefile +0 -0
  35. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/apify_platform.mdx +0 -0
  36. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/code_examples/apify/crawler_as_actor_example.py +0 -0
  37. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/code_examples/apify/get_public_url.py +0 -0
  38. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/code_examples/apify/log_with_config_example.py +0 -0
  39. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/code_examples/apify/proxy_advanced_example.py +0 -0
  40. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/code_examples/apify/proxy_example.py +0 -0
  41. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/code_examples/google/cloud_run_example.py +0 -0
  42. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/code_examples/google/google_example.py +0 -0
  43. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/google_cloud.mdx +0 -0
  44. {crawlee-1.0.0 → crawlee-1.0.1}/docs/deployment/google_cloud_run.mdx +0 -0
  45. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/add_data_to_dataset.mdx +0 -0
  46. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/beautifulsoup_crawler.mdx +0 -0
  47. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/capture_screenshot_using_playwright.mdx +0 -0
  48. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/capturing_page_snapshots_with_error_snapshotter.mdx +0 -0
  49. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/adaptive_playwright_crawler.py +0 -0
  50. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/add_data_to_dataset_bs.py +0 -0
  51. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/add_data_to_dataset_dataset.py +0 -0
  52. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/add_data_to_dataset_pw.py +0 -0
  53. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/beautifulsoup_crawler.py +0 -0
  54. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/beautifulsoup_crawler_keep_alive.py +0 -0
  55. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/beautifulsoup_crawler_stop.py +0 -0
  56. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/capture_screenshot_using_playwright.py +0 -0
  57. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/configure_json_logging.py +0 -0
  58. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_all_links_on_website_bs.py +0 -0
  59. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_all_links_on_website_pw.py +0 -0
  60. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_multiple_urls_bs.py +0 -0
  61. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_multiple_urls_pw.py +0 -0
  62. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_specific_links_on_website_bs.py +0 -0
  63. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_specific_links_on_website_pw.py +0 -0
  64. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_website_with_relative_links_all_links.py +0 -0
  65. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_website_with_relative_links_same_domain.py +0 -0
  66. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_website_with_relative_links_same_hostname.py +0 -0
  67. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/crawl_website_with_relative_links_same_origin.py +0 -0
  68. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/export_entire_dataset_to_file_csv.py +0 -0
  69. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/export_entire_dataset_to_file_json.py +0 -0
  70. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/extract_and_add_specific_links_on_website_bs.py +0 -0
  71. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/extract_and_add_specific_links_on_website_pw.py +0 -0
  72. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/fill_and_submit_web_form_crawler.py +0 -0
  73. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/fill_and_submit_web_form_request.py +0 -0
  74. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/parsel_crawler.py +0 -0
  75. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/parsel_crawler_with_error_snapshotter.py +0 -0
  76. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/playwright_block_requests.py +0 -0
  77. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/playwright_crawler.py +0 -0
  78. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/playwright_crawler_with_camoufox.py +0 -0
  79. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/playwright_crawler_with_error_snapshotter.py +0 -0
  80. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/playwright_crawler_with_fingerprint_generator.py +0 -0
  81. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/respect_robots_on_skipped_request.py +0 -0
  82. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/respect_robots_txt_file.py +0 -0
  83. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/code_examples/resuming_paused_crawl.py +0 -0
  84. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/crawl_all_links_on_website.mdx +0 -0
  85. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/crawl_multiple_urls.mdx +0 -0
  86. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/crawl_specific_links_on_website.mdx +0 -0
  87. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/crawl_website_with_relative_links.mdx +0 -0
  88. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/crawler_keep_alive.mdx +0 -0
  89. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/crawler_stop.mdx +0 -0
  90. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/export_entire_dataset_to_file.mdx +0 -0
  91. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/fill_and_submit_web_form.mdx +0 -0
  92. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/json_logging.mdx +0 -0
  93. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/parsel_crawler.mdx +0 -0
  94. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/playwright_crawler.mdx +0 -0
  95. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/playwright_crawler_adaptive.mdx +0 -0
  96. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/playwright_crawler_with_block_requests.mdx +0 -0
  97. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/playwright_crawler_with_camoufox.mdx +0 -0
  98. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/playwright_crawler_with_fingerprint_generator.mdx +0 -0
  99. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/respect_robots_txt_file.mdx +0 -0
  100. {crawlee-1.0.0 → crawlee-1.0.1}/docs/examples/resuming_paused_crawl.mdx +0 -0
  101. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/architecture_overview.mdx +0 -0
  102. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/avoid_blocking.mdx +0 -0
  103. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/avoid_blocking/default_fingerprint_generator_with_args.py +0 -0
  104. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/avoid_blocking/playwright_with_fingerprint_generator.py +0 -0
  105. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/creating_web_archive/manual_archiving_parsel_crawler.py +0 -0
  106. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/creating_web_archive/manual_archiving_playwright_crawler.py +0 -0
  107. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/creating_web_archive/simple_pw_through_proxy_pywb_server.py +0 -0
  108. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/error_handling/change_handle_error_status.py +0 -0
  109. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/error_handling/disable_retry.py +0 -0
  110. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/error_handling/handle_proxy_error.py +0 -0
  111. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/http_clients/parsel_curl_impersonate_example.py +0 -0
  112. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/http_clients/parsel_httpx_example.py +0 -0
  113. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/http_clients/parsel_impit_example.py +0 -0
  114. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/http_crawlers/beautifulsoup_example.py +0 -0
  115. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/http_crawlers/custom_crawler_example.py +0 -0
  116. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/http_crawlers/http_example.py +0 -0
  117. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/http_crawlers/parsel_example.py +0 -0
  118. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/login_crawler/http_login.py +0 -0
  119. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/login_crawler/playwright_login.py +0 -0
  120. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler/browser_configuration_example.py +0 -0
  121. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler/multiple_launch_example.py +0 -0
  122. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler/plugin_browser_configuration_example.py +0 -0
  123. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler/pre_navigation_hook_example.py +0 -0
  124. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_adaptive/handler.py +0 -0
  125. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_adaptive/init_beautifulsoup.py +0 -0
  126. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_adaptive/init_parsel.py +0 -0
  127. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_adaptive/init_prediction.py +0 -0
  128. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_adaptive/pre_nav_hooks.py +0 -0
  129. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_stagehand/__init__.py +0 -0
  130. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_stagehand/browser_classes.py +0 -0
  131. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_stagehand/stagehand_run.py +0 -0
  132. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/playwright_crawler_stagehand/support_classes.py +0 -0
  133. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/inspecting_bs_example.py +0 -0
  134. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/inspecting_pw_example.py +0 -0
  135. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/integration_bs_example.py +0 -0
  136. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/integration_pw_example.py +0 -0
  137. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/quick_start_example.py +0 -0
  138. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/session_bs_example.py +0 -0
  139. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/session_pw_example.py +0 -0
  140. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/tiers_bs_example.py +0 -0
  141. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/proxy_management/tiers_pw_example.py +0 -0
  142. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_loaders/rl_basic_example.py +0 -0
  143. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_loaders/rl_basic_example_with_persist.py +0 -0
  144. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_loaders/rl_tandem_example.py +0 -0
  145. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_loaders/rl_tandem_example_explicit.py +0 -0
  146. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_loaders/sitemap_basic_example.py +0 -0
  147. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_loaders/sitemap_example_with_persist.py +0 -0
  148. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_loaders/sitemap_tandem_example.py +0 -0
  149. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_loaders/sitemap_tandem_example_explicit.py +0 -0
  150. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_router/adaptive_crawler_handlers.py +0 -0
  151. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_router/basic_request_handlers.py +0 -0
  152. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_router/custom_router_default_only.py +0 -0
  153. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_router/error_handler.py +0 -0
  154. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_router/failed_request_handler.py +0 -0
  155. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_router/http_pre_navigation.py +0 -0
  156. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_router/playwright_pre_navigation.py +0 -0
  157. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/request_router/simple_default_handler.py +0 -0
  158. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/running_in_web_server/__init__.py +0 -0
  159. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/running_in_web_server/crawler.py +0 -0
  160. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/running_in_web_server/server.py +0 -0
  161. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/scaling_crawlers/max_tasks_per_minute_example.py +0 -0
  162. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/scaling_crawlers/min_and_max_concurrency_example.py +0 -0
  163. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_conflicts.py +0 -0
  164. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_crawler_configuration.py +0 -0
  165. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_crawler_event_manager.py +0 -0
  166. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_crawler_storage_client.py +0 -0
  167. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_locator_configuration.py +0 -0
  168. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_locator_event_manager.py +0 -0
  169. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_locator_storage_client.py +0 -0
  170. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_storage_configuration.py +0 -0
  171. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/service_locator/service_storage_storage_client.py +0 -0
  172. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/session_management/multi_sessions_http.py +0 -0
  173. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/session_management/one_session_http.py +0 -0
  174. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/session_management/sm_basic.py +0 -0
  175. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/session_management/sm_beautifulsoup.py +0 -0
  176. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/session_management/sm_http.py +0 -0
  177. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/session_management/sm_parsel.py +0 -0
  178. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/session_management/sm_playwright.py +0 -0
  179. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/session_management/sm_standalone.py +0 -0
  180. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storage_clients/custom_storage_client_example.py +0 -0
  181. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storage_clients/file_system_storage_client_basic_example.py +0 -0
  182. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storage_clients/file_system_storage_client_configuration_example.py +0 -0
  183. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storage_clients/memory_storage_client_basic_example.py +0 -0
  184. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storage_clients/registering_storage_clients_example.py +0 -0
  185. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storage_clients/sql_storage_client_basic_example.py +0 -0
  186. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storage_clients/sql_storage_client_configuration_example.py +0 -0
  187. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/cleaning_do_not_purge_example.py +0 -0
  188. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/cleaning_purge_explicitly_example.py +0 -0
  189. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/dataset_basic_example.py +0 -0
  190. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/dataset_with_crawler_example.py +0 -0
  191. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/dataset_with_crawler_explicit_example.py +0 -0
  192. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/helper_add_requests_example.py +0 -0
  193. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/helper_enqueue_links_example.py +0 -0
  194. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/kvs_basic_example.py +0 -0
  195. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/kvs_with_crawler_example.py +0 -0
  196. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/kvs_with_crawler_explicit_example.py +0 -0
  197. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/opening.py +0 -0
  198. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/rq_basic_example.py +0 -0
  199. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/rq_with_crawler_example.py +0 -0
  200. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/storages/rq_with_crawler_explicit_example.py +0 -0
  201. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/code_examples/trace_and_monitor_crawlers/instrument_crawler.py +0 -0
  202. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/crawler_login.mdx +0 -0
  203. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/creating_web_archive.mdx +0 -0
  204. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/error_handling.mdx +0 -0
  205. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/http_clients.mdx +0 -0
  206. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/http_crawlers.mdx +0 -0
  207. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/playwright_crawler.mdx +0 -0
  208. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/playwright_crawler_adaptive.mdx +0 -0
  209. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/playwright_crawler_stagehand.mdx +0 -0
  210. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/proxy_management.mdx +0 -0
  211. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/request_loaders.mdx +0 -0
  212. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/request_router.mdx +0 -0
  213. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/running_in_web_server.mdx +0 -0
  214. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/scaling_crawlers.mdx +0 -0
  215. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/service_locator.mdx +0 -0
  216. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/session_management.mdx +0 -0
  217. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/storage_clients.mdx +0 -0
  218. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/storages.mdx +0 -0
  219. {crawlee-1.0.0 → crawlee-1.0.1}/docs/guides/trace_and_monitor_crawlers.mdx +0 -0
  220. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/01_setting_up.mdx +0 -0
  221. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/02_first_crawler.mdx +0 -0
  222. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/03_adding_more_urls.mdx +0 -0
  223. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/04_real_world_project.mdx +0 -0
  224. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/05_crawling.mdx +0 -0
  225. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/06_scraping.mdx +0 -0
  226. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/07_saving_data.mdx +0 -0
  227. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/08_refactoring.mdx +0 -0
  228. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/09_running_in_cloud.mdx +0 -0
  229. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/02_bs.py +0 -0
  230. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/02_bs_better.py +0 -0
  231. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/02_request_queue.py +0 -0
  232. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/03_enqueue_strategy.py +0 -0
  233. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/03_finding_new_links.py +0 -0
  234. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/03_globs.py +0 -0
  235. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/03_original_code.py +0 -0
  236. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/03_transform_request.py +0 -0
  237. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/04_sanity_check.py +0 -0
  238. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/05_crawling_detail.py +0 -0
  239. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/05_crawling_listing.py +0 -0
  240. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/06_scraping.py +0 -0
  241. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/07_final_code.py +0 -0
  242. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/07_first_code.py +0 -0
  243. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/08_main.py +0 -0
  244. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/08_routes.py +0 -0
  245. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/09_apify_sdk.py +0 -0
  246. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/__init__.py +0 -0
  247. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/code_examples/routes.py +0 -0
  248. {crawlee-1.0.0 → crawlee-1.0.1}/docs/introduction/index.mdx +0 -0
  249. {crawlee-1.0.0 → crawlee-1.0.1}/docs/pyproject.toml +0 -0
  250. {crawlee-1.0.0 → crawlee-1.0.1}/docs/quick-start/code_examples/beautifulsoup_crawler_example.py +0 -0
  251. {crawlee-1.0.0 → crawlee-1.0.1}/docs/quick-start/code_examples/parsel_crawler_example.py +0 -0
  252. {crawlee-1.0.0 → crawlee-1.0.1}/docs/quick-start/code_examples/playwright_crawler_example.py +0 -0
  253. {crawlee-1.0.0 → crawlee-1.0.1}/docs/quick-start/code_examples/playwright_crawler_headful_example.py +0 -0
  254. {crawlee-1.0.0 → crawlee-1.0.1}/docs/quick-start/index.mdx +0 -0
  255. {crawlee-1.0.0 → crawlee-1.0.1}/docs/upgrading/upgrading_to_v0x.md +0 -0
  256. {crawlee-1.0.0 → crawlee-1.0.1}/docs/upgrading/upgrading_to_v1.md +0 -0
  257. {crawlee-1.0.0 → crawlee-1.0.1}/renovate.json +0 -0
  258. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/__init__.py +0 -0
  259. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_autoscaling/__init__.py +0 -0
  260. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_autoscaling/_types.py +0 -0
  261. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_autoscaling/autoscaled_pool.py +0 -0
  262. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_autoscaling/py.typed +0 -0
  263. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_autoscaling/snapshotter.py +0 -0
  264. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_autoscaling/system_status.py +0 -0
  265. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_browserforge_workaround.py +0 -0
  266. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_cli.py +0 -0
  267. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_consts.py +0 -0
  268. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_log_config.py +0 -0
  269. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_request.py +0 -0
  270. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_service_locator.py +0 -0
  271. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_types.py +0 -0
  272. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/__init__.py +0 -0
  273. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/blocked.py +0 -0
  274. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/byte_size.py +0 -0
  275. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/console.py +0 -0
  276. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/context.py +0 -0
  277. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/crypto.py +0 -0
  278. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/docs.py +0 -0
  279. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/file.py +0 -0
  280. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/globs.py +0 -0
  281. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/html_to_text.py +0 -0
  282. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/models.py +0 -0
  283. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/raise_if_too_many_kwargs.py +0 -0
  284. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/recoverable_state.py +0 -0
  285. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/recurring_task.py +0 -0
  286. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/requests.py +0 -0
  287. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/robots.py +0 -0
  288. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/sitemap.py +0 -0
  289. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/system.py +0 -0
  290. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/time.py +0 -0
  291. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/try_import.py +0 -0
  292. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/urls.py +0 -0
  293. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/wait.py +0 -0
  294. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/_utils/web.py +0 -0
  295. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/__init__.py +0 -0
  296. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/_browser_controller.py +0 -0
  297. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/_browser_plugin.py +0 -0
  298. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/_browser_pool.py +0 -0
  299. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/_playwright_browser.py +0 -0
  300. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/_playwright_browser_plugin.py +0 -0
  301. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/_types.py +0 -0
  302. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/browsers/py.typed +0 -0
  303. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/configuration.py +0 -0
  304. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/__init__.py +0 -0
  305. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_abstract_http/__init__.py +0 -0
  306. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_abstract_http/_abstract_http_crawler.py +0 -0
  307. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_abstract_http/_abstract_http_parser.py +0 -0
  308. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_abstract_http/_http_crawling_context.py +0 -0
  309. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_abstract_http/py.typed +0 -0
  310. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_adaptive_playwright/__init__.py +0 -0
  311. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_adaptive_playwright/_adaptive_playwright_crawler.py +0 -0
  312. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_adaptive_playwright/_adaptive_playwright_crawler_statistics.py +0 -0
  313. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_adaptive_playwright/_adaptive_playwright_crawling_context.py +0 -0
  314. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_adaptive_playwright/_rendering_type_predictor.py +0 -0
  315. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_adaptive_playwright/_result_comparator.py +0 -0
  316. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_adaptive_playwright/_utils.py +0 -0
  317. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_basic/__init__.py +0 -0
  318. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_basic/_basic_crawler.py +0 -0
  319. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_basic/_basic_crawling_context.py +0 -0
  320. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_basic/_context_pipeline.py +0 -0
  321. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_basic/_logging_utils.py +0 -0
  322. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_basic/py.typed +0 -0
  323. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_beautifulsoup/__init__.py +0 -0
  324. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_beautifulsoup/_beautifulsoup_crawler.py +0 -0
  325. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_beautifulsoup/_beautifulsoup_crawling_context.py +0 -0
  326. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_beautifulsoup/_beautifulsoup_parser.py +0 -0
  327. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_beautifulsoup/_utils.py +0 -0
  328. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_beautifulsoup/py.typed +0 -0
  329. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_http/__init__.py +0 -0
  330. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_http/_http_crawler.py +0 -0
  331. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_http/_http_parser.py +0 -0
  332. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_parsel/__init__.py +0 -0
  333. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_parsel/_parsel_crawler.py +0 -0
  334. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_parsel/_parsel_crawling_context.py +0 -0
  335. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_parsel/_parsel_parser.py +0 -0
  336. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_parsel/_utils.py +0 -0
  337. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_playwright/__init__.py +0 -0
  338. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_playwright/_playwright_crawler.py +0 -0
  339. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_playwright/_playwright_crawling_context.py +0 -0
  340. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_playwright/_playwright_http_client.py +0 -0
  341. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_playwright/_playwright_pre_nav_crawling_context.py +0 -0
  342. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_playwright/_types.py +0 -0
  343. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_playwright/_utils.py +0 -0
  344. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/_types.py +0 -0
  345. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/crawlers/py.typed +0 -0
  346. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/errors.py +0 -0
  347. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/events/__init__.py +0 -0
  348. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/events/_event_manager.py +0 -0
  349. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/events/_local_event_manager.py +0 -0
  350. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/events/_types.py +0 -0
  351. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/events/py.typed +0 -0
  352. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/fingerprint_suite/__init__.py +0 -0
  353. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/fingerprint_suite/_browserforge_adapter.py +0 -0
  354. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/fingerprint_suite/_consts.py +0 -0
  355. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/fingerprint_suite/_fingerprint_generator.py +0 -0
  356. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/fingerprint_suite/_header_generator.py +0 -0
  357. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/fingerprint_suite/_types.py +0 -0
  358. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/fingerprint_suite/py.typed +0 -0
  359. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/http_clients/__init__.py +0 -0
  360. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/http_clients/_base.py +0 -0
  361. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/http_clients/_curl_impersonate.py +0 -0
  362. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/http_clients/_httpx.py +0 -0
  363. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/http_clients/_impit.py +0 -0
  364. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/otel/__init__.py +0 -0
  365. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/otel/crawler_instrumentor.py +0 -0
  366. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/cookiecutter.json +0 -0
  367. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/hooks/post_gen_project.py +0 -0
  368. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/hooks/pre_gen_project.py +0 -0
  369. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/main.py +0 -0
  370. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/main_beautifulsoup.py +0 -0
  371. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/main_parsel.py +0 -0
  372. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/main_playwright.py +0 -0
  373. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/main_playwright_camoufox.py +0 -0
  374. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/routes_beautifulsoup.py +0 -0
  375. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/routes_camoufox.py +0 -0
  376. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/routes_parsel.py +0 -0
  377. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/routes_playwright.py +0 -0
  378. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/templates/routes_playwright_camoufox.py +0 -0
  379. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/.dockerignore +0 -0
  380. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/Dockerfile +0 -0
  381. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/README.md +0 -0
  382. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/{{cookiecutter.__package_name}}/__init__.py +0 -0
  383. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/{{cookiecutter.__package_name}}/__main__.py +0 -0
  384. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/{{cookiecutter.__package_name}}/main.py +0 -0
  385. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/project_template/{{cookiecutter.project_name}}/{{cookiecutter.__package_name}}/routes.py +0 -0
  386. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/proxy_configuration.py +0 -0
  387. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/py.typed +0 -0
  388. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/request_loaders/__init__.py +0 -0
  389. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/request_loaders/_request_list.py +0 -0
  390. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/request_loaders/_request_loader.py +0 -0
  391. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/request_loaders/_request_manager.py +0 -0
  392. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/request_loaders/_request_manager_tandem.py +0 -0
  393. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/request_loaders/_sitemap_request_loader.py +0 -0
  394. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/router.py +0 -0
  395. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/sessions/__init__.py +0 -0
  396. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/sessions/_cookies.py +0 -0
  397. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/sessions/_models.py +0 -0
  398. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/sessions/_session.py +0 -0
  399. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/sessions/_session_pool.py +0 -0
  400. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/sessions/py.typed +0 -0
  401. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/statistics/__init__.py +0 -0
  402. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/statistics/_error_snapshotter.py +0 -0
  403. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/statistics/_error_tracker.py +0 -0
  404. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/statistics/_models.py +0 -0
  405. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/statistics/_statistics.py +0 -0
  406. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/__init__.py +0 -0
  407. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_base/__init__.py +0 -0
  408. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_base/_dataset_client.py +0 -0
  409. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_base/_key_value_store_client.py +0 -0
  410. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_base/_request_queue_client.py +0 -0
  411. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_base/_storage_client.py +0 -0
  412. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_base/py.typed +0 -0
  413. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_file_system/__init__.py +0 -0
  414. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_file_system/_dataset_client.py +0 -0
  415. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_file_system/_key_value_store_client.py +0 -0
  416. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_file_system/_request_queue_client.py +0 -0
  417. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_file_system/_storage_client.py +0 -0
  418. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_file_system/_utils.py +0 -0
  419. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_file_system/py.typed +0 -0
  420. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_memory/__init__.py +0 -0
  421. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_memory/_dataset_client.py +0 -0
  422. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_memory/_key_value_store_client.py +0 -0
  423. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_memory/_request_queue_client.py +0 -0
  424. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_memory/_storage_client.py +0 -0
  425. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_memory/py.typed +0 -0
  426. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_sql/__init__.py +0 -0
  427. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_sql/_client_mixin.py +0 -0
  428. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_sql/_dataset_client.py +0 -0
  429. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_sql/_db_models.py +0 -0
  430. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_sql/_key_value_store_client.py +0 -0
  431. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_sql/_request_queue_client.py +0 -0
  432. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_sql/_storage_client.py +0 -0
  433. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/_sql/py.typed +0 -0
  434. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/models.py +0 -0
  435. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storage_clients/py.typed +0 -0
  436. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storages/__init__.py +0 -0
  437. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storages/_base.py +0 -0
  438. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storages/_dataset.py +0 -0
  439. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storages/_key_value_store.py +0 -0
  440. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storages/_request_queue.py +0 -0
  441. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storages/_storage_instance_manager.py +0 -0
  442. {crawlee-1.0.0 → crawlee-1.0.1}/src/crawlee/storages/py.typed +0 -0
  443. {crawlee-1.0.0 → crawlee-1.0.1}/tests/__init__.py +0 -0
  444. {crawlee-1.0.0 → crawlee-1.0.1}/tests/e2e/__init__.py +0 -0
  445. {crawlee-1.0.0 → crawlee-1.0.1}/tests/e2e/conftest.py +0 -0
  446. {crawlee-1.0.0 → crawlee-1.0.1}/tests/e2e/project_template/test_static_crawlers_templates.py +0 -0
  447. {crawlee-1.0.0 → crawlee-1.0.1}/tests/e2e/project_template/utils.py +0 -0
  448. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/README.md +0 -0
  449. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/__init__.py +0 -0
  450. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_autoscaling/test_autoscaled_pool.py +0 -0
  451. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_autoscaling/test_snapshotter.py +0 -0
  452. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_autoscaling/test_system_status.py +0 -0
  453. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_statistics/test_error_tracker.py +0 -0
  454. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_statistics/test_periodic_logging.py +0 -0
  455. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_statistics/test_persistence.py +0 -0
  456. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_statistics/test_request_processing_record.py +0 -0
  457. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_byte_size.py +0 -0
  458. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_console.py +0 -0
  459. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_crypto.py +0 -0
  460. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_file.py +0 -0
  461. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_globs.py +0 -0
  462. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_html_to_text.py +0 -0
  463. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_measure_time.py +0 -0
  464. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_raise_if_too_many_kwargs.py +0 -0
  465. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_recurring_task.py +0 -0
  466. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_requests.py +0 -0
  467. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_robots.py +0 -0
  468. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_sitemap.py +0 -0
  469. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_system.py +0 -0
  470. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_timedelata_ms.py +0 -0
  471. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/_utils/test_urls.py +0 -0
  472. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/browsers/test_browser_pool.py +0 -0
  473. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/browsers/test_playwright_browser.py +0 -0
  474. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/browsers/test_playwright_browser_plugin.py +0 -0
  475. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_adaptive_playwright/test_adaptive_playwright_crawler.py +0 -0
  476. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_adaptive_playwright/test_adaptive_playwright_crawler_statistics.py +0 -0
  477. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_adaptive_playwright/test_adaptive_playwright_crawling_context.py +0 -0
  478. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_adaptive_playwright/test_predictor.py +0 -0
  479. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_basic/test_context_pipeline.py +0 -0
  480. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_beautifulsoup/test_beautifulsoup_crawler.py +0 -0
  481. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_http/test_http_crawler.py +0 -0
  482. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_parsel/test_parsel_crawler.py +0 -0
  483. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/crawlers/_playwright/test_playwright_crawler.py +0 -0
  484. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/events/test_event_manager.py +0 -0
  485. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/events/test_local_event_manager.py +0 -0
  486. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/fingerprint_suite/test_adapters.py +0 -0
  487. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/fingerprint_suite/test_header_generator.py +0 -0
  488. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/http_clients/test_http_clients.py +0 -0
  489. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/http_clients/test_httpx.py +0 -0
  490. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/otel/test_crawler_instrumentor.py +0 -0
  491. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/proxy_configuration/test_new_proxy_info.py +0 -0
  492. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/proxy_configuration/test_tiers.py +0 -0
  493. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/request_loaders/test_request_list.py +0 -0
  494. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/request_loaders/test_sitemap_request_loader.py +0 -0
  495. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/server.py +0 -0
  496. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/server_endpoints.py +0 -0
  497. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/sessions/test_cookies.py +0 -0
  498. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/sessions/test_models.py +0 -0
  499. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/sessions/test_session.py +0 -0
  500. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/sessions/test_session_pool.py +0 -0
  501. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_file_system/test_fs_dataset_client.py +0 -0
  502. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_file_system/test_fs_kvs_client.py +0 -0
  503. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_file_system/test_fs_rq_client.py +0 -0
  504. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_memory/test_memory_dataset_client.py +0 -0
  505. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_memory/test_memory_kvs_client.py +0 -0
  506. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storage_clients/_memory/test_memory_rq_client.py +0 -0
  507. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storages/test_dataset.py +0 -0
  508. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storages/test_key_value_store.py +0 -0
  509. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storages/test_request_manager_tandem.py +0 -0
  510. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storages/test_request_queue.py +0 -0
  511. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/storages/test_storage_instance_manager.py +0 -0
  512. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/test_cli.py +0 -0
  513. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/test_configuration.py +0 -0
  514. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/test_log_config.py +0 -0
  515. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/test_router.py +0 -0
  516. {crawlee-1.0.0 → crawlee-1.0.1}/tests/unit/test_service_locator.py +0 -0
  517. {crawlee-1.0.0 → crawlee-1.0.1}/website/.eslintrc.json +0 -0
  518. {crawlee-1.0.0 → crawlee-1.0.1}/website/.yarnrc.yml +0 -0
  519. {crawlee-1.0.0 → crawlee-1.0.1}/website/babel.config.js +0 -0
  520. {crawlee-1.0.0 → crawlee-1.0.1}/website/build_api_reference.sh +0 -0
  521. {crawlee-1.0.0 → crawlee-1.0.1}/website/generate_module_shortcuts.py +0 -0
  522. {crawlee-1.0.0 → crawlee-1.0.1}/website/patches/@docusaurus+core+3.4.0.patch +0 -0
  523. {crawlee-1.0.0 → crawlee-1.0.1}/website/patches/@docusaurus+core+3.5.2.patch +0 -0
  524. {crawlee-1.0.0 → crawlee-1.0.1}/website/roa-loader/index.js +0 -0
  525. {crawlee-1.0.0 → crawlee-1.0.1}/website/roa-loader/package.json +0 -0
  526. {crawlee-1.0.0 → crawlee-1.0.1}/website/sidebars.js +0 -0
  527. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/ApiLink.jsx +0 -0
  528. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Button.jsx +0 -0
  529. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Button.module.css +0 -0
  530. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/CopyButton.jsx +0 -0
  531. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/CopyButton.module.css +0 -0
  532. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Gradients.jsx +0 -0
  533. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Highlights.jsx +0 -0
  534. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Highlights.module.css +0 -0
  535. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/HomepageCliExample.jsx +0 -0
  536. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/HomepageCliExample.module.css +0 -0
  537. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/HomepageCtaSection.jsx +0 -0
  538. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/HomepageCtaSection.module.css +0 -0
  539. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/HomepageHeroSection.jsx +0 -0
  540. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/HomepageHeroSection.module.css +0 -0
  541. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/LanguageInfoWidget.jsx +0 -0
  542. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/LanguageInfoWidget.module.css +0 -0
  543. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/LanguageSwitch.jsx +0 -0
  544. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/LanguageSwitch.module.css +0 -0
  545. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/RiverSection.jsx +0 -0
  546. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/RiverSection.module.css +0 -0
  547. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/ThreeCardsWithIcon.jsx +0 -0
  548. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/ThreeCardsWithIcon.module.css +0 -0
  549. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/animated-crawlee-logo-dark.svg +0 -0
  550. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/Homepage/animated-crawlee-logo-light.svg +0 -0
  551. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/RunnableCodeBlock.jsx +0 -0
  552. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/components/RunnableCodeBlock.module.css +0 -0
  553. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/css/custom.css +0 -0
  554. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/pages/home_page_example.py +0 -0
  555. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/pages/index.js +0 -0
  556. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/pages/index.module.css +0 -0
  557. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/ColorModeToggle/dark-mode-icon.svg +0 -0
  558. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/ColorModeToggle/index.js +0 -0
  559. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/ColorModeToggle/light-mode-icon.svg +0 -0
  560. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/ColorModeToggle/styles.module.css +0 -0
  561. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/DocItem/Layout/index.js +0 -0
  562. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/DocItem/Layout/styles.module.css +0 -0
  563. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Footer/LinkItem/index.js +0 -0
  564. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Footer/LinkItem/index.module.css +0 -0
  565. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Footer/index.js +0 -0
  566. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Footer/index.module.css +0 -0
  567. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/MDXComponents/A.js +0 -0
  568. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/Content/index.js +0 -0
  569. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/Content/styles.module.css +0 -0
  570. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/Logo/index.js +0 -0
  571. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/Logo/index.module.css +0 -0
  572. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/MobileSidebar/Header/index.js +0 -0
  573. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/MobileSidebar/Header/index.module.css +0 -0
  574. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/MobileSidebar/Layout/index.js +0 -0
  575. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/MobileSidebar/PrimaryMenu/index.js +0 -0
  576. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/Navbar/MobileSidebar/index.js +0 -0
  577. {crawlee-1.0.0 → crawlee-1.0.1}/website/src/theme/NavbarItem/ComponentTypes.js +0 -0
  578. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/.nojekyll +0 -0
  579. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/font/lota.woff +0 -0
  580. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/font/lota.woff2 +0 -0
  581. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/API.png +0 -0
  582. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/apify_logo.svg +0 -0
  583. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/apify_og_SDK.png +0 -0
  584. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/apify_sdk.svg +0 -0
  585. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/apify_sdk_white.svg +0 -0
  586. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/arrow_right.svg +0 -0
  587. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/auto-scaling-dark.webp +0 -0
  588. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/auto-scaling-light.webp +0 -0
  589. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/check.svg +0 -0
  590. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/chrome-scrape-dark.gif +0 -0
  591. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/chrome-scrape-light.gif +0 -0
  592. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/cloud_icon.svg +0 -0
  593. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/community-dark-icon.svg +0 -0
  594. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/community-light-icon.svg +0 -0
  595. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-dark-new.svg +0 -0
  596. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-dark.svg +0 -0
  597. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-javascript-dark.svg +0 -0
  598. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-javascript-light.svg +0 -0
  599. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-light-new.svg +0 -0
  600. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-light.svg +0 -0
  601. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-logo-monocolor.svg +0 -0
  602. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-logo.svg +0 -0
  603. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-python-dark.svg +0 -0
  604. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-python-light.svg +0 -0
  605. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/crawlee-python-og.png +0 -0
  606. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/defaults-dark-icon.svg +0 -0
  607. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/defaults-light-icon.svg +0 -0
  608. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/discord-brand-dark.svg +0 -0
  609. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/discord-brand.svg +0 -0
  610. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/docusaurus.svg +0 -0
  611. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/external-link.svg +0 -0
  612. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/favicon.ico +0 -0
  613. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/favorite-tools-dark.webp +0 -0
  614. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/favorite-tools-light.webp +0 -0
  615. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/features/auto-scaling.svg +0 -0
  616. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/features/automate-everything.svg +0 -0
  617. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/features/fingerprints.svg +0 -0
  618. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/features/node-requests.svg +0 -0
  619. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/features/runs-on-py.svg +0 -0
  620. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/features/storage.svg +0 -0
  621. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/features/works-everywhere.svg +0 -0
  622. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/fill-and-submit-web-form/00.jpg +0 -0
  623. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/fill-and-submit-web-form/01.jpg +0 -0
  624. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/fill-and-submit-web-form/02.jpg +0 -0
  625. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/fill-and-submit-web-form/03.jpg +0 -0
  626. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/getting-started/current-price.jpg +0 -0
  627. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/getting-started/scraping-practice.jpg +0 -0
  628. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/getting-started/select-an-element.jpg +0 -0
  629. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/getting-started/selected-element.jpg +0 -0
  630. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/getting-started/sku.jpg +0 -0
  631. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/getting-started/title.jpg +0 -0
  632. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/github-brand-dark.svg +0 -0
  633. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/github-brand.svg +0 -0
  634. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/guides/jaeger_otel_search_view_example.png +0 -0
  635. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/guides/jaeger_otel_trace_example.png +0 -0
  636. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/hearth copy.svg +0 -0
  637. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/hearth.svg +0 -0
  638. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/javascript_logo.svg +0 -0
  639. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/js_file.svg +0 -0
  640. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/logo-big.svg +0 -0
  641. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/logo-blur.png +0 -0
  642. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/logo-blur.svg +0 -0
  643. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/logo-zoom.svg +0 -0
  644. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/menu-arrows.svg +0 -0
  645. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/oss_logo.png +0 -0
  646. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/puppeteer-live-view-dashboard.png +0 -0
  647. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/puppeteer-live-view-detail.png +0 -0
  648. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/queue-dark-icon.svg +0 -0
  649. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/queue-light-icon.svg +0 -0
  650. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/resuming-paused-crawl/00.webp +0 -0
  651. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/resuming-paused-crawl/01.webp +0 -0
  652. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/robot.png +0 -0
  653. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/routing-dark-icon.svg +0 -0
  654. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/routing-light-icon.svg +0 -0
  655. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/scraping-utils-dark-icon.svg +0 -0
  656. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/scraping-utils-light-icon.svg +0 -0
  657. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/smart-proxy-dark.webp +0 -0
  658. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/smart-proxy-light.webp +0 -0
  659. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/source_code.png +0 -0
  660. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/system.svg +0 -0
  661. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/triangles_dark.svg +0 -0
  662. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/triangles_light.svg +0 -0
  663. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/workflow.svg +0 -0
  664. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/zero-setup-dark-icon.svg +0 -0
  665. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/img/zero-setup-light-icon.svg +0 -0
  666. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/js/custom.js +0 -0
  667. {crawlee-1.0.0 → crawlee-1.0.1}/website/static/robots.txt +0 -0
  668. {crawlee-1.0.0 → crawlee-1.0.1}/website/tools/docs-prettier.config.js +0 -0
  669. {crawlee-1.0.0 → crawlee-1.0.1}/website/tools/utils/externalLink.js +0 -0
  670. {crawlee-1.0.0 → crawlee-1.0.1}/website/tools/website_gif/chrome-scrape-dark.gif +0 -0
  671. {crawlee-1.0.0 → crawlee-1.0.1}/website/tools/website_gif/chrome-scrape-dark.mp4 +0 -0
  672. {crawlee-1.0.0 → crawlee-1.0.1}/website/tools/website_gif/chrome-scrape-light.gif +0 -0
  673. {crawlee-1.0.0 → crawlee-1.0.1}/website/tools/website_gif/chrome-scrape-light.mp4 +0 -0
  674. {crawlee-1.0.0 → crawlee-1.0.1}/website/tools/website_gif/website_gif.mjs +0 -0
  675. {crawlee-1.0.0 → crawlee-1.0.1}/website/tsconfig.eslint.json +0 -0
@@ -37,7 +37,7 @@ jobs:
37
37
  name: Wait for code checks to pass
38
38
  runs-on: ubuntu-latest
39
39
  steps:
40
- - uses: lewagon/wait-on-check-action@v1.4.0
40
+ - uses: lewagon/wait-on-check-action@v1.4.1
41
41
  with:
42
42
  ref: ${{ github.ref }}
43
43
  repo-token: ${{ secrets.GITHUB_TOKEN }}
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to this project will be documented in this file.
4
4
 
5
+ ## [1.0.1](https://github.com/apify/crawlee-python/releases/tag/v1.0.1) (2025-10-06)
6
+
7
+ ### 🐛 Bug Fixes
8
+
9
+ - Fix memory leak in `PlaywrightCrawler` on browser context creation ([#1446](https://github.com/apify/crawlee-python/pull/1446)) ([bb181e5](https://github.com/apify/crawlee-python/commit/bb181e58d8070fba38e62d6e57fe981a00e5f035)) by [@Pijukatel](https://github.com/Pijukatel), closes [#1443](https://github.com/apify/crawlee-python/issues/1443)
10
+ - Update templates to handle optional httpx client ([#1440](https://github.com/apify/crawlee-python/pull/1440)) ([c087efd](https://github.com/apify/crawlee-python/commit/c087efd39baedf46ca3e5cae1ddc1acd6396e6c1)) by [@Pijukatel](https://github.com/Pijukatel)
11
+
12
+
5
13
  ## [1.0.0](https://github.com/apify/crawlee-python/releases/tag/v1.0.0) (2025-09-29)
6
14
 
7
15
  ### 🚀 Features
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crawlee
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Crawlee for Python
5
5
  Project-URL: Apify Homepage, https://apify.com
6
6
  Project-URL: Changelog, https://crawlee.dev/python/docs/changelog
@@ -336,8 +336,6 @@ Description-Content-Type: text/markdown
336
336
 
337
337
  Crawlee covers your crawling and scraping end-to-end and **helps you build reliable scrapers. Fast.**
338
338
 
339
- > 🚀 Crawlee for Python is open to early adopters!
340
-
341
339
  Your crawlers will appear almost human-like and fly under the radar of modern bot protections even with the default configuration. Crawlee gives you the tools to crawl the web for links, scrape data and persistently store it in machine-readable formats, without having to worry about the technical details. And thanks to rich configuration options, you can tweak almost any aspect of Crawlee to suit your project's needs if the default settings don't cut it.
342
340
 
343
341
  > 👉 **View full documentation, guides and examples on the [Crawlee project website](https://crawlee.dev/python/)** 👈
@@ -30,8 +30,6 @@
30
30
 
31
31
  Crawlee covers your crawling and scraping end-to-end and **helps you build reliable scrapers. Fast.**
32
32
 
33
- > 🚀 Crawlee for Python is open to early adopters!
34
-
35
33
  Your crawlers will appear almost human-like and fly under the radar of modern bot protections even with the default configuration. Crawlee gives you the tools to crawl the web for links, scrape data and persistently store it in machine-readable formats, without having to worry about the technical details. And thanks to rich configuration options, you can tweak almost any aspect of Crawlee to suit your project's needs if the default settings don't cut it.
36
34
 
37
35
  > 👉 **View full documentation, guides and examples on the [Crawlee project website](https://crawlee.dev/python/)** 👈
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "crawlee"
7
- version = "1.0.0"
7
+ version = "1.0.1"
8
8
  description = "Crawlee for Python"
9
9
  authors = [{ name = "Apify Technologies s.r.o.", email = "support@apify.com" }]
10
10
  license = { file = "LICENSE" }
@@ -114,7 +114,7 @@ dev = [
114
114
  "types-colorama~=0.4.15.20240106",
115
115
  "types-psutil~=7.0.0.20250218",
116
116
  "types-python-dateutil~=2.9.0.20240316",
117
- "uvicorn[standard]~=0.35.0",
117
+ "uvicorn[standard]~=0.35.0", # https://github.com/apify/crawlee-python/issues/1441
118
118
  ]
119
119
 
120
120
  [tool.hatch.build.targets.wheel]
@@ -2,6 +2,7 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ from asyncio import Lock
5
6
  from datetime import datetime, timedelta, timezone
6
7
  from typing import TYPE_CHECKING, Any, cast
7
8
 
@@ -77,6 +78,19 @@ class PlaywrightBrowserController(BrowserController):
77
78
 
78
79
  self._total_opened_pages = 0
79
80
 
81
+ self._context_creation_lock: Lock | None = None
82
+
83
+ async def _get_context_creation_lock(self) -> Lock:
84
+ """Get context checking and creation lock.
85
+
86
+ It should be done with lock to prevent multiple concurrent attempts to create context, which could lead to
87
+ memory leak as one of the two concurrently created contexts will become orphaned and not properly closed.
88
+ """
89
+ if self._context_creation_lock:
90
+ return self._context_creation_lock
91
+ self._context_creation_lock = Lock()
92
+ return self._context_creation_lock
93
+
80
94
  @property
81
95
  @override
82
96
  def pages(self) -> list[Page]:
@@ -137,12 +151,6 @@ class PlaywrightBrowserController(BrowserController):
137
151
  Raises:
138
152
  ValueError: If the browser has reached the maximum number of open pages.
139
153
  """
140
- if not self._browser_context:
141
- self._browser_context = await self._create_browser_context(
142
- browser_new_context_options=browser_new_context_options,
143
- proxy_info=proxy_info,
144
- )
145
-
146
154
  if not self.has_free_capacity:
147
155
  raise ValueError('Cannot open more pages in this browser.')
148
156
 
@@ -154,11 +162,12 @@ class PlaywrightBrowserController(BrowserController):
154
162
  )
155
163
  page = await new_context.new_page()
156
164
  else:
157
- if not self._browser_context:
158
- self._browser_context = await self._create_browser_context(
159
- browser_new_context_options=browser_new_context_options,
160
- proxy_info=proxy_info,
161
- )
165
+ async with await self._get_context_creation_lock():
166
+ if not self._browser_context:
167
+ self._browser_context = await self._create_browser_context(
168
+ browser_new_context_options=browser_new_context_options,
169
+ proxy_info=proxy_info,
170
+ )
162
171
  page = await self._browser_context.new_page()
163
172
 
164
173
  # Handle page close event
@@ -169,7 +178,6 @@ class PlaywrightBrowserController(BrowserController):
169
178
  self._last_page_opened_at = datetime.now(timezone.utc)
170
179
 
171
180
  self._total_opened_pages += 1
172
-
173
181
  return page
174
182
 
175
183
  @override
@@ -206,7 +214,6 @@ class PlaywrightBrowserController(BrowserController):
206
214
  `self._fingerprint_generator` is available.
207
215
  """
208
216
  browser_new_context_options = dict(browser_new_context_options) if browser_new_context_options else {}
209
-
210
217
  if proxy_info:
211
218
  if browser_new_context_options.get('proxy'):
212
219
  logger.warning("browser_new_context_options['proxy'] overriden by explicit `proxy_info` argument.")
@@ -244,5 +251,4 @@ class PlaywrightBrowserController(BrowserController):
244
251
  browser_new_context_options['extra_http_headers'] = browser_new_context_options.get(
245
252
  'extra_http_headers', extra_http_headers
246
253
  )
247
-
248
254
  return await self._browser.new_context(**browser_new_context_options)
@@ -5,8 +5,8 @@
5
5
  # % endif
6
6
  # % if cookiecutter.http_client == 'curl-impersonate'
7
7
  # % do extras.append('curl-impersonate')
8
- # % elif cookiecutter.http_client == 'impit'
9
- # % do extras.append('impit')
8
+ # % elif cookiecutter.http_client == 'httpx'
9
+ # % do extras.append('httpx')
10
10
  # % endif
11
11
 
12
12
  [project]
@@ -10,4 +10,7 @@ apify
10
10
  # % if cookiecutter.http_client == 'curl-impersonate'
11
11
  # % do extras.append('curl-impersonate')
12
12
  # % endif
13
+ # % if cookiecutter.http_client == 'httpx'
14
+ # % do extras.append('httpx')
15
+ # % endif
13
16
  crawlee[{{ extras | join(',') }}]
@@ -2,12 +2,13 @@ from __future__ import annotations
2
2
 
3
3
  import asyncio
4
4
  from datetime import datetime, timedelta, timezone
5
- from typing import TYPE_CHECKING
5
+ from typing import TYPE_CHECKING, Any
6
+ from unittest.mock import AsyncMock
6
7
 
7
8
  import pytest
8
9
  from playwright.async_api import Browser, Playwright, async_playwright
9
10
 
10
- from crawlee.browsers import PlaywrightBrowserController
11
+ from crawlee.browsers import PlaywrightBrowserController, PlaywrightPersistentBrowser
11
12
 
12
13
  if TYPE_CHECKING:
13
14
  from collections.abc import AsyncGenerator
@@ -106,3 +107,28 @@ async def test_close_browser_with_open_pages(browser: Browser) -> None:
106
107
 
107
108
  assert controller.pages_count == 0
108
109
  assert not controller.is_browser_connected
110
+
111
+
112
+ async def test_memory_leak_on_concurrent_context_creation() -> None:
113
+ """Test that only one browser context is created when multiple pages are opened concurrently."""
114
+
115
+ # Prepare mocked browser with relevant methods and attributes
116
+ mocked_browser = AsyncMock()
117
+ mocked_context_launcher = AsyncMock()
118
+
119
+ async def delayed_launch_persistent_context(*args: Any, **kwargs: Any) -> Any:
120
+ """Ensure that both calls to create context overlap in time."""
121
+ await asyncio.sleep(5) # Simulate delay in creation to make sure race condition happens
122
+ return await mocked_context_launcher(*args, **kwargs)
123
+
124
+ mocked_browser.launch_persistent_context = delayed_launch_persistent_context
125
+
126
+ # Create minimal instance of PlaywrightBrowserController with mocked browser
127
+ controller = PlaywrightBrowserController(
128
+ PlaywrightPersistentBrowser(mocked_browser, None, {}), header_generator=None, fingerprint_generator=None
129
+ )
130
+
131
+ # Both calls will try to create browser context at the same time, but only one context should be created.
132
+ await asyncio.gather(controller.new_page(), controller.new_page())
133
+
134
+ assert mocked_context_launcher.call_count == 1
@@ -29,9 +29,12 @@ if TYPE_CHECKING:
29
29
  from crawlee.http_clients._base import HttpClient
30
30
 
31
31
 
32
- @pytest.fixture
32
+ @pytest.fixture(autouse=True)
33
33
  async def suppress_user_warning() -> AsyncGenerator[None, None]:
34
- """Suppress user warnings during tests."""
34
+ """Suppress user warnings during tests.
35
+
36
+ Mostly to suppress warnings about the experimental status of the SqlStorageClient.
37
+ """
35
38
  with warnings.catch_warnings():
36
39
  warnings.simplefilter('ignore', UserWarning)
37
40
  yield
@@ -1504,7 +1504,7 @@ async def test_status_message_callback() -> None:
1504
1504
  async def status_callback(
1505
1505
  state: StatisticsState, previous_state: StatisticsState | None, message: str
1506
1506
  ) -> str | None:
1507
- status_message_callback(message)
1507
+ await status_message_callback(message)
1508
1508
  states.append({'state': state, 'previous_state': previous_state})
1509
1509
  return message
1510
1510
 
@@ -39,7 +39,6 @@ def get_tables(sync_conn: Connection) -> list[str]:
39
39
  async def dataset_client(
40
40
  configuration: Configuration,
41
41
  monkeypatch: pytest.MonkeyPatch,
42
- suppress_user_warning: None, # noqa: ARG001
43
42
  ) -> AsyncGenerator[SqlDatasetClient, None]:
44
43
  """A fixture for a SQL dataset client."""
45
44
  async with SqlStorageClient() as storage_client:
@@ -52,7 +51,6 @@ async def dataset_client(
52
51
  await client.drop()
53
52
 
54
53
 
55
- @pytest.mark.usefixtures('suppress_user_warning')
56
54
  async def test_create_tables_with_connection_string(configuration: Configuration, tmp_path: Path) -> None:
57
55
  """Test that SQL dataset client creates tables with a connection string."""
58
56
  storage_dir = tmp_path / 'test_table.db'
@@ -69,7 +67,6 @@ async def test_create_tables_with_connection_string(configuration: Configuration
69
67
  assert 'datasets' in tables
70
68
 
71
69
 
72
- @pytest.mark.usefixtures('suppress_user_warning')
73
70
  async def test_create_tables_with_engine(configuration: Configuration, tmp_path: Path) -> None:
74
71
  """Test that SQL dataset client creates tables with a pre-configured engine."""
75
72
  storage_dir = tmp_path / 'test_table.db'
@@ -88,7 +85,6 @@ async def test_create_tables_with_engine(configuration: Configuration, tmp_path:
88
85
  assert 'datasets' in tables
89
86
 
90
87
 
91
- @pytest.mark.usefixtures('suppress_user_warning')
92
88
  async def test_tables_and_metadata_record(configuration: Configuration) -> None:
93
89
  """Test that SQL dataset creates proper tables and metadata records."""
94
90
  async with SqlStorageClient() as storage_client:
@@ -215,7 +211,6 @@ async def test_metadata_record_updates(dataset_client: SqlDatasetClient) -> None
215
211
  assert orm_metadata.modified_at == metadata.modified_at
216
212
 
217
213
 
218
- @pytest.mark.usefixtures('suppress_user_warning')
219
214
  async def test_data_persistence_across_reopens(configuration: Configuration) -> None:
220
215
  """Test that data persists correctly when reopening the same dataset."""
221
216
  async with SqlStorageClient() as storage_client:
@@ -35,7 +35,6 @@ def configuration(tmp_path: Path) -> Configuration:
35
35
  async def kvs_client(
36
36
  configuration: Configuration,
37
37
  monkeypatch: pytest.MonkeyPatch,
38
- suppress_user_warning: None, # noqa: ARG001
39
38
  ) -> AsyncGenerator[SqlKeyValueStoreClient, None]:
40
39
  """A fixture for a SQL key-value store client."""
41
40
  async with SqlStorageClient() as storage_client:
@@ -55,7 +54,6 @@ def get_tables(sync_conn: Connection) -> list[str]:
55
54
  return inspector.get_table_names()
56
55
 
57
56
 
58
- @pytest.mark.usefixtures('suppress_user_warning')
59
57
  async def test_create_tables_with_connection_string(configuration: Configuration, tmp_path: Path) -> None:
60
58
  """Test that SQL key-value store client creates tables with a connection string."""
61
59
  storage_dir = tmp_path / 'test_table.db'
@@ -72,7 +70,6 @@ async def test_create_tables_with_connection_string(configuration: Configuration
72
70
  assert 'key_value_store_records' in tables
73
71
 
74
72
 
75
- @pytest.mark.usefixtures('suppress_user_warning')
76
73
  async def test_create_tables_with_engine(configuration: Configuration, tmp_path: Path) -> None:
77
74
  """Test that SQL key-value store client creates tables with a pre-configured engine."""
78
75
  storage_dir = tmp_path / 'test_table.db'
@@ -91,7 +88,6 @@ async def test_create_tables_with_engine(configuration: Configuration, tmp_path:
91
88
  assert 'key_value_store_records' in tables
92
89
 
93
90
 
94
- @pytest.mark.usefixtures('suppress_user_warning')
95
91
  async def test_tables_and_metadata_record(configuration: Configuration) -> None:
96
92
  """Test that SQL key-value store creates proper tables and metadata records."""
97
93
  async with SqlStorageClient() as storage_client:
@@ -264,7 +260,6 @@ async def test_metadata_record_updates(kvs_client: SqlKeyValueStoreClient) -> No
264
260
  assert orm_metadata.modified_at == metadata.modified_at
265
261
 
266
262
 
267
- @pytest.mark.usefixtures('suppress_user_warning')
268
263
  async def test_data_persistence_across_reopens(configuration: Configuration) -> None:
269
264
  """Test that data persists correctly when reopening the same key-value store."""
270
265
  async with SqlStorageClient() as storage_client:
@@ -36,7 +36,6 @@ def configuration(tmp_path: Path) -> Configuration:
36
36
  async def rq_client(
37
37
  configuration: Configuration,
38
38
  monkeypatch: pytest.MonkeyPatch,
39
- suppress_user_warning: None, # noqa: ARG001
40
39
  ) -> AsyncGenerator[SqlRequestQueueClient, None]:
41
40
  """A fixture for a SQL request queue client."""
42
41
  async with SqlStorageClient() as storage_client:
@@ -56,7 +55,6 @@ def get_tables(sync_conn: Connection) -> list[str]:
56
55
  return inspector.get_table_names()
57
56
 
58
57
 
59
- @pytest.mark.usefixtures('suppress_user_warning')
60
58
  async def test_create_tables_with_connection_string(configuration: Configuration, tmp_path: Path) -> None:
61
59
  """Test that SQL request queue client creates tables with a connection string."""
62
60
  storage_dir = tmp_path / 'test_table.db'
@@ -74,7 +72,6 @@ async def test_create_tables_with_connection_string(configuration: Configuration
74
72
  assert 'request_queue_state' in tables
75
73
 
76
74
 
77
- @pytest.mark.usefixtures('suppress_user_warning')
78
75
  async def test_create_tables_with_engine(configuration: Configuration, tmp_path: Path) -> None:
79
76
  """Test that SQL request queue client creates tables with a pre-configured engine."""
80
77
  storage_dir = tmp_path / 'test_table.db'
@@ -94,7 +91,6 @@ async def test_create_tables_with_engine(configuration: Configuration, tmp_path:
94
91
  assert 'request_queue_state' in tables
95
92
 
96
93
 
97
- @pytest.mark.usefixtures('suppress_user_warning')
98
94
  async def test_tables_and_metadata_record(configuration: Configuration) -> None:
99
95
  """Test that SQL request queue creates proper tables and metadata records."""
100
96
  async with SqlStorageClient() as storage_client:
@@ -207,7 +203,6 @@ async def test_metadata_record_updates(rq_client: SqlRequestQueueClient) -> None
207
203
  assert orm_metadata.modified_at == metadata.modified_at
208
204
 
209
205
 
210
- @pytest.mark.usefixtures('suppress_user_warning')
211
206
  async def test_data_persistence_across_reopens(configuration: Configuration) -> None:
212
207
  """Test that data persists correctly when reopening the same request queue."""
213
208
  async with SqlStorageClient() as storage_client:
@@ -5,10 +5,7 @@ from crawlee.storage_clients import FileSystemStorageClient, MemoryStorageClient
5
5
 
6
6
 
7
7
  @pytest.fixture(params=['memory', 'file_system', 'sql'])
8
- def storage_client(
9
- request: pytest.FixtureRequest,
10
- suppress_user_warning: None, # noqa: ARG001
11
- ) -> StorageClient:
8
+ def storage_client(request: pytest.FixtureRequest) -> StorageClient:
12
9
  """Parameterized fixture to test with different storage clients."""
13
10
  storage_client: StorageClient
14
11
  if request.param == 'memory':