From ca3e33122edc2d310d6b76ed5fafd7dbdbde3c35 Mon Sep 17 00:00:00 2001 From: UncleCode Date: Tue, 7 Jan 2025 20:49:50 +0800 Subject: [PATCH] refactor(docs): reorganize documentation structure and update styles Reorganize documentation into core/advanced/extraction sections for better navigation. Update terminal theme styles and add rich library for better CLI output. Remove redundant tutorial files and consolidate content into core sections. Add personal story to index page for project context. BREAKING CHANGE: Documentation structure has been significantly reorganized --- .gitattributes | 5 + README.md | 9 + crawl4ai/__version__.py | 2 +- crawl4ai/async_crawler_strategy.py | 22 +- crawl4ai/extraction_strategy.py | 551 ++--- docs/examples/hooks_example.py | 2 +- .../advanced}/advanced-features.md | 34 +- docs/md_v2/advanced/content-processing.md | 136 -- docs/md_v2/advanced/crawl-dispatcher.md | 12 + .../file-downloading.md} | 15 +- docs/md_v2/advanced/hooks-auth.md | 319 ++- .../md_v2/advanced/identity-based-crawling.md | 180 ++ .../md_v2/advanced/identity_based_crawling.md | 156 -- docs/md_v2/advanced/lazy-loading.md | 104 + docs/md_v2/advanced/magic-mode.md | 52 - docs/md_v2/advanced/managed_browser.md | 188 -- docs/md_v2/advanced/multi-url-crawling.md | 264 +++ docs/md_v2/advanced/proxy-security.md | 39 +- .../advanced/session-management-advanced.md | 179 -- docs/md_v2/advanced/session-management.md | 187 +- docs/md_v2/advanced/ssl-certificate.md | 179 ++ docs/md_v2/api/arun.md | 423 ++-- docs/md_v2/api/async-webcrawler.md | 519 +++-- docs/md_v2/api/crawl-config.md | 85 - docs/md_v2/api/crawl-result.md | 538 ++--- docs/md_v2/api/parameters.md | 260 ++- docs/md_v2/api/strategies.md | 8 +- docs/md_v2/assets/images/dispatcher.png | Bin 0 -> 487245 bytes docs/md_v2/assets/styles.css | 82 +- docs/md_v2/basic/browser-config.md | 208 -- docs/md_v2/basic/content-selection.md | 135 -- docs/md_v2/basic/content_filtering.md | 83 - docs/md_v2/basic/installation.md | 137 -- docs/md_v2/basic/output-formats.md | 102 - docs/md_v2/basic/page-interaction.md | 190 -- docs/md_v2/basic/quickstart.md | 172 -- docs/md_v2/blog/articles/dockerize_hooks.md | 6 +- docs/md_v2/blog/releases/0.4.2.md | 6 +- docs/md_v2/core/browser-crawler-config.md | 248 +++ docs/md_v2/{basic => core}/cache-modes.md | 12 +- docs/md_v2/core/content-selection.md | 332 +++ docs/md_v2/core/crawler-result.md | 246 +++ .../{basic => core}/docker-deploymeny.md | 22 +- docs/md_v2/core/fit-markdown.md | 248 +++ docs/md_v2/core/installation.md | 129 ++ .../core/link-media.md} | 39 +- .../local-files.md} | 5 +- .../core/markdown-generation.md} | 53 +- docs/md_v2/core/page-interaction.md | 343 ++++ docs/md_v2/core/quickstart.md | 362 ++++ docs/md_v2/{basic => core}/simple-crawling.md | 0 docs/md_v2/extraction/chunking.md | 207 +- .../{cosine.md => clustring-strategies.md} | 16 +- .../extraction/llm-strategies.md} | 64 +- .../extraction/no-llm-strategies.md} | 42 +- .../extraction/{ => old}/css-advanced.md | 20 +- docs/md_v2/extraction/{ => old}/css.md | 16 +- docs/md_v2/extraction/{ => old}/llm.md | 0 docs/md_v2/extraction/{ => old}/overview.md | 18 +- docs/md_v2/index.md | 156 +- ...tion_to_Crawl4AI_and_Basic_Installation.md | 51 - ...pisode_02_Overview_of_Advanced_Features.md | 78 - ...wser_Configurations_&_Headless_Crawling.md | 65 - ...04_Advanced_Proxy_and_Security_Settings.md | 90 - ..._Execution_and_Dynamic_Content_Handling.md | 97 - ...e_06_Magic_Mode_and_Anti-Bot_Protection.md | 86 - ...de_07_Content_Cleaning_and_Fit_Markdown.md | 89 - ..._Media_Handling_Images_Videos_and_Audio.md | 116 -- ...de_09_Link_Analysis_and_Smart_Filtering.md | 95 - ..._Headers,_Identity,_and_User_Simulation.md | 93 - ...ode_11_1_Extraction_Strategies_JSON_CSS.md | 186 -- .../episode_11_2_Extraction_Strategies_LLM.md | 153 -- ...isode_11_3_Extraction_Strategies_Cosine.md | 136 -- ...ion-Based_Crawling_for_Dynamic_Websites.md | 140 -- ...ng_Strategies_for_Large_Text_Processing.md | 138 -- ...nd_Custom_Workflow_with_AsyncWebCrawler.md | 185 -- docs/md_v2/tutorial/tutorial.md | 1789 ----------------- .../tutorials/async-webcrawler-basics.md | 235 --- docs/md_v3/tutorials/docker-quickstart.md | 271 --- docs/md_v3/tutorials/getting-started.md | 272 --- docs/md_v3/tutorials/getting-warmer.md | 527 ----- docs/md_v3/tutorials/hooks-custom.md | 335 --- docs/md_v3/tutorials/targeted-crawling.md | 227 --- mkdocs copy.yml | 94 + mkdocs.yml | 99 +- pyproject.toml | 3 +- requirements.txt | 3 +- 87 files changed, 4869 insertions(+), 8951 deletions(-) create mode 100644 .gitattributes rename docs/{md_v3/tutorials => md_v2/advanced}/advanced-features.md (88%) delete mode 100644 docs/md_v2/advanced/content-processing.md create mode 100644 docs/md_v2/advanced/crawl-dispatcher.md rename docs/md_v2/{basic/file-download.md => advanced/file-downloading.md} (92%) create mode 100644 docs/md_v2/advanced/identity-based-crawling.md delete mode 100644 docs/md_v2/advanced/identity_based_crawling.md create mode 100644 docs/md_v2/advanced/lazy-loading.md delete mode 100644 docs/md_v2/advanced/magic-mode.md delete mode 100644 docs/md_v2/advanced/managed_browser.md create mode 100644 docs/md_v2/advanced/multi-url-crawling.md delete mode 100644 docs/md_v2/advanced/session-management-advanced.md create mode 100644 docs/md_v2/advanced/ssl-certificate.md delete mode 100644 docs/md_v2/api/crawl-config.md create mode 100644 docs/md_v2/assets/images/dispatcher.png delete mode 100644 docs/md_v2/basic/browser-config.md delete mode 100644 docs/md_v2/basic/content-selection.md delete mode 100644 docs/md_v2/basic/content_filtering.md delete mode 100644 docs/md_v2/basic/installation.md delete mode 100644 docs/md_v2/basic/output-formats.md delete mode 100644 docs/md_v2/basic/page-interaction.md delete mode 100644 docs/md_v2/basic/quickstart.md create mode 100644 docs/md_v2/core/browser-crawler-config.md rename docs/md_v2/{basic => core}/cache-modes.md (86%) create mode 100644 docs/md_v2/core/content-selection.md create mode 100644 docs/md_v2/core/crawler-result.md rename docs/md_v2/{basic => core}/docker-deploymeny.md (98%) create mode 100644 docs/md_v2/core/fit-markdown.md create mode 100644 docs/md_v2/core/installation.md rename docs/{md_v3/tutorials/link-media-analysis.md => md_v2/core/link-media.md} (87%) rename docs/md_v2/{basic/prefix-based-input.md => core/local-files.md} (97%) rename docs/{md_v3/tutorials/markdown-basics.md => md_v2/core/markdown-generation.md} (83%) create mode 100644 docs/md_v2/core/page-interaction.md create mode 100644 docs/md_v2/core/quickstart.md rename docs/md_v2/{basic => core}/simple-crawling.md (100%) rename docs/md_v2/extraction/{cosine.md => clustring-strategies.md} (96%) rename docs/{md_v3/tutorials/json-extraction-llm.md => md_v2/extraction/llm-strategies.md} (77%) rename docs/{md_v3/tutorials/json-extraction-basic.md => md_v2/extraction/no-llm-strategies.md} (86%) rename docs/md_v2/extraction/{ => old}/css-advanced.md (88%) rename docs/md_v2/extraction/{ => old}/css.md (85%) rename docs/md_v2/extraction/{ => old}/llm.md (100%) rename docs/md_v2/extraction/{ => old}/overview.md (96%) delete mode 100644 docs/md_v2/tutorial/episode_01_Introduction_to_Crawl4AI_and_Basic_Installation.md delete mode 100644 docs/md_v2/tutorial/episode_02_Overview_of_Advanced_Features.md delete mode 100644 docs/md_v2/tutorial/episode_03_Browser_Configurations_&_Headless_Crawling.md delete mode 100644 docs/md_v2/tutorial/episode_04_Advanced_Proxy_and_Security_Settings.md delete mode 100644 docs/md_v2/tutorial/episode_05_JavaScript_Execution_and_Dynamic_Content_Handling.md delete mode 100644 docs/md_v2/tutorial/episode_06_Magic_Mode_and_Anti-Bot_Protection.md delete mode 100644 docs/md_v2/tutorial/episode_07_Content_Cleaning_and_Fit_Markdown.md delete mode 100644 docs/md_v2/tutorial/episode_08_Media_Handling_Images_Videos_and_Audio.md delete mode 100644 docs/md_v2/tutorial/episode_09_Link_Analysis_and_Smart_Filtering.md delete mode 100644 docs/md_v2/tutorial/episode_10_Custom_Headers,_Identity,_and_User_Simulation.md delete mode 100644 docs/md_v2/tutorial/episode_11_1_Extraction_Strategies_JSON_CSS.md delete mode 100644 docs/md_v2/tutorial/episode_11_2_Extraction_Strategies_LLM.md delete mode 100644 docs/md_v2/tutorial/episode_11_3_Extraction_Strategies_Cosine.md delete mode 100644 docs/md_v2/tutorial/episode_12_Session-Based_Crawling_for_Dynamic_Websites.md delete mode 100644 docs/md_v2/tutorial/episode_13_Chunking_Strategies_for_Large_Text_Processing.md delete mode 100644 docs/md_v2/tutorial/episode_14_Hooks_and_Custom_Workflow_with_AsyncWebCrawler.md delete mode 100644 docs/md_v2/tutorial/tutorial.md delete mode 100644 docs/md_v3/tutorials/async-webcrawler-basics.md delete mode 100644 docs/md_v3/tutorials/docker-quickstart.md delete mode 100644 docs/md_v3/tutorials/getting-started.md delete mode 100644 docs/md_v3/tutorials/getting-warmer.md delete mode 100644 docs/md_v3/tutorials/hooks-custom.md delete mode 100644 docs/md_v3/tutorials/targeted-crawling.md create mode 100644 mkdocs copy.yml diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..0632736a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +# Ignore Markdown files for language statistics +*.md linguist-documentation=true + +# Force Python files to be detected +*.py linguist-language=Python diff --git a/README.md b/README.md index af4278ab..dc84b0ed 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,15 @@ Crawl4AI is the #1 trending GitHub repository, actively maintained by a vibrant 🎉 **Version 0.4.24x is out!** Major improvements in extraction strategies with enhanced JSON handling, SSL security, and Amazon product extraction. Plus, a completely revamped content filtering system! [Read the release notes →](https://crawl4ai.com/mkdocs/blog) +
+📦 My Personal Story +I’ve always loved exploring the web development, back from when HTML and JavaScript were hardly intertwined. My curiosity drove me into web development, mathematics, AI, and machine learning, always keeping a close tie to real industrial applications. In 2009–2010, as a postgraduate student, I created platforms to gather and organize published papers for Master’s and PhD researchers. Faced with post-grad students’ data challenges, I built a helper app to crawl newly published papers and public data. Relying on Internet Explorer and DLL hacks was far more cumbersome than modern tools, highlighting my longtime background in data extraction. + +Fast-forward to 2023: I needed to fetch web data and transform it into neat **markdown** for my AI pipeline. All solutions I found were either **closed-source**, overpriced, or produced low-quality output. As someone who has built large edu-tech ventures (like KidoCode), I believe **data belongs to the people**. We shouldn’t pay $16 just to parse the web’s publicly available content. This friction led me to create my own library, **Crawl4AI**, in a matter of days to meet my immediate needs. Unexpectedly, it went **viral**, accumulating thousands of GitHub stars. + +Now, in **January 2025**, Crawl4AI has surpassed **21,000 stars** and remains the #1 trending repository. It’s my way of giving back to the community after benefiting from open source for years. I’m thrilled by how many of you share that passion. Thank you for being here, join our Discord, file issues, submit PRs, or just spread the word. Let’s build the best data extraction, crawling, and scraping library **together**. +
+ ## 🧐 Why Crawl4AI? 1. **Built for LLMs**: Creates smart, concise Markdown optimized for RAG and fine-tuning applications. diff --git a/crawl4ai/__version__.py b/crawl4ai/__version__.py index 8ec3d053..ea8194f4 100644 --- a/crawl4ai/__version__.py +++ b/crawl4ai/__version__.py @@ -1,2 +1,2 @@ # crawl4ai/_version.py -__version__ = "0.4.247" +__version__ = "0.4.248" diff --git a/crawl4ai/async_crawler_strategy.py b/crawl4ai/async_crawler_strategy.py index b879413c..cf376f9a 100644 --- a/crawl4ai/async_crawler_strategy.py +++ b/crawl4ai/async_crawler_strategy.py @@ -453,12 +453,7 @@ class BrowserManager: return browser_args - async def setup_context( - self, - context: BrowserContext, - crawlerRunConfig: CrawlerRunConfig, - is_default=False, - ): + async def setup_context(self, context: BrowserContext, crawlerRunConfig: CrawlerRunConfig = None, is_default=False): """ Set up a browser context with the configured options. @@ -516,16 +511,17 @@ class BrowserManager: # Add default cookie await context.add_cookies( - [{"name": "cookiesEnabled", "value": "true", "url": crawlerRunConfig.url}] + [{"name": "cookiesEnabled", "value": "true", "url": crawlerRunConfig.url if crawlerRunConfig else "https://crawl4ai.com/"}] ) # Handle navigator overrides - if ( - crawlerRunConfig.override_navigator - or crawlerRunConfig.simulate_user - or crawlerRunConfig.magic - ): - await context.add_init_script(load_js_script("navigator_overrider")) + if crawlerRunConfig: + if ( + crawlerRunConfig.override_navigator + or crawlerRunConfig.simulate_user + or crawlerRunConfig.magic + ): + await context.add_init_script(load_js_script("navigator_overrider")) async def create_browser_context(self): """ diff --git a/crawl4ai/extraction_strategy.py b/crawl4ai/extraction_strategy.py index 3e688f13..f6c62cc9 100644 --- a/crawl4ai/extraction_strategy.py +++ b/crawl4ai/extraction_strategy.py @@ -74,280 +74,7 @@ class NoExtractionStrategy(ExtractionStrategy): def run(self, url: str, sections: List[str], *q, **kwargs) -> List[Dict[str, Any]]: return [{"index": i, "tags": [], "content": section} for i, section in enumerate(sections)] -####################################################### -# Strategies using LLM-based extraction for text data # -####################################################### -class LLMExtractionStrategy(ExtractionStrategy): - """ - A strategy that uses an LLM to extract meaningful content from the HTML. - - Attributes: - provider: The provider to use for extraction. It follows the format /, e.g., "ollama/llama3.3". - api_token: The API token for the provider. - instruction: The instruction to use for the LLM model. - schema: Pydantic model schema for structured data. - extraction_type: "block" or "schema". - chunk_token_threshold: Maximum tokens per chunk. - overlap_rate: Overlap between chunks. - word_token_rate: Word to token conversion rate. - apply_chunking: Whether to apply chunking. - base_url: The base URL for the API request. - api_base: The base URL for the API request. - extra_args: Additional arguments for the API request, such as temprature, max_tokens, etc. - verbose: Whether to print verbose output. - usages: List of individual token usages. - total_usage: Accumulated token usage. - """ - def __init__(self, - provider: str = DEFAULT_PROVIDER, api_token: Optional[str] = None, - instruction:str = None, schema:Dict = None, extraction_type = "block", **kwargs): - """ - Initialize the strategy with clustering parameters. - - Args: - provider: The provider to use for extraction. It follows the format /, e.g., "ollama/llama3.3". - api_token: The API token for the provider. - instruction: The instruction to use for the LLM model. - schema: Pydantic model schema for structured data. - extraction_type: "block" or "schema". - chunk_token_threshold: Maximum tokens per chunk. - overlap_rate: Overlap between chunks. - word_token_rate: Word to token conversion rate. - apply_chunking: Whether to apply chunking. - base_url: The base URL for the API request. - api_base: The base URL for the API request. - extra_args: Additional arguments for the API request, such as temprature, max_tokens, etc. - verbose: Whether to print verbose output. - usages: List of individual token usages. - total_usage: Accumulated token usage. - - """ - super().__init__(**kwargs) - self.provider = provider - self.api_token = api_token or PROVIDER_MODELS.get(provider, "no-token") or os.getenv("OPENAI_API_KEY") - self.instruction = instruction - self.extract_type = extraction_type - self.schema = schema - if schema: - self.extract_type = "schema" - - self.chunk_token_threshold = kwargs.get("chunk_token_threshold", CHUNK_TOKEN_THRESHOLD) - self.overlap_rate = kwargs.get("overlap_rate", OVERLAP_RATE) - self.word_token_rate = kwargs.get("word_token_rate", WORD_TOKEN_RATE) - self.apply_chunking = kwargs.get("apply_chunking", True) - self.base_url = kwargs.get("base_url", None) - self.api_base = kwargs.get("api_base", kwargs.get("base_url", None)) - self.extra_args = kwargs.get("extra_args", {}) - if not self.apply_chunking: - self.chunk_token_threshold = 1e9 - - self.verbose = kwargs.get("verbose", False) - self.usages = [] # Store individual usages - self.total_usage = TokenUsage() # Accumulated usage - - if not self.api_token: - raise ValueError("API token must be provided for LLMExtractionStrategy. Update the config.py or set OPENAI_API_KEY environment variable.") - - - def extract(self, url: str, ix:int, html: str) -> List[Dict[str, Any]]: - """ - Extract meaningful blocks or chunks from the given HTML using an LLM. - - How it works: - 1. Construct a prompt with variables. - 2. Make a request to the LLM using the prompt. - 3. Parse the response and extract blocks or chunks. - - Args: - url: The URL of the webpage. - ix: Index of the block. - html: The HTML content of the webpage. - - Returns: - A list of extracted blocks or chunks. - """ - if self.verbose: - # print("[LOG] Extracting blocks from URL:", url) - print(f"[LOG] Call LLM for {url} - block index: {ix}") - - variable_values = { - "URL": url, - "HTML": escape_json_string(sanitize_html(html)), - } - - prompt_with_variables = PROMPT_EXTRACT_BLOCKS - if self.instruction: - variable_values["REQUEST"] = self.instruction - prompt_with_variables = PROMPT_EXTRACT_BLOCKS_WITH_INSTRUCTION - - if self.extract_type == "schema" and self.schema: - variable_values["SCHEMA"] = json.dumps(self.schema, indent=2) - prompt_with_variables = PROMPT_EXTRACT_SCHEMA_WITH_INSTRUCTION - - for variable in variable_values: - prompt_with_variables = prompt_with_variables.replace( - "{" + variable + "}", variable_values[variable] - ) - - response = perform_completion_with_backoff( - self.provider, - prompt_with_variables, - self.api_token, - base_url=self.api_base or self.base_url, - extra_args = self.extra_args - ) # , json_response=self.extract_type == "schema") - # Track usage - usage = TokenUsage( - completion_tokens=response.usage.completion_tokens, - prompt_tokens=response.usage.prompt_tokens, - total_tokens=response.usage.total_tokens, - completion_tokens_details=response.usage.completion_tokens_details.__dict__ if response.usage.completion_tokens_details else {}, - prompt_tokens_details=response.usage.prompt_tokens_details.__dict__ if response.usage.prompt_tokens_details else {} - ) - self.usages.append(usage) - - # Update totals - self.total_usage.completion_tokens += usage.completion_tokens - self.total_usage.prompt_tokens += usage.prompt_tokens - self.total_usage.total_tokens += usage.total_tokens - - try: - blocks = extract_xml_data(["blocks"], response.choices[0].message.content)['blocks'] - blocks = json.loads(blocks) - for block in blocks: - block['error'] = False - except Exception as e: - parsed, unparsed = split_and_parse_json_objects(response.choices[0].message.content) - blocks = parsed - if unparsed: - blocks.append({ - "index": 0, - "error": True, - "tags": ["error"], - "content": unparsed - }) - - if self.verbose: - print("[LOG] Extracted", len(blocks), "blocks from URL:", url, "block index:", ix) - return blocks - - def _merge(self, documents, chunk_token_threshold, overlap): - """ - Merge documents into sections based on chunk_token_threshold and overlap. - """ - chunks = [] - sections = [] - total_tokens = 0 - - # Calculate the total tokens across all documents - for document in documents: - total_tokens += len(document.split(' ')) * self.word_token_rate - - # Calculate the number of sections needed - num_sections = math.floor(total_tokens / chunk_token_threshold) - if num_sections < 1: - num_sections = 1 # Ensure there is at least one section - adjusted_chunk_threshold = total_tokens / num_sections - - total_token_so_far = 0 - current_chunk = [] - - for document in documents: - tokens = document.split(' ') - token_count = len(tokens) * self.word_token_rate - - if total_token_so_far + token_count <= adjusted_chunk_threshold: - current_chunk.extend(tokens) - total_token_so_far += token_count - else: - # Ensure to handle the last section properly - if len(sections) == num_sections - 1: - current_chunk.extend(tokens) - continue - - # Add overlap if specified - if overlap > 0 and current_chunk: - overlap_tokens = current_chunk[-overlap:] - current_chunk.extend(overlap_tokens) - - sections.append(' '.join(current_chunk)) - current_chunk = tokens - total_token_so_far = token_count - - # Add the last chunk - if current_chunk: - sections.append(' '.join(current_chunk)) - - return sections - - - def run(self, url: str, sections: List[str]) -> List[Dict[str, Any]]: - """ - Process sections sequentially with a delay for rate limiting issues, specifically for LLMExtractionStrategy. - - Args: - url: The URL of the webpage. - sections: List of sections (strings) to process. - - Returns: - A list of extracted blocks or chunks. - """ - - merged_sections = self._merge( - sections, self.chunk_token_threshold, - overlap= int(self.chunk_token_threshold * self.overlap_rate) - ) - extracted_content = [] - if self.provider.startswith("groq/"): - # Sequential processing with a delay - for ix, section in enumerate(merged_sections): - extract_func = partial(self.extract, url) - extracted_content.extend(extract_func(ix, sanitize_input_encode(section))) - time.sleep(0.5) # 500 ms delay between each processing - else: - # Parallel processing using ThreadPoolExecutor - # extract_func = partial(self.extract, url) - # for ix, section in enumerate(merged_sections): - # extracted_content.append(extract_func(ix, section)) - - with ThreadPoolExecutor(max_workers=4) as executor: - extract_func = partial(self.extract, url) - futures = [executor.submit(extract_func, ix, sanitize_input_encode(section)) for ix, section in enumerate(merged_sections)] - - for future in as_completed(futures): - try: - extracted_content.extend(future.result()) - except Exception as e: - if self.verbose: - print(f"Error in thread execution: {e}") - # Add error information to extracted_content - extracted_content.append({ - "index": 0, - "error": True, - "tags": ["error"], - "content": str(e) - }) - - - return extracted_content - - - def show_usage(self) -> None: - """Print a detailed token usage report showing total and per-request usage.""" - print("\n=== Token Usage Summary ===") - print(f"{'Type':<15} {'Count':>12}") - print("-" * 30) - print(f"{'Completion':<15} {self.total_usage.completion_tokens:>12,}") - print(f"{'Prompt':<15} {self.total_usage.prompt_tokens:>12,}") - print(f"{'Total':<15} {self.total_usage.total_tokens:>12,}") - - print("\n=== Usage History ===") - print(f"{'Request #':<10} {'Completion':>12} {'Prompt':>12} {'Total':>12}") - print("-" * 48) - for i, usage in enumerate(self.usages, 1): - print(f"{i:<10} {usage.completion_tokens:>12,} {usage.prompt_tokens:>12,} {usage.total_tokens:>12,}") - ####################################################### # Strategies using clustering for text data extraction # ####################################################### @@ -664,6 +391,284 @@ class CosineStrategy(ExtractionStrategy): # This strategy processes all sections together return self.extract(url, self.DEL.join(sections), **kwargs) + + + +####################################################### +# Strategies using LLM-based extraction for text data # +####################################################### +class LLMExtractionStrategy(ExtractionStrategy): + """ + A strategy that uses an LLM to extract meaningful content from the HTML. + + Attributes: + provider: The provider to use for extraction. It follows the format /, e.g., "ollama/llama3.3". + api_token: The API token for the provider. + instruction: The instruction to use for the LLM model. + schema: Pydantic model schema for structured data. + extraction_type: "block" or "schema". + chunk_token_threshold: Maximum tokens per chunk. + overlap_rate: Overlap between chunks. + word_token_rate: Word to token conversion rate. + apply_chunking: Whether to apply chunking. + base_url: The base URL for the API request. + api_base: The base URL for the API request. + extra_args: Additional arguments for the API request, such as temprature, max_tokens, etc. + verbose: Whether to print verbose output. + usages: List of individual token usages. + total_usage: Accumulated token usage. + """ + + def __init__(self, + provider: str = DEFAULT_PROVIDER, api_token: Optional[str] = None, + instruction:str = None, schema:Dict = None, extraction_type = "block", **kwargs): + """ + Initialize the strategy with clustering parameters. + + Args: + provider: The provider to use for extraction. It follows the format /, e.g., "ollama/llama3.3". + api_token: The API token for the provider. + instruction: The instruction to use for the LLM model. + schema: Pydantic model schema for structured data. + extraction_type: "block" or "schema". + chunk_token_threshold: Maximum tokens per chunk. + overlap_rate: Overlap between chunks. + word_token_rate: Word to token conversion rate. + apply_chunking: Whether to apply chunking. + base_url: The base URL for the API request. + api_base: The base URL for the API request. + extra_args: Additional arguments for the API request, such as temprature, max_tokens, etc. + verbose: Whether to print verbose output. + usages: List of individual token usages. + total_usage: Accumulated token usage. + + """ + super().__init__(**kwargs) + self.provider = provider + self.api_token = api_token or PROVIDER_MODELS.get(provider, "no-token") or os.getenv("OPENAI_API_KEY") + self.instruction = instruction + self.extract_type = extraction_type + self.schema = schema + if schema: + self.extract_type = "schema" + + self.chunk_token_threshold = kwargs.get("chunk_token_threshold", CHUNK_TOKEN_THRESHOLD) + self.overlap_rate = kwargs.get("overlap_rate", OVERLAP_RATE) + self.word_token_rate = kwargs.get("word_token_rate", WORD_TOKEN_RATE) + self.apply_chunking = kwargs.get("apply_chunking", True) + self.base_url = kwargs.get("base_url", None) + self.api_base = kwargs.get("api_base", kwargs.get("base_url", None)) + self.extra_args = kwargs.get("extra_args", {}) + if not self.apply_chunking: + self.chunk_token_threshold = 1e9 + + self.verbose = kwargs.get("verbose", False) + self.usages = [] # Store individual usages + self.total_usage = TokenUsage() # Accumulated usage + + if not self.api_token: + raise ValueError("API token must be provided for LLMExtractionStrategy. Update the config.py or set OPENAI_API_KEY environment variable.") + + + def extract(self, url: str, ix:int, html: str) -> List[Dict[str, Any]]: + """ + Extract meaningful blocks or chunks from the given HTML using an LLM. + + How it works: + 1. Construct a prompt with variables. + 2. Make a request to the LLM using the prompt. + 3. Parse the response and extract blocks or chunks. + + Args: + url: The URL of the webpage. + ix: Index of the block. + html: The HTML content of the webpage. + + Returns: + A list of extracted blocks or chunks. + """ + if self.verbose: + # print("[LOG] Extracting blocks from URL:", url) + print(f"[LOG] Call LLM for {url} - block index: {ix}") + + variable_values = { + "URL": url, + "HTML": escape_json_string(sanitize_html(html)), + } + + prompt_with_variables = PROMPT_EXTRACT_BLOCKS + if self.instruction: + variable_values["REQUEST"] = self.instruction + prompt_with_variables = PROMPT_EXTRACT_BLOCKS_WITH_INSTRUCTION + + if self.extract_type == "schema" and self.schema: + variable_values["SCHEMA"] = json.dumps(self.schema, indent=2) + prompt_with_variables = PROMPT_EXTRACT_SCHEMA_WITH_INSTRUCTION + + for variable in variable_values: + prompt_with_variables = prompt_with_variables.replace( + "{" + variable + "}", variable_values[variable] + ) + + response = perform_completion_with_backoff( + self.provider, + prompt_with_variables, + self.api_token, + base_url=self.api_base or self.base_url, + extra_args = self.extra_args + ) # , json_response=self.extract_type == "schema") + # Track usage + usage = TokenUsage( + completion_tokens=response.usage.completion_tokens, + prompt_tokens=response.usage.prompt_tokens, + total_tokens=response.usage.total_tokens, + completion_tokens_details=response.usage.completion_tokens_details.__dict__ if response.usage.completion_tokens_details else {}, + prompt_tokens_details=response.usage.prompt_tokens_details.__dict__ if response.usage.prompt_tokens_details else {} + ) + self.usages.append(usage) + + # Update totals + self.total_usage.completion_tokens += usage.completion_tokens + self.total_usage.prompt_tokens += usage.prompt_tokens + self.total_usage.total_tokens += usage.total_tokens + + try: + blocks = extract_xml_data(["blocks"], response.choices[0].message.content)['blocks'] + blocks = json.loads(blocks) + for block in blocks: + block['error'] = False + except Exception as e: + parsed, unparsed = split_and_parse_json_objects(response.choices[0].message.content) + blocks = parsed + if unparsed: + blocks.append({ + "index": 0, + "error": True, + "tags": ["error"], + "content": unparsed + }) + + if self.verbose: + print("[LOG] Extracted", len(blocks), "blocks from URL:", url, "block index:", ix) + return blocks + + def _merge(self, documents, chunk_token_threshold, overlap): + """ + Merge documents into sections based on chunk_token_threshold and overlap. + """ + chunks = [] + sections = [] + total_tokens = 0 + + # Calculate the total tokens across all documents + for document in documents: + total_tokens += len(document.split(' ')) * self.word_token_rate + + # Calculate the number of sections needed + num_sections = math.floor(total_tokens / chunk_token_threshold) + if num_sections < 1: + num_sections = 1 # Ensure there is at least one section + adjusted_chunk_threshold = total_tokens / num_sections + + total_token_so_far = 0 + current_chunk = [] + + for document in documents: + tokens = document.split(' ') + token_count = len(tokens) * self.word_token_rate + + if total_token_so_far + token_count <= adjusted_chunk_threshold: + current_chunk.extend(tokens) + total_token_so_far += token_count + else: + # Ensure to handle the last section properly + if len(sections) == num_sections - 1: + current_chunk.extend(tokens) + continue + + # Add overlap if specified + if overlap > 0 and current_chunk: + overlap_tokens = current_chunk[-overlap:] + current_chunk.extend(overlap_tokens) + + sections.append(' '.join(current_chunk)) + current_chunk = tokens + total_token_so_far = token_count + + # Add the last chunk + if current_chunk: + sections.append(' '.join(current_chunk)) + + return sections + + + def run(self, url: str, sections: List[str]) -> List[Dict[str, Any]]: + """ + Process sections sequentially with a delay for rate limiting issues, specifically for LLMExtractionStrategy. + + Args: + url: The URL of the webpage. + sections: List of sections (strings) to process. + + Returns: + A list of extracted blocks or chunks. + """ + + merged_sections = self._merge( + sections, self.chunk_token_threshold, + overlap= int(self.chunk_token_threshold * self.overlap_rate) + ) + extracted_content = [] + if self.provider.startswith("groq/"): + # Sequential processing with a delay + for ix, section in enumerate(merged_sections): + extract_func = partial(self.extract, url) + extracted_content.extend(extract_func(ix, sanitize_input_encode(section))) + time.sleep(0.5) # 500 ms delay between each processing + else: + # Parallel processing using ThreadPoolExecutor + # extract_func = partial(self.extract, url) + # for ix, section in enumerate(merged_sections): + # extracted_content.append(extract_func(ix, section)) + + with ThreadPoolExecutor(max_workers=4) as executor: + extract_func = partial(self.extract, url) + futures = [executor.submit(extract_func, ix, sanitize_input_encode(section)) for ix, section in enumerate(merged_sections)] + + for future in as_completed(futures): + try: + extracted_content.extend(future.result()) + except Exception as e: + if self.verbose: + print(f"Error in thread execution: {e}") + # Add error information to extracted_content + extracted_content.append({ + "index": 0, + "error": True, + "tags": ["error"], + "content": str(e) + }) + + + return extracted_content + + + def show_usage(self) -> None: + """Print a detailed token usage report showing total and per-request usage.""" + print("\n=== Token Usage Summary ===") + print(f"{'Type':<15} {'Count':>12}") + print("-" * 30) + print(f"{'Completion':<15} {self.total_usage.completion_tokens:>12,}") + print(f"{'Prompt':<15} {self.total_usage.prompt_tokens:>12,}") + print(f"{'Total':<15} {self.total_usage.total_tokens:>12,}") + + print("\n=== Usage History ===") + print(f"{'Request #':<10} {'Completion':>12} {'Prompt':>12} {'Total':>12}") + print("-" * 48) + for i, usage in enumerate(self.usages, 1): + print(f"{i:<10} {usage.completion_tokens:>12,} {usage.prompt_tokens:>12,} {usage.total_tokens:>12,}") + + ####################################################### # New extraction strategies for JSON-based extraction # diff --git a/docs/examples/hooks_example.py b/docs/examples/hooks_example.py index 09e0bc17..06b509bd 100644 --- a/docs/examples/hooks_example.py +++ b/docs/examples/hooks_example.py @@ -36,7 +36,7 @@ async def main(): 'domain': '.example.com', 'path': '/' }]) - await page.set_viewport_size({"width": 1920, "height": 1080}) + await page.set_viewport_size({"width": 1080, "height": 800}) return page async def on_user_agent_updated(page: Page, context: BrowserContext, user_agent: str, **kwargs): diff --git a/docs/md_v3/tutorials/advanced-features.md b/docs/md_v2/advanced/advanced-features.md similarity index 88% rename from docs/md_v3/tutorials/advanced-features.md rename to docs/md_v2/advanced/advanced-features.md index 16f85874..1f402948 100644 --- a/docs/md_v3/tutorials/advanced-features.md +++ b/docs/md_v2/advanced/advanced-features.md @@ -1,15 +1,16 @@ -# Advanced Features (Proxy, PDF, Screenshot, SSL, Headers, & Storage State) +# Overview of Some Important Advanced Features +(Proxy, PDF, Screenshot, SSL, Headers, & Storage State) Crawl4AI offers multiple power-user features that go beyond simple crawling. This tutorial covers: -1. **Proxy Usage** -2. **Capturing PDFs & Screenshots** -3. **Handling SSL Certificates** -4. **Custom Headers** -5. **Session Persistence & Local Storage** +1. **Proxy Usage** +2. **Capturing PDFs & Screenshots** +3. **Handling SSL Certificates** +4. **Custom Headers** +5. **Session Persistence & Local Storage** > **Prerequisites** -> - You have a basic grasp of [AsyncWebCrawler Basics](./async-webcrawler-basics.md) +> - You have a basic grasp of [AsyncWebCrawler Basics](../core/simple-crawling.md) > - You know how to run or configure your Python environment with Playwright installed --- @@ -84,7 +85,7 @@ async def main(): # Save PDF if result.pdf: with open("wikipedia_page.pdf", "wb") as f: - f.write(b64decode(result.pdf)) + f.write(result.pdf) print("[OK] PDF & screenshot captured.") else: @@ -186,7 +187,7 @@ if __name__ == "__main__": **Notes** - Some sites may react differently to certain headers (e.g., `Accept-Language`). -- If you need advanced user-agent randomization or client hints, see [Identity-Based Crawling (Anti-Bot)](./identity-anti-bot.md) or use `UserAgentGenerator`. +- If you need advanced user-agent randomization or client hints, see [Identity-Based Crawling (Anti-Bot)](./identity-based-crawling.md) or use `UserAgentGenerator`. --- @@ -246,7 +247,7 @@ You can sign in once, export the browser context, and reuse it later—without r - **`await context.storage_state(path="my_storage.json")`**: Exports cookies, localStorage, etc. to a file. - Provide `storage_state="my_storage.json"` on subsequent runs to skip the login step. -**See**: [Detailed session management tutorial](./hooks-custom.md#using-storage_state) or [Explanations → Browser Context & Managed Browser](../../explanations/browser-management.md) for more advanced scenarios (like multi-step logins, or capturing after interactive pages). +**See**: [Detailed session management tutorial](./session-management.md) or [Explanations → Browser Context & Managed Browser](./identity-based-crawling.md) for more advanced scenarios (like multi-step logins, or capturing after interactive pages). --- @@ -283,7 +284,10 @@ async def main(): # 3. Crawl async with AsyncWebCrawler(config=browser_cfg) as crawler: - result = await crawler.arun("https://secure.example.com/protected", config=crawler_cfg) + result = await crawler.arun( + url = "https://secure.example.com/protected", + config=crawler_cfg + ) if result.success: print("[OK] Crawled the secure page. Links found:", len(result.links.get("internal", []))) @@ -318,12 +322,6 @@ You’ve now explored several **advanced** features: - **Custom Headers** for language or specialized requests - **Session Persistence** via storage state -**Where to go next**: - -- **[Hooks & Custom Code](./hooks-custom.md)**: For multi-step interactions (clicking “Load More,” performing logins, etc.) -- **[Identity-Based Crawling & Anti-Bot](./identity-anti-bot.md)**: If you need more sophisticated user simulation or stealth. -- **[Reference → BrowserConfig & CrawlerRunConfig](../../reference/configuration.md)**: Detailed param descriptions for everything you’ve seen here and more. - With these power tools, you can build robust scraping workflows that mimic real user behavior, handle secure sites, capture detailed snapshots, and manage sessions across multiple runs—streamlining your entire data collection pipeline. -**Last Updated**: 2024-XX-XX \ No newline at end of file +**Last Updated**: 2025-01-01 \ No newline at end of file diff --git a/docs/md_v2/advanced/content-processing.md b/docs/md_v2/advanced/content-processing.md deleted file mode 100644 index 25ed6172..00000000 --- a/docs/md_v2/advanced/content-processing.md +++ /dev/null @@ -1,136 +0,0 @@ -# Content Processing - -Crawl4AI provides powerful content processing capabilities that help you extract clean, relevant content from web pages. This guide covers content cleaning, media handling, link analysis, and metadata extraction. - -## Media Processing - -Crawl4AI provides comprehensive media extraction and analysis capabilities. It automatically detects and processes various types of media elements while maintaining their context and relevance. - -### Image Processing - -The library handles various image scenarios, including: -- Regular images -- Lazy-loaded images -- Background images -- Responsive images -- Image metadata and context - -```python -from crawl4ai.async_configs import CrawlerRunConfig - -config = CrawlerRunConfig() -result = await crawler.arun(url="https://example.com", config=config) - -for image in result.media["images"]: - # Each image includes rich metadata - print(f"Source: {image['src']}") - print(f"Alt text: {image['alt']}") - print(f"Description: {image['desc']}") - print(f"Context: {image['context']}") # Surrounding text - print(f"Relevance score: {image['score']}") # 0-10 score -``` - -### Handling Lazy-Loaded Content - -Crawl4AI already handles lazy loading for media elements. You can customize the wait time for lazy-loaded content with `CrawlerRunConfig`: - -```python -config = CrawlerRunConfig( - wait_for="css:img[data-src]", # Wait for lazy images - delay_before_return_html=2.0 # Additional wait time -) -result = await crawler.arun(url="https://example.com", config=config) -``` - -### Video and Audio Content - -The library extracts video and audio elements with their metadata: - -```python -from crawl4ai.async_configs import CrawlerRunConfig - -config = CrawlerRunConfig() -result = await crawler.arun(url="https://example.com", config=config) - -# Process videos -for video in result.media["videos"]: - print(f"Video source: {video['src']}") - print(f"Type: {video['type']}") - print(f"Duration: {video.get('duration')}") - print(f"Thumbnail: {video.get('poster')}") - -# Process audio -for audio in result.media["audios"]: - print(f"Audio source: {audio['src']}") - print(f"Type: {audio['type']}") - print(f"Duration: {audio.get('duration')}") -``` - -## Link Analysis - -Crawl4AI provides sophisticated link analysis capabilities, helping you understand the relationship between pages and identify important navigation patterns. - -### Link Classification - -The library automatically categorizes links into: -- Internal links (same domain) -- External links (different domains) -- Social media links -- Navigation links -- Content links - -```python -from crawl4ai.async_configs import CrawlerRunConfig - -config = CrawlerRunConfig() -result = await crawler.arun(url="https://example.com", config=config) - -# Analyze internal links -for link in result.links["internal"]: - print(f"Internal: {link['href']}") - print(f"Link text: {link['text']}") - print(f"Context: {link['context']}") # Surrounding text - print(f"Type: {link['type']}") # nav, content, etc. - -# Analyze external links -for link in result.links["external"]: - print(f"External: {link['href']}") - print(f"Domain: {link['domain']}") - print(f"Type: {link['type']}") -``` - -### Smart Link Filtering - -Control which links are included in the results with `CrawlerRunConfig`: - -```python -config = CrawlerRunConfig( - exclude_external_links=True, # Remove external links - exclude_social_media_links=True, # Remove social media links - exclude_social_media_domains=[ # Custom social media domains - "facebook.com", "twitter.com", "instagram.com" - ], - exclude_domains=["ads.example.com"] # Exclude specific domains -) -result = await crawler.arun(url="https://example.com", config=config) -``` - -## Metadata Extraction - -Crawl4AI automatically extracts and processes page metadata, providing valuable information about the content: - -```python -from crawl4ai.async_configs import CrawlerRunConfig - -config = CrawlerRunConfig() -result = await crawler.arun(url="https://example.com", config=config) - -metadata = result.metadata -print(f"Title: {metadata['title']}") -print(f"Description: {metadata['description']}") -print(f"Keywords: {metadata['keywords']}") -print(f"Author: {metadata['author']}") -print(f"Published Date: {metadata['published_date']}") -print(f"Modified Date: {metadata['modified_date']}") -print(f"Language: {metadata['language']}") -``` diff --git a/docs/md_v2/advanced/crawl-dispatcher.md b/docs/md_v2/advanced/crawl-dispatcher.md new file mode 100644 index 00000000..e4059f25 --- /dev/null +++ b/docs/md_v2/advanced/crawl-dispatcher.md @@ -0,0 +1,12 @@ +# Crawl Dispatcher + +We’re excited to announce a **Crawl Dispatcher** module that can handle **thousands** of crawling tasks simultaneously. By efficiently managing system resources (memory, CPU, network), this dispatcher ensures high-performance data extraction at scale. It also provides **real-time monitoring** of each crawler’s status, memory usage, and overall progress. + +Stay tuned—this feature is **coming soon** in an upcoming release of Crawl4AI! For the latest news, keep an eye on our changelogs and follow [@unclecode](https://twitter.com/unclecode) on X. + +Below is a **sample** of how the dispatcher’s performance monitor might look in action: + +![Crawl Dispatcher Performance Monitor](../assets/images/dispatcher.png) + + +We can’t wait to bring you this streamlined, **scalable** approach to multi-URL crawling—**watch this space** for updates! \ No newline at end of file diff --git a/docs/md_v2/basic/file-download.md b/docs/md_v2/advanced/file-downloading.md similarity index 92% rename from docs/md_v2/basic/file-download.md rename to docs/md_v2/advanced/file-downloading.md index eac0f5cb..2fa3759f 100644 --- a/docs/md_v2/basic/file-download.md +++ b/docs/md_v2/advanced/file-downloading.md @@ -17,18 +17,6 @@ async def main(): asyncio.run(main()) ``` -Or, enable it for a specific crawl by using `CrawlerRunConfig`: - -```python -from crawl4ai.async_configs import CrawlerRunConfig - -async def main(): - async with AsyncWebCrawler() as crawler: - config = CrawlerRunConfig(accept_downloads=True) - result = await crawler.arun(url="https://example.com", config=config) - # ... -``` - ## Specifying Download Location Specify the download directory using the `downloads_path` attribute in the `BrowserConfig` object. If not provided, Crawl4AI defaults to creating a "downloads" directory inside the `.crawl4ai` folder in your home directory. @@ -98,7 +86,8 @@ async def download_multiple_files(url: str, download_path: str): const downloadLinks = document.querySelectorAll('a[download]'); for (const link of downloadLinks) { link.click(); - await new Promise(r => setTimeout(r, 2000)); // Delay between clicks + // Delay between clicks + await new Promise(r => setTimeout(r, 2000)); } """, wait_for=10 # Wait for all downloads to start diff --git a/docs/md_v2/advanced/hooks-auth.md b/docs/md_v2/advanced/hooks-auth.md index 66042229..6787abd9 100644 --- a/docs/md_v2/advanced/hooks-auth.md +++ b/docs/md_v2/advanced/hooks-auth.md @@ -1,121 +1,254 @@ -# Hooks & Auth for AsyncWebCrawler +# Hooks & Auth in AsyncWebCrawler -Crawl4AI's `AsyncWebCrawler` allows you to customize the behavior of the web crawler using hooks. Hooks are asynchronous functions called at specific points in the crawling process, allowing you to modify the crawler's behavior or perform additional actions. This updated documentation demonstrates how to use hooks, including the new `on_page_context_created` hook, and ensures compatibility with `BrowserConfig` and `CrawlerRunConfig`. +Crawl4AI’s **hooks** let you customize the crawler at specific points in the pipeline: -## Example: Using Crawler Hooks with AsyncWebCrawler +1. **`on_browser_created`** – After browser creation. +2. **`on_page_context_created`** – After a new context & page are created. +3. **`before_goto`** – Just before navigating to a page. +4. **`after_goto`** – Right after navigation completes. +5. **`on_user_agent_updated`** – Whenever the user agent changes. +6. **`on_execution_started`** – Once custom JavaScript execution begins. +7. **`before_retrieve_html`** – Just before the crawler retrieves final HTML. +8. **`before_return_html`** – Right before returning the HTML content. -In this example, we'll: +**Important**: Avoid heavy tasks in `on_browser_created` since you don’t yet have a page context. If you need to *log in*, do so in **`on_page_context_created`**. -1. Configure the browser and set up authentication when it's created. -2. Apply custom routing and initial actions when the page context is created. -3. Add custom headers before navigating to the URL. -4. Log the current URL after navigation. -5. Perform actions after JavaScript execution. -6. Log the length of the HTML before returning it. +> note "Important Hook Usage Warning" + **Avoid Misusing Hooks**: Do not manipulate page objects in the wrong hook or at the wrong time, as it can crash the pipeline or produce incorrect results. A common mistake is attempting to handle authentication prematurely—such as creating or closing pages in `on_browser_created`. -### Hook Definitions +> **Use the Right Hook for Auth**: If you need to log in or set tokens, use `on_page_context_created`. This ensures you have a valid page/context to work with, without disrupting the main crawling flow. + +> **Identity-Based Crawling**: For robust auth, consider identity-based crawling (or passing a session ID) to preserve state. Run your initial login steps in a separate, well-defined process, then feed that session to your main crawl—rather than shoehorning complex authentication into early hooks. Check out [Identity-Based Crawling](../advanced/identity-based-crawling.md) for more details. + +> **Be Cautious**: Overwriting or removing elements in the wrong hook can compromise the final crawl. Keep hooks focused on smaller tasks (like route filters, custom headers), and let your main logic (crawling, data extraction) proceed normally. + + +Below is an example demonstration. + +--- + +## Example: Using Hooks in AsyncWebCrawler ```python import asyncio -from crawl4ai import AsyncWebCrawler -from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig -from playwright.async_api import Page, Browser, BrowserContext +import json +from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode +from playwright.async_api import Page, BrowserContext -def log_routing(route): - # Example: block loading images - if route.request.resource_type == "image": - print(f"[HOOK] Blocking image request: {route.request.url}") - asyncio.create_task(route.abort()) - else: - asyncio.create_task(route.continue_()) - -async def on_browser_created(browser: Browser, **kwargs): - print("[HOOK] on_browser_created") - # Example: Set browser viewport size and log in - context = await browser.new_context(viewport={"width": 1920, "height": 1080}) - page = await context.new_page() - await page.goto("https://example.com/login") - await page.fill("input[name='username']", "testuser") - await page.fill("input[name='password']", "password123") - await page.click("button[type='submit']") - await page.wait_for_selector("#welcome") - await context.add_cookies([{"name": "auth_token", "value": "abc123", "url": "https://example.com"}]) - await page.close() - await context.close() - -async def on_page_context_created(context: BrowserContext, page: Page, **kwargs): - print("[HOOK] on_page_context_created") - await context.route("**", log_routing) - -async def before_goto(page: Page, context: BrowserContext, **kwargs): - print("[HOOK] before_goto") - await page.set_extra_http_headers({"X-Test-Header": "test"}) - -async def after_goto(page: Page, context: BrowserContext, **kwargs): - print("[HOOK] after_goto") - print(f"Current URL: {page.url}") - -async def on_execution_started(page: Page, context: BrowserContext, **kwargs): - print("[HOOK] on_execution_started") - await page.evaluate("console.log('Custom JS executed')") - -async def before_return_html(page: Page, context: BrowserContext, html: str, **kwargs): - print("[HOOK] before_return_html") - print(f"HTML length: {len(html)}") - return page -``` - -### Using the Hooks with AsyncWebCrawler - -```python async def main(): - print("\n🔗 Using Crawler Hooks: Customize AsyncWebCrawler with hooks!") + print("🔗 Hooks Example: Demonstrating recommended usage") - # Configure browser and crawler settings + # 1) Configure the browser browser_config = BrowserConfig( headless=True, - viewport_width=1920, - viewport_height=1080 + verbose=True ) - + + # 2) Configure the crawler run crawler_run_config = CrawlerRunConfig( js_code="window.scrollTo(0, document.body.scrollHeight);", - wait_for="footer" + wait_for="body", + cache_mode=CacheMode.BYPASS ) - # Initialize crawler - async with AsyncWebCrawler(config=browser_config) as crawler: - crawler.crawler_strategy.set_hook("on_browser_created", on_browser_created) - crawler.crawler_strategy.set_hook("on_page_context_created", on_page_context_created) - crawler.crawler_strategy.set_hook("before_goto", before_goto) - crawler.crawler_strategy.set_hook("after_goto", after_goto) - crawler.crawler_strategy.set_hook("on_execution_started", on_execution_started) - crawler.crawler_strategy.set_hook("before_return_html", before_return_html) + # 3) Create the crawler instance + crawler = AsyncWebCrawler(config=browser_config) - # Run the crawler - result = await crawler.arun(url="https://example.com", config=crawler_run_config) + # + # Define Hook Functions + # - print("\n📦 Crawler Hooks Result:") - print(result) + async def on_browser_created(browser, **kwargs): + # Called once the browser instance is created (but no pages or contexts yet) + print("[HOOK] on_browser_created - Browser created successfully!") + # Typically, do minimal setup here if needed + return browser -asyncio.run(main()) + async def on_page_context_created(page: Page, context: BrowserContext, **kwargs): + # Called right after a new page + context are created (ideal for auth or route config). + print("[HOOK] on_page_context_created - Setting up page & context.") + + # Example 1: Route filtering (e.g., block images) + async def route_filter(route): + if route.request.resource_type == "image": + print(f"[HOOK] Blocking image request: {route.request.url}") + await route.abort() + else: + await route.continue_() + + await context.route("**", route_filter) + + # Example 2: (Optional) Simulate a login scenario + # (We do NOT create or close pages here, just do quick steps if needed) + # e.g., await page.goto("https://example.com/login") + # e.g., await page.fill("input[name='username']", "testuser") + # e.g., await page.fill("input[name='password']", "password123") + # e.g., await page.click("button[type='submit']") + # e.g., await page.wait_for_selector("#welcome") + # e.g., await context.add_cookies([...]) + # Then continue + + # Example 3: Adjust the viewport + await page.set_viewport_size({"width": 1080, "height": 600}) + return page + + async def before_goto( + page: Page, context: BrowserContext, url: str, **kwargs + ): + # Called before navigating to each URL. + print(f"[HOOK] before_goto - About to navigate: {url}") + # e.g., inject custom headers + await page.set_extra_http_headers({ + "Custom-Header": "my-value" + }) + return page + + async def after_goto( + page: Page, context: BrowserContext, + url: str, response, **kwargs + ): + # Called after navigation completes. + print(f"[HOOK] after_goto - Successfully loaded: {url}") + # e.g., wait for a certain element if we want to verify + try: + await page.wait_for_selector('.content', timeout=1000) + print("[HOOK] Found .content element!") + except: + print("[HOOK] .content not found, continuing anyway.") + return page + + async def on_user_agent_updated( + page: Page, context: BrowserContext, + user_agent: str, **kwargs + ): + # Called whenever the user agent updates. + print(f"[HOOK] on_user_agent_updated - New user agent: {user_agent}") + return page + + async def on_execution_started(page: Page, context: BrowserContext, **kwargs): + # Called after custom JavaScript execution begins. + print("[HOOK] on_execution_started - JS code is running!") + return page + + async def before_retrieve_html(page: Page, context: BrowserContext, **kwargs): + # Called before final HTML retrieval. + print("[HOOK] before_retrieve_html - We can do final actions") + # Example: Scroll again + await page.evaluate("window.scrollTo(0, document.body.scrollHeight);") + return page + + async def before_return_html( + page: Page, context: BrowserContext, html: str, **kwargs + ): + # Called just before returning the HTML in the result. + print(f"[HOOK] before_return_html - HTML length: {len(html)}") + return page + + # + # Attach Hooks + # + + crawler.crawler_strategy.set_hook("on_browser_created", on_browser_created) + crawler.crawler_strategy.set_hook( + "on_page_context_created", on_page_context_created + ) + crawler.crawler_strategy.set_hook("before_goto", before_goto) + crawler.crawler_strategy.set_hook("after_goto", after_goto) + crawler.crawler_strategy.set_hook( + "on_user_agent_updated", on_user_agent_updated + ) + crawler.crawler_strategy.set_hook( + "on_execution_started", on_execution_started + ) + crawler.crawler_strategy.set_hook( + "before_retrieve_html", before_retrieve_html + ) + crawler.crawler_strategy.set_hook( + "before_return_html", before_return_html + ) + + await crawler.start() + + # 4) Run the crawler on an example page + url = "https://example.com" + result = await crawler.arun(url, config=crawler_run_config) + + if result.success: + print("\nCrawled URL:", result.url) + print("HTML length:", len(result.html)) + else: + print("Error:", result.error_message) + + await crawler.close() + +if __name__ == "__main__": + asyncio.run(main()) ``` -### Explanation of Hooks +--- -- **`on_browser_created`**: Called when the browser is created. Use this to configure the browser or handle authentication (e.g., logging in and setting cookies). -- **`on_page_context_created`**: Called when a new page context is created. Use this to apply routing, block resources, or inject custom logic before navigating to the URL. -- **`before_goto`**: Called before navigating to the URL. Use this to add custom headers or perform other pre-navigation actions. -- **`after_goto`**: Called after navigation. Use this to verify content or log the URL. -- **`on_execution_started`**: Called after executing custom JavaScript. Use this to perform additional actions. -- **`before_return_html`**: Called before returning the HTML content. Use this to log details or preprocess the content. +## Hook Lifecycle Summary -### Additional Customizations +1. **`on_browser_created`**: + - Browser is up, but **no** pages or contexts yet. + - Light setup only—don’t try to open or close pages here (that belongs in `on_page_context_created`). -- **Resource Management**: Use `on_page_context_created` to block or modify requests (e.g., block images, fonts, or third-party scripts). -- **Dynamic Headers**: Use `before_goto` to add or modify headers dynamically based on the URL. -- **Authentication**: Use `on_browser_created` to handle login processes and set authentication cookies or tokens. -- **Content Analysis**: Use `before_return_html` to analyze or modify the extracted HTML content. +2. **`on_page_context_created`**: + - Perfect for advanced **auth** or route blocking. + - You have a **page** + **context** ready but haven’t navigated to the target URL yet. -These hooks provide powerful customization options for tailoring the crawling process to your needs. +3. **`before_goto`**: + - Right before navigation. Typically used for setting **custom headers** or logging the target URL. + +4. **`after_goto`**: + - After page navigation is done. Good place for verifying content or waiting on essential elements. + +5. **`on_user_agent_updated`**: + - Whenever the user agent changes (for stealth or different UA modes). + +6. **`on_execution_started`**: + - If you set `js_code` or run custom scripts, this runs once your JS is about to start. + +7. **`before_retrieve_html`**: + - Just before the final HTML snapshot is taken. Often you do a final scroll or lazy-load triggers here. + +8. **`before_return_html`**: + - The last hook before returning HTML to the `CrawlResult`. Good for logging HTML length or minor modifications. + +--- + +## When to Handle Authentication + +**Recommended**: Use **`on_page_context_created`** if you need to: + +- Navigate to a login page or fill forms +- Set cookies or localStorage tokens +- Block resource routes to avoid ads + +This ensures the newly created context is under your control **before** `arun()` navigates to the main URL. + +--- + +## Additional Considerations + +- **Session Management**: If you want multiple `arun()` calls to reuse a single session, pass `session_id=` in your `CrawlerRunConfig`. Hooks remain the same. +- **Performance**: Hooks can slow down crawling if they do heavy tasks. Keep them concise. +- **Error Handling**: If a hook fails, the overall crawl might fail. Catch exceptions or handle them gracefully. +- **Concurrency**: If you run `arun_many()`, each URL triggers these hooks in parallel. Ensure your hooks are thread/async-safe. + +--- + +## Conclusion + +Hooks provide **fine-grained** control over: + +- **Browser** creation (light tasks only) +- **Page** and **context** creation (auth, route blocking) +- **Navigation** phases +- **Final HTML** retrieval + +Follow the recommended usage: +- **Login** or advanced tasks in `on_page_context_created` +- **Custom headers** or logs in `before_goto` / `after_goto` +- **Scrolling** or final checks in `before_retrieve_html` / `before_return_html` diff --git a/docs/md_v2/advanced/identity-based-crawling.md b/docs/md_v2/advanced/identity-based-crawling.md new file mode 100644 index 00000000..702d9475 --- /dev/null +++ b/docs/md_v2/advanced/identity-based-crawling.md @@ -0,0 +1,180 @@ +# Preserve Your Identity with Crawl4AI + +Crawl4AI empowers you to navigate and interact with the web using your **authentic digital identity**, ensuring you’re recognized as a human and not mistaken for a bot. This tutorial covers: + +1. **Managed Browsers** – The recommended approach for persistent profiles and identity-based crawling. +2. **Magic Mode** – A simplified fallback solution for quick automation without persistent identity. + +--- + +## 1. Managed Browsers: Your Digital Identity Solution + +**Managed Browsers** let developers create and use **persistent browser profiles**. These profiles store local storage, cookies, and other session data, letting you browse as your **real self**—complete with logins, preferences, and cookies. + +### Key Benefits + +- **Authentic Browsing Experience**: Retain session data and browser fingerprints as though you’re a normal user. +- **Effortless Configuration**: Once you log in or solve CAPTCHAs in your chosen data directory, you can re-run crawls without repeating those steps. +- **Empowered Data Access**: If you can see the data in your own browser, you can automate its retrieval with your genuine identity. + +--- + +Below is a **partial update** to your **Managed Browsers** tutorial, specifically the section about **creating a user-data directory** using **Playwright’s Chromium** binary rather than a system-wide Chrome/Edge. We’ll show how to **locate** that binary and launch it with a `--user-data-dir` argument to set up your profile. You can then point `BrowserConfig.user_data_dir` to that folder for subsequent crawls. + +--- + +### Creating a User Data Directory (Command-Line Approach via Playwright) + +If you installed Crawl4AI (which installs Playwright under the hood), you already have a Playwright-managed Chromium on your system. Follow these steps to launch that **Chromium** from your command line, specifying a **custom** data directory: + +1. **Find** the Playwright Chromium binary: + - On most systems, installed browsers go under a `~/.cache/ms-playwright/` folder or similar path. + - To see an overview of installed browsers, run: + ```bash + python -m playwright install --dry-run + ``` + or + ```bash + playwright install --dry-run + ``` + (depending on your environment). This shows where Playwright keeps Chromium. + + - For instance, you might see a path like: + ``` + ~/.cache/ms-playwright/chromium-1234/chrome-linux/chrome + ``` + on Linux, or a corresponding folder on macOS/Windows. + +2. **Launch** the Playwright Chromium binary with a **custom** user-data directory: + ```bash + # Linux example + ~/.cache/ms-playwright/chromium-1234/chrome-linux/chrome \ + --user-data-dir=/home//my_chrome_profile + ``` + ```bash + # macOS example (Playwright’s internal binary) + ~/Library/Caches/ms-playwright/chromium-1234/chrome-mac/Chromium.app/Contents/MacOS/Chromium \ + --user-data-dir=/Users//my_chrome_profile + ``` + ```powershell + # Windows example (PowerShell/cmd) + "C:\Users\\AppData\Local\ms-playwright\chromium-1234\chrome-win\chrome.exe" ^ + --user-data-dir="C:\Users\\my_chrome_profile" + ``` + + **Replace** the path with the actual subfolder indicated in your `ms-playwright` cache structure. + - This **opens** a fresh Chromium with your new or existing data folder. + - **Log into** any sites or configure your browser the way you want. + - **Close** when done—your profile data is saved in that folder. + +3. **Use** that folder in **`BrowserConfig.user_data_dir`**: + ```python + from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig + + browser_config = BrowserConfig( + headless=True, + use_managed_browser=True, + user_data_dir="/home//my_chrome_profile", + browser_type="chromium" + ) + ``` + - Next time you run your code, it reuses that folder—**preserving** your session data, cookies, local storage, etc. + +--- + +## 3. Using Managed Browsers in Crawl4AI + +Once you have a data directory with your session data, pass it to **`BrowserConfig`**: + +```python +import asyncio +from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig + +async def main(): + # 1) Reference your persistent data directory + browser_config = BrowserConfig( + headless=True, # 'True' for automated runs + verbose=True, + use_managed_browser=True, # Enables persistent browser strategy + browser_type="chromium", + user_data_dir="/path/to/my-chrome-profile" + ) + + # 2) Standard crawl config + crawl_config = CrawlerRunConfig( + wait_for="css:.logged-in-content" + ) + + async with AsyncWebCrawler(config=browser_config) as crawler: + result = await crawler.arun(url="https://example.com/private", config=crawl_config) + if result.success: + print("Successfully accessed private data with your identity!") + else: + print("Error:", result.error_message) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +### Workflow + +1. **Login** externally (via CLI or your normal Chrome with `--user-data-dir=...`). +2. **Close** that browser. +3. **Use** the same folder in `user_data_dir=` in Crawl4AI. +4. **Crawl** – The site sees your identity as if you’re the same user who just logged in. + +--- + +## 4. Magic Mode: Simplified Automation + +If you **don’t** need a persistent profile or identity-based approach, **Magic Mode** offers a quick way to simulate human-like browsing without storing long-term data. + +```python +from crawl4ai import AsyncWebCrawler, CrawlerRunConfig + +async with AsyncWebCrawler() as crawler: + result = await crawler.arun( + url="https://example.com", + config=CrawlerRunConfig( + magic=True, # Simplifies a lot of interaction + remove_overlay_elements=True, + page_timeout=60000 + ) + ) +``` + +**Magic Mode**: + +- Simulates a user-like experience +- Randomizes user agent & navigator +- Randomizes interactions & timings +- Masks automation signals +- Attempts pop-up handling + +**But** it’s no substitute for **true** user-based sessions if you want a fully legitimate identity-based solution. + +--- + +## 5. Comparing Managed Browsers vs. Magic Mode + +| Feature | **Managed Browsers** | **Magic Mode** | +|----------------------------|---------------------------------------------------------------|-----------------------------------------------------| +| **Session Persistence** | Full localStorage/cookies retained in user_data_dir | No persistent data (fresh each run) | +| **Genuine Identity** | Real user profile with full rights & preferences | Emulated user-like patterns, but no actual identity | +| **Complex Sites** | Best for login-gated sites or heavy config | Simple tasks, minimal login or config needed | +| **Setup** | External creation of user_data_dir, then use in Crawl4AI | Single-line approach (`magic=True`) | +| **Reliability** | Extremely consistent (same data across runs) | Good for smaller tasks, can be less stable | + +--- + +## 6. Summary + +- **Create** your user-data directory by launching Chrome/Chromium externally with `--user-data-dir=/some/path`. +- **Log in** or configure sites as needed, then close the browser. +- **Reference** that folder in `BrowserConfig(user_data_dir="...")` + `use_managed_browser=True`. +- Enjoy **persistent** sessions that reflect your real identity. +- If you only need quick, ephemeral automation, **Magic Mode** might suffice. + +**Recommended**: Always prefer a **Managed Browser** for robust, identity-based crawling and simpler interactions with complex sites. Use **Magic Mode** for quick tasks or prototypes where persistent data is unnecessary. + +With these approaches, you preserve your **authentic** browsing environment, ensuring the site sees you exactly as a normal user—no repeated logins or wasted time. \ No newline at end of file diff --git a/docs/md_v2/advanced/identity_based_crawling.md b/docs/md_v2/advanced/identity_based_crawling.md deleted file mode 100644 index c0ab7fd5..00000000 --- a/docs/md_v2/advanced/identity_based_crawling.md +++ /dev/null @@ -1,156 +0,0 @@ -### Preserve Your Identity with Crawl4AI - -Crawl4AI empowers you to navigate and interact with the web using your authentic digital identity, ensuring that you are recognized as a human and not mistaken for a bot. This document introduces Managed Browsers, the recommended approach for preserving your rights to access the web, and Magic Mode, a simplified solution for specific scenarios. - ---- - -### Managed Browsers: Your Digital Identity Solution - -**Managed Browsers** enable developers to create and use persistent browser profiles. These profiles store local storage, cookies, and other session-related data, allowing you to interact with websites as a recognized user. By leveraging your unique identity, Managed Browsers ensure that your experience reflects your rights as a human browsing the web. - -#### Why Use Managed Browsers? -1. **Authentic Browsing Experience**: Managed Browsers retain session data and browser fingerprints, mirroring genuine user behavior. -2. **Effortless Configuration**: Once you interact with the site using the browser (e.g., solving a CAPTCHA), the session data is saved and reused, providing seamless access. -3. **Empowered Data Access**: By using your identity, Managed Browsers empower users to access data they can view on their own screens without artificial restrictions. - -#### Steps to Use Managed Browsers - -1. **Setup the Browser Configuration**: - ```python - from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig - from crawl4ai.extraction_strategy import JsonCssExtractionStrategy - - browser_config = BrowserConfig( - headless=False, # Set to False for initial setup to view browser actions - verbose=True, - user_agent_mode="random", - use_managed_browser=True, # Enables persistent browser sessions - browser_type="chromium", - user_data_dir="/path/to/user_profile_data" # Path to save session data - ) - ``` - -2. **Perform an Initial Run**: - - Run the crawler with `headless=False`. - - Manually interact with the site (e.g., solve CAPTCHA or log in). - - The browser session saves cookies, local storage, and other required data. - -3. **Subsequent Runs**: - - Switch to `headless=True` for automation. - - The session data is reused, allowing seamless crawling. - -#### Example: Extracting Data Using Managed Browsers - -```python -import asyncio -from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig -from crawl4ai.extraction_strategy import JsonCssExtractionStrategy - -async def main(): - # Define schema for structured data extraction - schema = { - "name": "Example Data", - "baseSelector": "div.example", - "fields": [ - {"name": "title", "selector": "h1", "type": "text"}, - {"name": "link", "selector": "a", "type": "attribute", "attribute": "href"} - ] - } - - # Configure crawler - browser_config = BrowserConfig( - headless=True, # Automate subsequent runs - verbose=True, - use_managed_browser=True, - user_data_dir="/path/to/user_profile_data" - ) - - crawl_config = CrawlerRunConfig( - extraction_strategy=JsonCssExtractionStrategy(schema), - wait_for="css:div.example" # Wait for the targeted element to load - ) - - async with AsyncWebCrawler(config=browser_config) as crawler: - result = await crawler.arun( - url="https://example.com", - config=crawl_config - ) - - if result.success: - print("Extracted Data:", result.extracted_content) - -if __name__ == "__main__": - asyncio.run(main()) -``` - -### Benefits of Managed Browsers Over Other Methods -Managed Browsers eliminate the need for manual detection workarounds by enabling developers to work directly with their identity and user profile data. This approach ensures maximum compatibility with websites and simplifies the crawling process while preserving your right to access data freely. - ---- - -### Magic Mode: Simplified Automation - -While Managed Browsers are the preferred approach, **Magic Mode** provides an alternative for scenarios where persistent user profiles are unnecessary or infeasible. Magic Mode automates user-like behavior and simplifies configuration. - -#### What Magic Mode Does: -- Simulates human browsing by randomizing interaction patterns and timing. -- Masks browser automation signals. -- Handles cookie popups and modals. -- Modifies navigator properties for enhanced compatibility. - -#### Using Magic Mode - -```python -async with AsyncWebCrawler() as crawler: - result = await crawler.arun( - url="https://example.com", - magic=True # Enables all automation features - ) -``` - -Magic Mode is particularly useful for: -- Quick prototyping when a Managed Browser setup is not available. -- Basic sites requiring minimal interaction or configuration. - -#### Example: Combining Magic Mode with Additional Options - -```python -async def crawl_with_magic_mode(url: str): - async with AsyncWebCrawler(headless=True) as crawler: - result = await crawler.arun( - url=url, - magic=True, - remove_overlay_elements=True, # Remove popups/modals - page_timeout=60000 # Increased timeout for complex pages - ) - - return result.markdown if result.success else None -``` - -### Magic Mode vs. Managed Browsers -While Magic Mode simplifies many tasks, it cannot match the reliability and authenticity of Managed Browsers. By using your identity and persistent profiles, Managed Browsers render Magic Mode largely unnecessary. However, Magic Mode remains a viable fallback for specific situations where user identity is not a factor. - ---- - -### Key Comparison: Managed Browsers vs. Magic Mode - -| Feature | **Managed Browsers** | **Magic Mode** | -|-------------------------|------------------------------------------|-------------------------------------| -| **Session Persistence** | Retains cookies and local storage. | No session retention. | -| **Human Interaction** | Uses real user profiles and data. | Simulates human-like patterns. | -| **Complex Sites** | Best suited for heavily configured sites.| Works well with simpler challenges.| -| **Setup Complexity** | Requires initial manual interaction. | Fully automated, one-line setup. | - -#### Recommendation: -- Use **Managed Browsers** for reliable, session-based crawling and data extraction. -- Use **Magic Mode** for quick prototyping or when persistent profiles are not required. - ---- - -### Conclusion - -- **Use Managed Browsers** to preserve your digital identity and ensure reliable, identity-based crawling with persistent sessions. This approach works seamlessly for even the most complex websites. -- **Leverage Magic Mode** for quick automation or in scenarios where persistent user profiles are not needed. - -By combining these approaches, Crawl4AI provides unparalleled flexibility and capability for your crawling needs. - diff --git a/docs/md_v2/advanced/lazy-loading.md b/docs/md_v2/advanced/lazy-loading.md new file mode 100644 index 00000000..04688264 --- /dev/null +++ b/docs/md_v2/advanced/lazy-loading.md @@ -0,0 +1,104 @@ +## Handling Lazy-Loaded Images + +Many websites now load images **lazily** as you scroll. If you need to ensure they appear in your final crawl (and in `result.media`), consider: + +1. **`wait_for_images=True`** – Wait for images to fully load. +2. **`scan_full_page`** – Force the crawler to scroll the entire page, triggering lazy loads. +3. **`scroll_delay`** – Add small delays between scroll steps. + +**Note**: If the site requires multiple “Load More” triggers or complex interactions, see the [Page Interaction docs](../core/page-interaction.md). + +### Example: Ensuring Lazy Images Appear + +```python +import asyncio +from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, BrowserConfig +from crawl4ai.async_configs import CacheMode + +async def main(): + config = CrawlerRunConfig( + # Force the crawler to wait until images are fully loaded + wait_for_images=True, + + # Option 1: If you want to automatically scroll the page to load images + scan_full_page=True, # Tells the crawler to try scrolling the entire page + scroll_delay=0.5, # Delay (seconds) between scroll steps + + # Option 2: If the site uses a 'Load More' or JS triggers for images, + # you can also specify js_code or wait_for logic here. + + cache_mode=CacheMode.BYPASS, + verbose=True + ) + + async with AsyncWebCrawler(config=BrowserConfig(headless=True)) as crawler: + result = await crawler.arun("https://www.example.com/gallery", config=config) + + if result.success: + images = result.media.get("images", []) + print("Images found:", len(images)) + for i, img in enumerate(images[:5]): + print(f"[Image {i}] URL: {img['src']}, Score: {img.get('score','N/A')}") + else: + print("Error:", result.error_message) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +**Explanation**: + +- **`wait_for_images=True`** + The crawler tries to ensure images have finished loading before finalizing the HTML. +- **`scan_full_page=True`** + Tells the crawler to attempt scrolling from top to bottom. Each scroll step helps trigger lazy loading. +- **`scroll_delay=0.5`** + Pause half a second between each scroll step. Helps the site load images before continuing. + +**When to Use**: + +- **Lazy-Loading**: If images appear only when the user scrolls into view, `scan_full_page` + `scroll_delay` helps the crawler see them. +- **Heavier Pages**: If a page is extremely long, be mindful that scanning the entire page can be slow. Adjust `scroll_delay` or the max scroll steps as needed. + +--- + +## Combining with Other Link & Media Filters + +You can still combine **lazy-load** logic with the usual **exclude_external_images**, **exclude_domains**, or link filtration: + +```python +config = CrawlerRunConfig( + wait_for_images=True, + scan_full_page=True, + scroll_delay=0.5, + + # Filter out external images if you only want local ones + exclude_external_images=True, + + # Exclude certain domains for links + exclude_domains=["spammycdn.com"], +) +``` + +This approach ensures you see **all** images from the main domain while ignoring external ones, and the crawler physically scrolls the entire page so that lazy-loading triggers. + +--- + +## Tips & Troubleshooting + +1. **Long Pages** + - Setting `scan_full_page=True` on extremely long or infinite-scroll pages can be resource-intensive. + - Consider using [hooks](../core/page-interaction.md) or specialized logic to load specific sections or “Load More” triggers repeatedly. + +2. **Mixed Image Behavior** + - Some sites load images in batches as you scroll. If you’re missing images, increase your `scroll_delay` or call multiple partial scrolls in a loop with JS code or hooks. + +3. **Combining with Dynamic Wait** + - If the site has a placeholder that only changes to a real image after a certain event, you might do `wait_for="css:img.loaded"` or a custom JS `wait_for`. + +4. **Caching** + - If `cache_mode` is enabled, repeated crawls might skip some network fetches. If you suspect caching is missing new images, set `cache_mode=CacheMode.BYPASS` for fresh fetches. + +--- + +With **lazy-loading** support, **wait_for_images**, and **scan_full_page** settings, you can capture the entire gallery or feed of images you expect—even if the site only loads them as the user scrolls. Combine these with the standard media filtering and domain exclusion for a complete link & media handling strategy. \ No newline at end of file diff --git a/docs/md_v2/advanced/magic-mode.md b/docs/md_v2/advanced/magic-mode.md deleted file mode 100644 index 16c7229e..00000000 --- a/docs/md_v2/advanced/magic-mode.md +++ /dev/null @@ -1,52 +0,0 @@ -# Magic Mode & Anti-Bot Protection - -Crawl4AI provides powerful anti-detection capabilities, with Magic Mode being the simplest and most comprehensive solution. - -## Magic Mode - -The easiest way to bypass anti-bot protections: - -```python -async with AsyncWebCrawler() as crawler: - result = await crawler.arun( - url="https://example.com", - magic=True # Enables all anti-detection features - ) -``` - -Magic Mode automatically: -- Masks browser automation signals -- Simulates human-like behavior -- Overrides navigator properties -- Handles cookie consent popups -- Manages browser fingerprinting -- Randomizes timing patterns - -## Manual Anti-Bot Options - -While Magic Mode is recommended, you can also configure individual anti-detection features: - -```python -result = await crawler.arun( - url="https://example.com", - simulate_user=True, # Simulate human behavior - override_navigator=True # Mask automation signals -) -``` - -Note: When `magic=True` is used, you don't need to set these individual options. - -## Example: Handling Protected Sites - -```python -async def crawl_protected_site(url: str): - async with AsyncWebCrawler(headless=True) as crawler: - result = await crawler.arun( - url=url, - magic=True, - remove_overlay_elements=True, # Remove popups/modals - page_timeout=60000 # Increased timeout for protection checks - ) - - return result.markdown if result.success else None -``` diff --git a/docs/md_v2/advanced/managed_browser.md b/docs/md_v2/advanced/managed_browser.md deleted file mode 100644 index bbe07f2f..00000000 --- a/docs/md_v2/advanced/managed_browser.md +++ /dev/null @@ -1,188 +0,0 @@ -# Creating Browser Instances, Contexts, and Pages - -## 1 Introduction - -### Overview of Browser Management in Crawl4AI -Crawl4AI's browser management system is designed to provide developers with advanced tools for handling complex web crawling tasks. By managing browser instances, contexts, and pages, Crawl4AI ensures optimal performance, anti-bot measures, and session persistence for high-volume, dynamic web crawling. - -### Key Objectives -- **Anti-Bot Handling**: - - Implements stealth techniques to evade detection mechanisms used by modern websites. - - Simulates human-like behavior, such as mouse movements, scrolling, and key presses. - - Supports integration with third-party services to bypass CAPTCHA challenges. -- **Persistent Sessions**: - - Retains session data (cookies, local storage) for workflows requiring user authentication. - - Allows seamless continuation of tasks across multiple runs without re-authentication. -- **Scalable Crawling**: - - Optimized resource utilization for handling thousands of URLs concurrently. - - Flexible configuration options to tailor crawling behavior to specific requirements. - ---- - -## 2 Browser Creation Methods - -### Standard Browser Creation -Standard browser creation initializes a browser instance with default or minimal configurations. It is suitable for tasks that do not require session persistence or heavy customization. - -#### Features and Limitations -- **Features**: - - Quick and straightforward setup for small-scale tasks. - - Supports headless and headful modes. -- **Limitations**: - - Lacks advanced customization options like session reuse. - - May struggle with sites employing strict anti-bot measures. - -#### Example Usage -```python -from crawl4ai import AsyncWebCrawler, BrowserConfig - -browser_config = BrowserConfig(browser_type="chromium", headless=True) -async with AsyncWebCrawler(config=browser_config) as crawler: - result = await crawler.arun("https://crawl4ai.com") - print(result.markdown) -``` - -### Persistent Contexts -Persistent contexts create browser sessions with stored data, enabling workflows that require maintaining login states or other session-specific information. - -#### Benefits of Using `user_data_dir` -- **Session Persistence**: - - Stores cookies, local storage, and cache between crawling sessions. - - Reduces overhead for repetitive logins or multi-step workflows. -- **Enhanced Performance**: - - Leverages pre-loaded resources for faster page loading. -- **Flexibility**: - - Adapts to complex workflows requiring user-specific configurations. - -#### Example: Setting Up Persistent Contexts -```python -config = BrowserConfig(user_data_dir="/path/to/user/data") -async with AsyncWebCrawler(config=config) as crawler: - result = await crawler.arun("https://crawl4ai.com") - print(result.markdown) -``` - -### Managed Browser -The `ManagedBrowser` class offers a high-level abstraction for managing browser instances, emphasizing resource management, debugging capabilities, and anti-bot measures. - -#### How It Works -- **Browser Process Management**: - - Automates initialization and cleanup of browser processes. - - Optimizes resource usage by pooling and reusing browser instances. -- **Debugging Support**: - - Integrates with debugging tools like Chrome Developer Tools for real-time inspection. -- **Anti-Bot Measures**: - - Implements stealth plugins to mimic real user behavior and bypass bot detection. - -#### Features -- **Customizable Configurations**: - - Supports advanced options such as viewport resizing, proxy settings, and header manipulation. -- **Debugging and Logging**: - - Logs detailed browser interactions for debugging and performance analysis. -- **Scalability**: - - Handles multiple browser instances concurrently, scaling dynamically based on workload. - -#### Example: Using `ManagedBrowser` -```python -from crawl4ai import AsyncWebCrawler, BrowserConfig - -config = BrowserConfig(headless=False, debug_port=9222) -async with AsyncWebCrawler(config=config) as crawler: - result = await crawler.arun("https://crawl4ai.com") - print(result.markdown) -``` - ---- - -## 3 Context and Page Management - -### Creating and Configuring Browser Contexts -Browser contexts act as isolated environments within a single browser instance, enabling independent browsing sessions with their own cookies, cache, and storage. - -#### Customizations -- **Headers and Cookies**: - - Define custom headers to mimic specific devices or browsers. - - Set cookies for authenticated sessions. -- **Session Reuse**: - - Retain and reuse session data across multiple requests. - - Example: Preserve login states for authenticated crawls. - -#### Example: Context Initialization -```python -from crawl4ai import CrawlerRunConfig - -config = CrawlerRunConfig(headers={"User-Agent": "Crawl4AI/1.0"}) -async with AsyncWebCrawler() as crawler: - result = await crawler.arun("https://crawl4ai.com", config=config) - print(result.markdown) -``` - -### Creating Pages -Pages represent individual tabs or views within a browser context. They are responsible for rendering content, executing JavaScript, and handling user interactions. - -#### Key Features -- **IFrame Handling**: - - Extract content from embedded iframes. - - Navigate and interact with nested content. -- **Viewport Customization**: - - Adjust viewport size to match target device dimensions. -- **Lazy Loading**: - - Ensure dynamic elements are fully loaded before extraction. - -#### Example: Page Initialization -```python -config = CrawlerRunConfig(viewport_width=1920, viewport_height=1080) -async with AsyncWebCrawler() as crawler: - result = await crawler.arun("https://crawl4ai.com", config=config) - print(result.markdown) -``` - ---- - -## 4 Advanced Features and Best Practices - -### Debugging and Logging -Remote debugging provides a powerful way to troubleshoot complex crawling workflows. - -#### Example: Enabling Remote Debugging -```python -config = BrowserConfig(debug_port=9222) -async with AsyncWebCrawler(config=config) as crawler: - result = await crawler.arun("https://crawl4ai.com") -``` - -### Anti-Bot Techniques -- **Human Behavior Simulation**: - - Mimic real user actions, such as scrolling, clicking, and typing. - - Example: Use JavaScript to simulate interactions. -- **Captcha Handling**: - - Integrate with third-party services like 2Captcha or AntiCaptcha for automated solving. - -#### Example: Simulating User Actions -```python -js_code = """ -(async () => { - document.querySelector('input[name="search"]').value = 'test'; - document.querySelector('button[type="submit"]').click(); -})(); -""" -config = CrawlerRunConfig(js_code=[js_code]) -async with AsyncWebCrawler() as crawler: - result = await crawler.arun("https://crawl4ai.com", config=config) -``` - -### Optimizations for Performance and Scalability -- **Persistent Contexts**: - - Reuse browser contexts to minimize resource consumption. -- **Concurrent Crawls**: - - Use `arun_many` with a controlled semaphore count for efficient batch processing. - -#### Example: Scaling Crawls -```python -urls = ["https://example1.com", "https://example2.com"] -config = CrawlerRunConfig(semaphore_count=10) -async with AsyncWebCrawler() as crawler: - results = await crawler.arun_many(urls, config=config) - for result in results: - print(result.url, result.markdown) -``` diff --git a/docs/md_v2/advanced/multi-url-crawling.md b/docs/md_v2/advanced/multi-url-crawling.md new file mode 100644 index 00000000..a1d2b423 --- /dev/null +++ b/docs/md_v2/advanced/multi-url-crawling.md @@ -0,0 +1,264 @@ +# Optimized Multi-URL Crawling + +> **Note**: We’re developing a new **executor module** that uses a sophisticated algorithm to dynamically manage multi-URL crawling, optimizing for speed and memory usage. The approaches in this document remain fully valid, but keep an eye on **Crawl4AI**’s upcoming releases for this powerful feature! Follow [@unclecode](https://twitter.com/unclecode) on X and check the changelogs to stay updated. + + +Crawl4AI’s **AsyncWebCrawler** can handle multiple URLs in a single run, which can greatly reduce overhead and speed up crawling. This guide shows how to: + +1. **Sequentially** crawl a list of URLs using the **same** session, avoiding repeated browser creation. +2. **Parallel**-crawl subsets of URLs in batches, again reusing the same browser. + +When the entire process finishes, you close the browser once—**minimizing** memory and resource usage. + +--- + +## 1. Why Avoid Simple Loops per URL? + +If you naively do: + +```python +for url in urls: + async with AsyncWebCrawler() as crawler: + result = await crawler.arun(url) +``` + +You end up: + +1. Spinning up a **new** browser for each URL +2. Closing it immediately after the single crawl +3. Potentially using a lot of CPU/memory for short-living browsers +4. Missing out on session reusability if you have login or ongoing states + +**Better** approaches ensure you **create** the browser once, then crawl multiple URLs with minimal overhead. + +--- + +## 2. Sequential Crawling with Session Reuse + +### 2.1 Overview + +1. **One** `AsyncWebCrawler` instance for **all** URLs. +2. **One** session (via `session_id`) so we can preserve local storage or cookies across URLs if needed. +3. The crawler is only closed at the **end**. + +**This** is the simplest pattern if your workload is moderate (dozens to a few hundred URLs). + +### 2.2 Example Code + +```python +import asyncio +from typing import List +from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig +from crawl4ai.markdown_generation_strategy import DefaultMarkdownGenerator + +async def crawl_sequential(urls: List[str]): + print("\n=== Sequential Crawling with Session Reuse ===") + + browser_config = BrowserConfig( + headless=True, + # For better performance in Docker or low-memory environments: + extra_args=["--disable-gpu", "--disable-dev-shm-usage", "--no-sandbox"], + ) + + crawl_config = CrawlerRunConfig( + markdown_generator=DefaultMarkdownGenerator() + ) + + # Create the crawler (opens the browser) + crawler = AsyncWebCrawler(config=browser_config) + await crawler.start() + + try: + session_id = "session1" # Reuse the same session across all URLs + for url in urls: + result = await crawler.arun( + url=url, + config=crawl_config, + session_id=session_id + ) + if result.success: + print(f"Successfully crawled: {url}") + # E.g. check markdown length + print(f"Markdown length: {len(result.markdown_v2.raw_markdown)}") + else: + print(f"Failed: {url} - Error: {result.error_message}") + finally: + # After all URLs are done, close the crawler (and the browser) + await crawler.close() + +async def main(): + urls = [ + "https://example.com/page1", + "https://example.com/page2", + "https://example.com/page3" + ] + await crawl_sequential(urls) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +**Why It’s Good**: + +- **One** browser launch. +- Minimal memory usage. +- If the site requires login, you can log in once in `session_id` context and preserve auth across all URLs. + +--- + +## 3. Parallel Crawling with Browser Reuse + +### 3.1 Overview + +To speed up crawling further, you can crawl multiple URLs in **parallel** (batches or a concurrency limit). The crawler still uses **one** browser, but spawns different sessions (or the same, depending on your logic) for each task. + +### 3.2 Example Code + +For this example make sure to install the [psutil](https://pypi.org/project/psutil/) package. + +```bash +pip install psutil +``` + +Then you can run the following code: + +```python +import os +import sys +import psutil +import asyncio + +__location__ = os.path.dirname(os.path.abspath(__file__)) +__output__ = os.path.join(__location__, "output") + +# Append parent directory to system path +parent_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) +sys.path.append(parent_dir) + +from typing import List +from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode + +async def crawl_parallel(urls: List[str], max_concurrent: int = 3): + print("\n=== Parallel Crawling with Browser Reuse + Memory Check ===") + + # We'll keep track of peak memory usage across all tasks + peak_memory = 0 + process = psutil.Process(os.getpid()) + + def log_memory(prefix: str = ""): + nonlocal peak_memory + current_mem = process.memory_info().rss # in bytes + if current_mem > peak_memory: + peak_memory = current_mem + print(f"{prefix} Current Memory: {current_mem // (1024 * 1024)} MB, Peak: {peak_memory // (1024 * 1024)} MB") + + # Minimal browser config + browser_config = BrowserConfig( + headless=True, + verbose=False, # corrected from 'verbos=False' + extra_args=["--disable-gpu", "--disable-dev-shm-usage", "--no-sandbox"], + ) + crawl_config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS) + + # Create the crawler instance + crawler = AsyncWebCrawler(config=browser_config) + await crawler.start() + + try: + # We'll chunk the URLs in batches of 'max_concurrent' + success_count = 0 + fail_count = 0 + for i in range(0, len(urls), max_concurrent): + batch = urls[i : i + max_concurrent] + tasks = [] + + for j, url in enumerate(batch): + # Unique session_id per concurrent sub-task + session_id = f"parallel_session_{i + j}" + task = crawler.arun(url=url, config=crawl_config, session_id=session_id) + tasks.append(task) + + # Check memory usage prior to launching tasks + log_memory(prefix=f"Before batch {i//max_concurrent + 1}: ") + + # Gather results + results = await asyncio.gather(*tasks, return_exceptions=True) + + # Check memory usage after tasks complete + log_memory(prefix=f"After batch {i//max_concurrent + 1}: ") + + # Evaluate results + for url, result in zip(batch, results): + if isinstance(result, Exception): + print(f"Error crawling {url}: {result}") + fail_count += 1 + elif result.success: + success_count += 1 + else: + fail_count += 1 + + print(f"\nSummary:") + print(f" - Successfully crawled: {success_count}") + print(f" - Failed: {fail_count}") + + finally: + print("\nClosing crawler...") + await crawler.close() + # Final memory log + log_memory(prefix="Final: ") + print(f"\nPeak memory usage (MB): {peak_memory // (1024 * 1024)}") + +async def main(): + urls = [ + "https://example.com/page1", + "https://example.com/page2", + "https://example.com/page3", + "https://example.com/page4" + ] + await crawl_parallel(urls, max_concurrent=2) + +if __name__ == "__main__": + asyncio.run(main()) + +``` + +**Notes**: + +- We **reuse** the same `AsyncWebCrawler` instance for all parallel tasks, launching **one** browser. +- Each parallel sub-task might get its own `session_id` so they don’t share cookies/localStorage (unless that’s desired). +- We limit concurrency to `max_concurrent=2` or 3 to avoid saturating CPU/memory. + +--- + +## 4. Performance Tips + +1. **Extra Browser Args** + - `--disable-gpu`, `--no-sandbox` can help in Docker or restricted environments. + - `--disable-dev-shm-usage` avoids using `/dev/shm` which can be small on some systems. + +2. **Session Reuse** + - If your site requires a login or you want to maintain local data across URLs, share the **same** `session_id`. + - If you want isolation (each URL fresh), create unique sessions. + +3. **Batching** + - If you have **many** URLs (like thousands), you can do parallel crawling in chunks (like `max_concurrent=5`). + - Use `arun_many()` for a built-in approach if you prefer, but the example above is often more flexible. + +4. **Cache** + - If your pages share many resources or you’re re-crawling the same domain repeatedly, consider setting `cache_mode=CacheMode.ENABLED` in `CrawlerRunConfig`. + - If you need fresh data each time, keep `cache_mode=CacheMode.BYPASS`. + +5. **Hooks** + - You can set up global hooks for each crawler (like to block images) or per-run if you want. + - Keep them consistent if you’re reusing sessions. + +--- + +## 5. Summary + +- **One** `AsyncWebCrawler` + multiple calls to `.arun()` is far more efficient than launching a new crawler per URL. +- **Sequential** approach with a shared session is simple and memory-friendly for moderate sets of URLs. +- **Parallel** approach can speed up large crawls by concurrency, but keep concurrency balanced to avoid overhead. +- Close the crawler once at the end, ensuring the browser is only opened/closed once. + +For even more advanced memory optimizations or dynamic concurrency patterns, see future sections on hooking or distributed crawling. The patterns above suffice for the majority of multi-URL scenarios—**giving you speed, simplicity, and minimal resource usage**. Enjoy your optimized crawling! \ No newline at end of file diff --git a/docs/md_v2/advanced/proxy-security.md b/docs/md_v2/advanced/proxy-security.md index 8989777b..b98c17e5 100644 --- a/docs/md_v2/advanced/proxy-security.md +++ b/docs/md_v2/advanced/proxy-security.md @@ -1,6 +1,4 @@ -# Proxy & Security - -Configure proxy settings and enhance security features in Crawl4AI for reliable data extraction. +# Proxy ## Basic Proxy Setup @@ -58,38 +56,3 @@ async with AsyncWebCrawler(config=browser_config) as crawler: result = await crawler.arun(url=url, config=browser_config) ``` -## Custom Headers - -Add security-related headers via `BrowserConfig`: - -```python -from crawl4ai.async_configs import BrowserConfig - -headers = { - "X-Forwarded-For": "203.0.113.195", - "Accept-Language": "en-US,en;q=0.9", - "Cache-Control": "no-cache", - "Pragma": "no-cache" -} - -browser_config = BrowserConfig(headers=headers) -async with AsyncWebCrawler(config=browser_config) as crawler: - result = await crawler.arun(url="https://example.com") -``` - -## Combining with Magic Mode - -For maximum protection, combine proxy with Magic Mode via `CrawlerRunConfig` and `BrowserConfig`: - -```python -from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig - -browser_config = BrowserConfig( - proxy="http://proxy.example.com:8080", - headers={"Accept-Language": "en-US"} -) -crawler_config = CrawlerRunConfig(magic=True) # Enable all anti-detection features - -async with AsyncWebCrawler(config=browser_config) as crawler: - result = await crawler.arun(url="https://example.com", config=crawler_config) -``` diff --git a/docs/md_v2/advanced/session-management-advanced.md b/docs/md_v2/advanced/session-management-advanced.md deleted file mode 100644 index ba1ae0a0..00000000 --- a/docs/md_v2/advanced/session-management-advanced.md +++ /dev/null @@ -1,179 +0,0 @@ -### Session-Based Crawling for Dynamic Content - -In modern web applications, content is often loaded dynamically without changing the URL. Examples include "Load More" buttons, infinite scrolling, or paginated content that updates via JavaScript. Crawl4AI provides session-based crawling capabilities to handle such scenarios effectively. - -This guide explores advanced techniques for crawling dynamic content using Crawl4AI's session management features. - ---- - -## Understanding Session-Based Crawling - -Session-based crawling allows you to reuse a persistent browser session across multiple actions. This means the same browser tab (or page object) is used throughout, enabling: - -1. **Efficient handling of dynamic content** without reloading the page. -2. **JavaScript actions before and after crawling** (e.g., clicking buttons or scrolling). -3. **State maintenance** for authenticated sessions or multi-step workflows. -4. **Faster sequential crawling**, as it avoids reopening tabs or reallocating resources. - -**Note:** Session-based crawling is ideal for sequential operations, not parallel tasks. - ---- - -## Basic Concepts - -Before diving into examples, here are some key concepts: - -- **Session ID**: A unique identifier for a browsing session. Use the same `session_id` across multiple requests to maintain state. -- **BrowserConfig & CrawlerRunConfig**: These configuration objects control browser settings and crawling behavior. -- **JavaScript Execution**: Use `js_code` to perform actions like clicking buttons. -- **CSS Selectors**: Target specific elements for interaction or data extraction. -- **Extraction Strategy**: Define rules to extract structured data. -- **Wait Conditions**: Specify conditions to wait for before proceeding. - ---- - -## Example 1: Basic Session-Based Crawling - -A simple example using session-based crawling: - -```python -import asyncio -from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig -from crawl4ai.cache_context import CacheMode - -async def basic_session_crawl(): - async with AsyncWebCrawler() as crawler: - session_id = "dynamic_content_session" - url = "https://example.com/dynamic-content" - - for page in range(3): - config = CrawlerRunConfig( - url=url, - session_id=session_id, - js_code="document.querySelector('.load-more-button').click();" if page > 0 else None, - css_selector=".content-item", - cache_mode=CacheMode.BYPASS - ) - - result = await crawler.arun(config=config) - print(f"Page {page + 1}: Found {result.extracted_content.count('.content-item')} items") - - await crawler.crawler_strategy.kill_session(session_id) - -asyncio.run(basic_session_crawl()) -``` - -This example shows: -1. Reusing the same `session_id` across multiple requests. -2. Executing JavaScript to load more content dynamically. -3. Properly closing the session to free resources. - ---- - -## Advanced Technique 1: Custom Execution Hooks - -Use custom hooks to handle complex scenarios, such as waiting for content to load dynamically: - -```python -async def advanced_session_crawl_with_hooks(): - first_commit = "" - - async def on_execution_started(page): - nonlocal first_commit - try: - while True: - await page.wait_for_selector("li.commit-item h4") - commit = await page.query_selector("li.commit-item h4") - commit = await commit.evaluate("(element) => element.textContent").strip() - if commit and commit != first_commit: - first_commit = commit - break - await asyncio.sleep(0.5) - except Exception as e: - print(f"Warning: New content didn't appear: {e}") - - async with AsyncWebCrawler() as crawler: - session_id = "commit_session" - url = "https://github.com/example/repo/commits/main" - crawler.crawler_strategy.set_hook("on_execution_started", on_execution_started) - - js_next_page = """document.querySelector('a.pagination-next').click();""" - - for page in range(3): - config = CrawlerRunConfig( - url=url, - session_id=session_id, - js_code=js_next_page if page > 0 else None, - css_selector="li.commit-item", - js_only=page > 0, - cache_mode=CacheMode.BYPASS - ) - - result = await crawler.arun(config=config) - print(f"Page {page + 1}: Found {len(result.extracted_content)} commits") - - await crawler.crawler_strategy.kill_session(session_id) - -asyncio.run(advanced_session_crawl_with_hooks()) -``` - -This technique ensures new content loads before the next action. - ---- - -## Advanced Technique 2: Integrated JavaScript Execution and Waiting - -Combine JavaScript execution and waiting logic for concise handling of dynamic content: - -```python -async def integrated_js_and_wait_crawl(): - async with AsyncWebCrawler() as crawler: - session_id = "integrated_session" - url = "https://github.com/example/repo/commits/main" - - js_next_page_and_wait = """ - (async () => { - const getCurrentCommit = () => document.querySelector('li.commit-item h4').textContent.trim(); - const initialCommit = getCurrentCommit(); - document.querySelector('a.pagination-next').click(); - while (getCurrentCommit() === initialCommit) { - await new Promise(resolve => setTimeout(resolve, 100)); - } - })(); - """ - - for page in range(3): - config = CrawlerRunConfig( - url=url, - session_id=session_id, - js_code=js_next_page_and_wait if page > 0 else None, - css_selector="li.commit-item", - js_only=page > 0, - cache_mode=CacheMode.BYPASS - ) - - result = await crawler.arun(config=config) - print(f"Page {page + 1}: Found {len(result.extracted_content)} commits") - - await crawler.crawler_strategy.kill_session(session_id) - -asyncio.run(integrated_js_and_wait_crawl()) -``` - ---- - -## Best Practices for Session-Based Crawling - -1. **Unique Session IDs**: Assign descriptive and unique `session_id` values. -2. **Close Sessions**: Always clean up sessions with `kill_session` after use. -3. **Error Handling**: Anticipate and handle errors gracefully. -4. **Respect Websites**: Follow terms of service and robots.txt. -5. **Delays**: Add delays to avoid overwhelming servers. -6. **Optimize JavaScript**: Keep scripts concise for better performance. -7. **Monitor Resources**: Track memory and CPU usage for long sessions. - ---- - -## Conclusion - -Session-based crawling in Crawl4AI is a robust solution for handling dynamic content and multi-step workflows. By combining session management, JavaScript execution, and structured extraction strategies, you can effectively navigate and extract data from modern web applications. Always adhere to ethical web scraping practices and respect website policies. \ No newline at end of file diff --git a/docs/md_v2/advanced/session-management.md b/docs/md_v2/advanced/session-management.md index e9348223..180dfc85 100644 --- a/docs/md_v2/advanced/session-management.md +++ b/docs/md_v2/advanced/session-management.md @@ -1,4 +1,4 @@ -### Session Management +# Session Management Session management in Crawl4AI is a powerful feature that allows you to maintain state across multiple requests, making it particularly suitable for handling complex multi-step crawling tasks. It enables you to reuse the same browser tab (or page object) across sequential actions and crawls, which is beneficial for: @@ -20,8 +20,12 @@ async with AsyncWebCrawler() as crawler: session_id = "my_session" # Define configurations - config1 = CrawlerRunConfig(url="https://example.com/page1", session_id=session_id) - config2 = CrawlerRunConfig(url="https://example.com/page2", session_id=session_id) + config1 = CrawlerRunConfig( + url="https://example.com/page1", session_id=session_id + ) + config2 = CrawlerRunConfig( + url="https://example.com/page2", session_id=session_id + ) # First request result1 = await crawler.arun(config=config1) @@ -54,7 +58,9 @@ async def crawl_dynamic_content(): schema = { "name": "Commit Extractor", "baseSelector": "li.Box-sc-g0xbh4-0", - "fields": [{"name": "title", "selector": "h4.markdown-title", "type": "text"}], + "fields": [{ + "name": "title", "selector": "h4.markdown-title", "type": "text" + }], } extraction_strategy = JsonCssExtractionStrategy(schema) @@ -87,51 +93,146 @@ async def crawl_dynamic_content(): --- -#### Session Best Practices +## Example 1: Basic Session-Based Crawling -1. **Descriptive Session IDs**: - Use meaningful names for session IDs to organize workflows: - ```python - session_id = "login_flow_session" - session_id = "product_catalog_session" - ``` +A simple example using session-based crawling: -2. **Resource Management**: - Always ensure sessions are cleaned up to free resources: - ```python - try: - # Your crawling code here - pass - finally: - await crawler.crawler_strategy.kill_session(session_id) - ``` +```python +import asyncio +from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig +from crawl4ai.cache_context import CacheMode -3. **State Maintenance**: - Reuse the session for subsequent actions within the same workflow: - ```python - # Step 1: Login - login_config = CrawlerRunConfig( - url="https://example.com/login", - session_id=session_id, - js_code="document.querySelector('form').submit();" - ) - await crawler.arun(config=login_config) +async def basic_session_crawl(): + async with AsyncWebCrawler() as crawler: + session_id = "dynamic_content_session" + url = "https://example.com/dynamic-content" - # Step 2: Verify login success - dashboard_config = CrawlerRunConfig( - url="https://example.com/dashboard", - session_id=session_id, - wait_for="css:.user-profile" # Wait for authenticated content - ) - result = await crawler.arun(config=dashboard_config) - ``` + for page in range(3): + config = CrawlerRunConfig( + url=url, + session_id=session_id, + js_code="document.querySelector('.load-more-button').click();" if page > 0 else None, + css_selector=".content-item", + cache_mode=CacheMode.BYPASS + ) + + result = await crawler.arun(config=config) + print(f"Page {page + 1}: Found {result.extracted_content.count('.content-item')} items") + + await crawler.crawler_strategy.kill_session(session_id) + +asyncio.run(basic_session_crawl()) +``` + +This example shows: +1. Reusing the same `session_id` across multiple requests. +2. Executing JavaScript to load more content dynamically. +3. Properly closing the session to free resources. + +--- + +## Advanced Technique 1: Custom Execution Hooks + +> Warning: You might feel confused by the end of the next few examples 😅, so make sure you are comfortable with the order of the parts before you start this. + +Use custom hooks to handle complex scenarios, such as waiting for content to load dynamically: + +```python +async def advanced_session_crawl_with_hooks(): + first_commit = "" + + async def on_execution_started(page): + nonlocal first_commit + try: + while True: + await page.wait_for_selector("li.commit-item h4") + commit = await page.query_selector("li.commit-item h4") + commit = await commit.evaluate("(element) => element.textContent").strip() + if commit and commit != first_commit: + first_commit = commit + break + await asyncio.sleep(0.5) + except Exception as e: + print(f"Warning: New content didn't appear: {e}") + + async with AsyncWebCrawler() as crawler: + session_id = "commit_session" + url = "https://github.com/example/repo/commits/main" + crawler.crawler_strategy.set_hook("on_execution_started", on_execution_started) + + js_next_page = """document.querySelector('a.pagination-next').click();""" + + for page in range(3): + config = CrawlerRunConfig( + url=url, + session_id=session_id, + js_code=js_next_page if page > 0 else None, + css_selector="li.commit-item", + js_only=page > 0, + cache_mode=CacheMode.BYPASS + ) + + result = await crawler.arun(config=config) + print(f"Page {page + 1}: Found {len(result.extracted_content)} commits") + + await crawler.crawler_strategy.kill_session(session_id) + +asyncio.run(advanced_session_crawl_with_hooks()) +``` + +This technique ensures new content loads before the next action. + +--- + +## Advanced Technique 2: Integrated JavaScript Execution and Waiting + +Combine JavaScript execution and waiting logic for concise handling of dynamic content: + +```python +async def integrated_js_and_wait_crawl(): + async with AsyncWebCrawler() as crawler: + session_id = "integrated_session" + url = "https://github.com/example/repo/commits/main" + + js_next_page_and_wait = """ + (async () => { + const getCurrentCommit = () => document.querySelector('li.commit-item h4').textContent.trim(); + const initialCommit = getCurrentCommit(); + document.querySelector('a.pagination-next').click(); + while (getCurrentCommit() === initialCommit) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + })(); + """ + + for page in range(3): + config = CrawlerRunConfig( + url=url, + session_id=session_id, + js_code=js_next_page_and_wait if page > 0 else None, + css_selector="li.commit-item", + js_only=page > 0, + cache_mode=CacheMode.BYPASS + ) + + result = await crawler.arun(config=config) + print(f"Page {page + 1}: Found {len(result.extracted_content)} commits") + + await crawler.crawler_strategy.kill_session(session_id) + +asyncio.run(integrated_js_and_wait_crawl()) +``` --- #### Common Use Cases for Sessions -1. **Authentication Flows**: Login and interact with secured pages. -2. **Pagination Handling**: Navigate through multiple pages. -3. **Form Submissions**: Fill forms, submit, and process results. -4. **Multi-step Processes**: Complete workflows that span multiple actions. -5. **Dynamic Content Navigation**: Handle JavaScript-rendered or event-triggered content. +1. **Authentication Flows**: Login and interact with secured pages. + +2. **Pagination Handling**: Navigate through multiple pages. + +3. **Form Submissions**: Fill forms, submit, and process results. + +4. **Multi-step Processes**: Complete workflows that span multiple actions. + +5. **Dynamic Content Navigation**: Handle JavaScript-rendered or event-triggered content. diff --git a/docs/md_v2/advanced/ssl-certificate.md b/docs/md_v2/advanced/ssl-certificate.md new file mode 100644 index 00000000..fa04716a --- /dev/null +++ b/docs/md_v2/advanced/ssl-certificate.md @@ -0,0 +1,179 @@ +# `SSLCertificate` Reference + +The **`SSLCertificate`** class encapsulates an SSL certificate’s data and allows exporting it in various formats (PEM, DER, JSON, or text). It’s used within **Crawl4AI** whenever you set **`fetch_ssl_certificate=True`** in your **`CrawlerRunConfig`**. + +## 1. Overview + +**Location**: `crawl4ai/ssl_certificate.py` + +```python +class SSLCertificate: + """ + Represents an SSL certificate with methods to export in various formats. + + Main Methods: + - from_url(url, timeout=10) + - from_file(file_path) + - from_binary(binary_data) + - to_json(filepath=None) + - to_pem(filepath=None) + - to_der(filepath=None) + ... + + Common Properties: + - issuer + - subject + - valid_from + - valid_until + - fingerprint + """ +``` + +### Typical Use Case +1. You **enable** certificate fetching in your crawl by: + ```python + CrawlerRunConfig(fetch_ssl_certificate=True, ...) + ``` +2. After `arun()`, if `result.ssl_certificate` is present, it’s an instance of **`SSLCertificate`**. +3. You can **read** basic properties (issuer, subject, validity) or **export** them in multiple formats. + +--- + +## 2. Construction & Fetching + +### 2.1 **`from_url(url, timeout=10)`** +Manually load an SSL certificate from a given URL (port 443). Typically used internally, but you can call it directly if you want: + +```python +cert = SSLCertificate.from_url("https://example.com") +if cert: + print("Fingerprint:", cert.fingerprint) +``` + +### 2.2 **`from_file(file_path)`** +Load from a file containing certificate data in ASN.1 or DER. Rarely needed unless you have local cert files: + +```python +cert = SSLCertificate.from_file("/path/to/cert.der") +``` + +### 2.3 **`from_binary(binary_data)`** +Initialize from raw binary. E.g., if you captured it from a socket or another source: + +```python +cert = SSLCertificate.from_binary(raw_bytes) +``` + +--- + +## 3. Common Properties + +After obtaining a **`SSLCertificate`** instance (e.g. `result.ssl_certificate` from a crawl), you can read: + +1. **`issuer`** *(dict)* + - E.g. `{"CN": "My Root CA", "O": "..."}` +2. **`subject`** *(dict)* + - E.g. `{"CN": "example.com", "O": "ExampleOrg"}` +3. **`valid_from`** *(str)* + - NotBefore date/time. Often in ASN.1/UTC format. +4. **`valid_until`** *(str)* + - NotAfter date/time. +5. **`fingerprint`** *(str)* + - The SHA-256 digest (lowercase hex). + - E.g. `"d14d2e..."` + +--- + +## 4. Export Methods + +Once you have a **`SSLCertificate`** object, you can **export** or **inspect** it: + +### 4.1 **`to_json(filepath=None)` → `Optional[str]`** +- Returns a JSON string containing the parsed certificate fields. +- If `filepath` is provided, saves it to disk instead, returning `None`. + +**Usage**: +```python +json_data = cert.to_json() # returns JSON string +cert.to_json("certificate.json") # writes file, returns None +``` + +### 4.2 **`to_pem(filepath=None)` → `Optional[str]`** +- Returns a PEM-encoded string (common for web servers). +- If `filepath` is provided, saves it to disk instead. + +```python +pem_str = cert.to_pem() # in-memory PEM string +cert.to_pem("/path/to/cert.pem") # saved to file +``` + +### 4.3 **`to_der(filepath=None)` → `Optional[bytes]`** +- Returns the original DER (binary ASN.1) bytes. +- If `filepath` is specified, writes the bytes there instead. + +```python +der_bytes = cert.to_der() +cert.to_der("certificate.der") +``` + +### 4.4 (Optional) **`export_as_text()`** +- If you see a method like `export_as_text()`, it typically returns an OpenSSL-style textual representation. +- Not always needed, but can help for debugging or manual inspection. + +--- + +## 5. Example Usage in Crawl4AI + +Below is a minimal sample showing how the crawler obtains an SSL cert from a site, then reads or exports it. The code snippet: + +```python +import asyncio +import os +from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode + +async def main(): + tmp_dir = "tmp" + os.makedirs(tmp_dir, exist_ok=True) + + config = CrawlerRunConfig( + fetch_ssl_certificate=True, + cache_mode=CacheMode.BYPASS + ) + + async with AsyncWebCrawler() as crawler: + result = await crawler.arun("https://example.com", config=config) + if result.success and result.ssl_certificate: + cert = result.ssl_certificate + # 1. Basic Info + print("Issuer CN:", cert.issuer.get("CN", "")) + print("Valid until:", cert.valid_until) + print("Fingerprint:", cert.fingerprint) + + # 2. Export + cert.to_json(os.path.join(tmp_dir, "certificate.json")) + cert.to_pem(os.path.join(tmp_dir, "certificate.pem")) + cert.to_der(os.path.join(tmp_dir, "certificate.der")) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +--- + +## 6. Notes & Best Practices + +1. **Timeout**: `SSLCertificate.from_url` internally uses a default **10s** socket connect and wraps SSL. +2. **Binary Form**: The certificate is loaded in ASN.1 (DER) form, then re-parsed by `OpenSSL.crypto`. +3. **Validation**: This does **not** validate the certificate chain or trust store. It only fetches and parses. +4. **Integration**: Within Crawl4AI, you typically just set `fetch_ssl_certificate=True` in `CrawlerRunConfig`; the final result’s `ssl_certificate` is automatically built. +5. **Export**: If you need to store or analyze a cert, the `to_json` and `to_pem` are quite universal. + +--- + +### Summary + +- **`SSLCertificate`** is a convenience class for capturing and exporting the **TLS certificate** from your crawled site(s). +- Common usage is in the **`CrawlResult.ssl_certificate`** field, accessible after setting `fetch_ssl_certificate=True`. +- Offers quick access to essential certificate details (`issuer`, `subject`, `fingerprint`) and is easy to export (PEM, DER, JSON) for further analysis or server usage. + +Use it whenever you need **insight** into a site’s certificate or require some form of cryptographic or compliance check. \ No newline at end of file diff --git a/docs/md_v2/api/arun.md b/docs/md_v2/api/arun.md index 509991e5..d1d5eae9 100644 --- a/docs/md_v2/api/arun.md +++ b/docs/md_v2/api/arun.md @@ -1,244 +1,305 @@ -# Complete Parameter Guide for arun() +Below is a **revised parameter guide** for **`arun()`** in **AsyncWebCrawler**, reflecting the **new** approach where all parameters are passed via a **`CrawlerRunConfig`** instead of directly to `arun()`. Each section includes example usage in the new style, ensuring a clear, modern approach. -The following parameters can be passed to the `arun()` method. They are organized by their primary usage context and functionality. +--- -## Core Parameters +# `arun()` Parameter Guide (New Approach) + +In Crawl4AI’s **latest** configuration model, nearly all parameters that once went directly to `arun()` are now part of **`CrawlerRunConfig`**. When calling `arun()`, you provide: ```python await crawler.arun( - url="https://example.com", # Required: URL to crawl - verbose=True, # Enable detailed logging - cache_mode=CacheMode.ENABLED, # Control cache behavior - warmup=True # Whether to run warmup check + url="https://example.com", + config=my_run_config ) ``` -## Cache Control +Below is an organized look at the parameters that can go inside `CrawlerRunConfig`, divided by their functional areas. For **Browser** settings (e.g., `headless`, `browser_type`), see [BrowserConfig](./parameters.md). + +--- + +## 1. Core Usage ```python -from crawl4ai import CacheMode +from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode -await crawler.arun( - cache_mode=CacheMode.ENABLED, # Normal caching (read/write) - # Other cache modes: - # cache_mode=CacheMode.DISABLED # No caching at all - # cache_mode=CacheMode.READ_ONLY # Only read from cache - # cache_mode=CacheMode.WRITE_ONLY # Only write to cache - # cache_mode=CacheMode.BYPASS # Skip cache for this operation +async def main(): + run_config = CrawlerRunConfig( + verbose=True, # Detailed logging + cache_mode=CacheMode.ENABLED, # Use normal read/write cache + # ... other parameters + ) + + async with AsyncWebCrawler() as crawler: + result = await crawler.arun( + url="https://example.com", + config=run_config + ) + print(result.cleaned_html[:500]) + +``` + +**Key Fields**: +- `verbose=True` logs each crawl step. +- `cache_mode` decides how to read/write the local crawl cache. + +--- + +## 2. Cache Control + +**`cache_mode`** (default: `CacheMode.ENABLED`) +Use a built-in enum from `CacheMode`: +- `ENABLED`: Normal caching—reads if available, writes if missing. +- `DISABLED`: No caching—always refetch pages. +- `READ_ONLY`: Reads from cache only; no new writes. +- `WRITE_ONLY`: Writes to cache but doesn’t read existing data. +- `BYPASS`: Skips reading cache for this crawl (though it might still write if set up that way). + +```python +run_config = CrawlerRunConfig( + cache_mode=CacheMode.BYPASS ) ``` -## Content Processing Parameters +**Additional flags**: +- `bypass_cache=True` acts like `CacheMode.BYPASS`. +- `disable_cache=True` acts like `CacheMode.DISABLED`. +- `no_cache_read=True` acts like `CacheMode.WRITE_ONLY`. +- `no_cache_write=True` acts like `CacheMode.READ_ONLY`. + +--- + +## 3. Content Processing & Selection + +### 3.1 Text Processing -### Text Processing ```python -await crawler.arun( - word_count_threshold=10, # Minimum words per content block - image_description_min_word_threshold=5, # Minimum words for image descriptions - only_text=False, # Extract only text content - excluded_tags=['form', 'nav'], # HTML tags to exclude - keep_data_attributes=False, # Preserve data-* attributes +run_config = CrawlerRunConfig( + word_count_threshold=10, # Ignore text blocks <10 words + only_text=False, # If True, tries to remove non-text elements + keep_data_attributes=False # Keep or discard data-* attributes ) ``` -### Content Selection +### 3.2 Content Selection + ```python -await crawler.arun( - css_selector=".main-content", # CSS selector for content extraction - remove_forms=True, # Remove all form elements - remove_overlay_elements=True, # Remove popups/modals/overlays +run_config = CrawlerRunConfig( + css_selector=".main-content", # Focus on .main-content region only + excluded_tags=["form", "nav"], # Remove entire tag blocks + remove_forms=True, # Specifically strip
elements + remove_overlay_elements=True, # Attempt to remove modals/popups ) ``` -### Link Handling +### 3.3 Link Handling + ```python -await crawler.arun( - exclude_external_links=True, # Remove external links - exclude_social_media_links=True, # Remove social media links - exclude_external_images=True, # Remove external images - exclude_domains=["ads.example.com"], # Specific domains to exclude - social_media_domains=[ # Additional social media domains - "facebook.com", - "twitter.com", - "instagram.com" - ] +run_config = CrawlerRunConfig( + exclude_external_links=True, # Remove external links from final content + exclude_social_media_links=True, # Remove links to known social sites + exclude_domains=["ads.example.com"], # Exclude links to these domains + exclude_social_media_domains=["facebook.com","twitter.com"], # Extend the default list ) ``` -## Browser Control Parameters +### 3.4 Media Filtering -### Basic Browser Settings ```python -await crawler.arun( - headless=True, # Run browser in headless mode - browser_type="chromium", # Browser engine: "chromium", "firefox", "webkit" - page_timeout=60000, # Page load timeout in milliseconds - user_agent="custom-agent", # Custom user agent +run_config = CrawlerRunConfig( + exclude_external_images=True # Strip images from other domains ) ``` -### Navigation and Waiting +--- + +## 4. Page Navigation & Timing + +### 4.1 Basic Browser Flow + ```python -await crawler.arun( - wait_for="css:.dynamic-content", # Wait for element/condition - delay_before_return_html=2.0, # Wait before returning HTML (seconds) +run_config = CrawlerRunConfig( + wait_for="css:.dynamic-content", # Wait for .dynamic-content + delay_before_return_html=2.0, # Wait 2s before capturing final HTML + page_timeout=60000, # Navigation & script timeout (ms) ) ``` -### JavaScript Execution +**Key Fields**: +- `wait_for`: + - `"css:selector"` or + - `"js:() => boolean"` + e.g. `js:() => document.querySelectorAll('.item').length > 10`. + +- `mean_delay` & `max_range`: define random delays for `arun_many()` calls. +- `semaphore_count`: concurrency limit when crawling multiple URLs. + +### 4.2 JavaScript Execution + ```python -await crawler.arun( - js_code=[ # JavaScript to execute (string or list) +run_config = CrawlerRunConfig( + js_code=[ "window.scrollTo(0, document.body.scrollHeight);", - "document.querySelector('.load-more').click();" + "document.querySelector('.load-more')?.click();" ], - js_only=False, # Only execute JavaScript without reloading page + js_only=False ) ``` -### Anti-Bot Features +- `js_code` can be a single string or a list of strings. +- `js_only=True` means “I’m continuing in the same session with new JS steps, no new full navigation.” + +### 4.3 Anti-Bot + ```python -await crawler.arun( - magic=True, # Enable all anti-detection features - simulate_user=True, # Simulate human behavior - override_navigator=True # Override navigator properties +run_config = CrawlerRunConfig( + magic=True, + simulate_user=True, + override_navigator=True +) +``` +- `magic=True` tries multiple stealth features. +- `simulate_user=True` mimics mouse movements or random delays. +- `override_navigator=True` fakes some navigator properties (like user agent checks). + +--- + +## 5. Session Management + +**`session_id`**: +```python +run_config = CrawlerRunConfig( + session_id="my_session123" +) +``` +If re-used in subsequent `arun()` calls, the same tab/page context is continued (helpful for multi-step tasks or stateful browsing). + +--- + +## 6. Screenshot, PDF & Media Options + +```python +run_config = CrawlerRunConfig( + screenshot=True, # Grab a screenshot as base64 + screenshot_wait_for=1.0, # Wait 1s before capturing + pdf=True, # Also produce a PDF + image_description_min_word_threshold=5, # If analyzing alt text + image_score_threshold=3, # Filter out low-score images +) +``` +**Where they appear**: +- `result.screenshot` → Base64 screenshot string. +- `result.pdf` → Byte array with PDF data. + +--- + +## 7. Extraction Strategy + +**For advanced data extraction** (CSS/LLM-based), set `extraction_strategy`: + +```python +run_config = CrawlerRunConfig( + extraction_strategy=my_css_or_llm_strategy ) ``` -### Session Management -```python -await crawler.arun( - session_id="my_session", # Session identifier for persistent browsing -) -``` +The extracted data will appear in `result.extracted_content`. -### Screenshot Options -```python -await crawler.arun( - screenshot=True, # Take page screenshot - screenshot_wait_for=2.0, # Wait before screenshot (seconds) -) -``` +--- + +## 8. Comprehensive Example + +Below is a snippet combining many parameters: -### Proxy Configuration ```python -await crawler.arun( - proxy="http://proxy.example.com:8080", # Simple proxy URL - proxy_config={ # Advanced proxy settings - "server": "http://proxy.example.com:8080", - "username": "user", - "password": "pass" +import asyncio +from crawl4ai import AsyncWebCrawler, CrawlerRunConfig, CacheMode +from crawl4ai.extraction_strategy import JsonCssExtractionStrategy + +async def main(): + # Example schema + schema = { + "name": "Articles", + "baseSelector": "article.post", + "fields": [ + {"name": "title", "selector": "h2", "type": "text"}, + {"name": "link", "selector": "a", "type": "attribute", "attribute": "href"} + ] } -) -``` -## Content Extraction Parameters - -### Extraction Strategy -```python -await crawler.arun( - extraction_strategy=LLMExtractionStrategy( - provider="ollama/llama2", - schema=MySchema.schema(), - instruction="Extract specific data" + run_config = CrawlerRunConfig( + # Core + verbose=True, + cache_mode=CacheMode.ENABLED, + + # Content + word_count_threshold=10, + css_selector="main.content", + excluded_tags=["nav", "footer"], + exclude_external_links=True, + + # Page & JS + js_code="document.querySelector('.show-more')?.click();", + wait_for="css:.loaded-block", + page_timeout=30000, + + # Extraction + extraction_strategy=JsonCssExtractionStrategy(schema), + + # Session + session_id="persistent_session", + + # Media + screenshot=True, + pdf=True, + + # Anti-bot + simulate_user=True, + magic=True, ) -) + + async with AsyncWebCrawler() as crawler: + result = await crawler.arun("https://example.com/posts", config=run_config) + if result.success: + print("HTML length:", len(result.cleaned_html)) + print("Extraction JSON:", result.extracted_content) + if result.screenshot: + print("Screenshot length:", len(result.screenshot)) + if result.pdf: + print("PDF bytes length:", len(result.pdf)) + else: + print("Error:", result.error_message) + +if __name__ == "__main__": + asyncio.run(main()) ``` -### Chunking Strategy -```python -await crawler.arun( - chunking_strategy=RegexChunking( - patterns=[r'\n\n', r'\.\s+'] - ) -) -``` +**What we covered**: +1. **Crawling** the main content region, ignoring external links. +2. Running **JavaScript** to click “.show-more”. +3. **Waiting** for “.loaded-block” to appear. +4. Generating a **screenshot** & **PDF** of the final page. +5. Extracting repeated “article.post” elements with a **CSS-based** extraction strategy. -### HTML to Text Options -```python -await crawler.arun( - html2text={ - "ignore_links": False, - "ignore_images": False, - "escape_dot": False, - "body_width": 0, - "protect_links": True, - "unicode_snob": True - } -) -``` +--- -## Debug Options -```python -await crawler.arun( - log_console=True, # Log browser console messages -) -``` +## 9. Best Practices -## Parameter Interactions and Notes +1. **Use `BrowserConfig` for global browser** settings (headless, user agent). +2. **Use `CrawlerRunConfig`** to handle the **specific** crawl needs: content filtering, caching, JS, screenshot, extraction, etc. +3. Keep your **parameters consistent** in run configs—especially if you’re part of a large codebase with multiple crawls. +4. **Limit** large concurrency (`semaphore_count`) if the site or your system can’t handle it. +5. For dynamic pages, set `js_code` or `scan_full_page` so you load all content. -1. **Cache and Performance Setup** - ```python - # Optimal caching for repeated crawls - await crawler.arun( - cache_mode=CacheMode.ENABLED, - word_count_threshold=10, - process_iframes=False - ) - ``` +--- -2. **Dynamic Content Handling** - ```python - # Handle lazy-loaded content - await crawler.arun( - js_code="window.scrollTo(0, document.body.scrollHeight);", - wait_for="css:.lazy-content", - delay_before_return_html=2.0, - cache_mode=CacheMode.WRITE_ONLY # Cache results after dynamic load - ) - ``` +## 10. Conclusion -3. **Content Extraction Pipeline** - ```python - # Complete extraction setup - await crawler.arun( - css_selector=".main-content", - word_count_threshold=20, - extraction_strategy=my_strategy, - chunking_strategy=my_chunking, - process_iframes=True, - remove_overlay_elements=True, - cache_mode=CacheMode.ENABLED - ) - ``` +All parameters that used to be direct arguments to `arun()` now belong in **`CrawlerRunConfig`**. This approach: -## Best Practices +- Makes code **clearer** and **more maintainable**. +- Minimizes confusion about which arguments affect global vs. per-crawl behavior. +- Allows you to create **reusable** config objects for different pages or tasks. -1. **Performance Optimization** - ```python - await crawler.arun( - cache_mode=CacheMode.ENABLED, # Use full caching - word_count_threshold=10, # Filter out noise - process_iframes=False # Skip iframes if not needed - ) - ``` +For a **full** reference, check out the [CrawlerRunConfig Docs](./parameters.md). -2. **Reliable Scraping** - ```python - await crawler.arun( - magic=True, # Enable anti-detection - delay_before_return_html=1.0, # Wait for dynamic content - page_timeout=60000, # Longer timeout for slow pages - cache_mode=CacheMode.WRITE_ONLY # Cache results after successful crawl - ) - ``` - -3. **Clean Content** - ```python - await crawler.arun( - remove_overlay_elements=True, # Remove popups - excluded_tags=['nav', 'aside'],# Remove unnecessary elements - keep_data_attributes=False, # Remove data attributes - cache_mode=CacheMode.ENABLED # Use cache for faster processing - ) - ``` \ No newline at end of file +Happy crawling with your **structured, flexible** config approach! \ No newline at end of file diff --git a/docs/md_v2/api/async-webcrawler.md b/docs/md_v2/api/async-webcrawler.md index be956101..51a6ccce 100644 --- a/docs/md_v2/api/async-webcrawler.md +++ b/docs/md_v2/api/async-webcrawler.md @@ -1,320 +1,283 @@ +Below is the **updated** guide for the **AsyncWebCrawler** class, reflecting the **new** recommended approach of configuring the browser via **`BrowserConfig`** and each crawl via **`CrawlerRunConfig`**. While the crawler still accepts legacy parameters for backward compatibility, the modern, maintainable way is shown below. + +--- + # AsyncWebCrawler -The `AsyncWebCrawler` class is the main interface for web crawling operations. It provides asynchronous web crawling capabilities with extensive configuration options. +The **`AsyncWebCrawler`** is the core class for asynchronous web crawling in Crawl4AI. You typically create it **once**, optionally customize it with a **`BrowserConfig`** (e.g., headless, user agent), then **run** multiple **`arun()`** calls with different **`CrawlerRunConfig`** objects. -## Constructor +**Recommended usage**: +1. **Create** a `BrowserConfig` for global browser settings. +2. **Instantiate** `AsyncWebCrawler(config=browser_config)`. +3. **Use** the crawler in an async context manager (`async with`) or manage start/close manually. +4. **Call** `arun(url, config=crawler_run_config)` for each page you want. + +--- + +## 1. Constructor Overview ```python -AsyncWebCrawler( - # Browser Settings - browser_type: str = "chromium", # Options: "chromium", "firefox", "webkit" - headless: bool = True, # Run browser in headless mode - verbose: bool = False, # Enable verbose logging - - # Cache Settings - always_by_pass_cache: bool = False, # Always bypass cache - base_directory: str = str(os.getenv("CRAWL4_AI_BASE_DIRECTORY", Path.home())), # Base directory for cache - - # Network Settings - proxy: str = None, # Simple proxy URL - proxy_config: Dict = None, # Advanced proxy configuration - - # Browser Behavior - sleep_on_close: bool = False, # Wait before closing browser - - # Custom Settings - user_agent: str = None, # Custom user agent - headers: Dict[str, str] = {}, # Custom HTTP headers - js_code: Union[str, List[str]] = None, # Default JavaScript to execute -) +class AsyncWebCrawler: + def __init__( + self, + crawler_strategy: Optional[AsyncCrawlerStrategy] = None, + config: Optional[BrowserConfig] = None, + always_bypass_cache: bool = False, # deprecated + always_by_pass_cache: Optional[bool] = None, # also deprecated + base_directory: str = ..., + thread_safe: bool = False, + **kwargs, + ): + """ + Create an AsyncWebCrawler instance. + + Args: + crawler_strategy: (Advanced) Provide a custom crawler strategy if needed. + config: A BrowserConfig object specifying how the browser is set up. + always_bypass_cache: (Deprecated) Use CrawlerRunConfig.cache_mode instead. + base_directory: Folder for storing caches/logs (if relevant). + thread_safe: If True, attempts some concurrency safeguards. Usually False. + **kwargs: Additional legacy or debugging parameters. + """ ``` -### Parameters in Detail +### Typical Initialization -#### Browser Settings +```python +from crawl4ai import AsyncWebCrawler, BrowserConfig -- **browser_type** (str, optional) - - Default: `"chromium"` - - Options: `"chromium"`, `"firefox"`, `"webkit"` - - Controls which browser engine to use - ```python - # Example: Using Firefox - crawler = AsyncWebCrawler(browser_type="firefox") - ``` +browser_cfg = BrowserConfig( + browser_type="chromium", + headless=True, + verbose=True +) -- **headless** (bool, optional) - - Default: `True` - - When `True`, browser runs without GUI - - Set to `False` for debugging - ```python - # Visible browser for debugging - crawler = AsyncWebCrawler(headless=False) - ``` +crawler = AsyncWebCrawler(config=browser_cfg) +``` -- **verbose** (bool, optional) - - Default: `False` - - Enables detailed logging - ```python - # Enable detailed logging - crawler = AsyncWebCrawler(verbose=True) - ``` +**Notes**: +- **Legacy** parameters like `always_bypass_cache` remain for backward compatibility, but prefer to set **caching** in `CrawlerRunConfig`. -#### Cache Settings +--- -- **always_by_pass_cache** (bool, optional) - - Default: `False` - - When `True`, always fetches fresh content - ```python - # Always fetch fresh content - crawler = AsyncWebCrawler(always_by_pass_cache=True) - ``` +## 2. Lifecycle: Start/Close or Context Manager -- **base_directory** (str, optional) - - Default: User's home directory - - Base path for cache storage - ```python - # Custom cache directory - crawler = AsyncWebCrawler(base_directory="/path/to/cache") - ``` +### 2.1 Context Manager (Recommended) -#### Network Settings +```python +async with AsyncWebCrawler(config=browser_cfg) as crawler: + result = await crawler.arun("https://example.com") + # The crawler automatically starts/closes resources +``` -- **proxy** (str, optional) - - Simple proxy URL - ```python - # Using simple proxy - crawler = AsyncWebCrawler(proxy="http://proxy.example.com:8080") - ``` +When the `async with` block ends, the crawler cleans up (closes the browser, etc.). -- **proxy_config** (Dict, optional) - - Advanced proxy configuration with authentication - ```python - # Advanced proxy with auth - crawler = AsyncWebCrawler(proxy_config={ - "server": "http://proxy.example.com:8080", - "username": "user", - "password": "pass" - }) - ``` +### 2.2 Manual Start & Close -#### Browser Behavior +```python +crawler = AsyncWebCrawler(config=browser_cfg) +await crawler.start() -- **sleep_on_close** (bool, optional) - - Default: `False` - - Adds delay before closing browser - ```python - # Wait before closing - crawler = AsyncWebCrawler(sleep_on_close=True) - ``` +result1 = await crawler.arun("https://example.com") +result2 = await crawler.arun("https://another.com") -#### Custom Settings +await crawler.close() +``` -- **user_agent** (str, optional) - - Custom user agent string - ```python - # Custom user agent - crawler = AsyncWebCrawler( - user_agent="Mozilla/5.0 (Custom Agent) Chrome/90.0" - ) - ``` +Use this style if you have a **long-running** application or need full control of the crawler’s lifecycle. -- **headers** (Dict[str, str], optional) - - Custom HTTP headers - ```python - # Custom headers - crawler = AsyncWebCrawler( - headers={ - "Accept-Language": "en-US", - "Custom-Header": "Value" - } - ) - ``` +--- -- **js_code** (Union[str, List[str]], optional) - - Default JavaScript to execute on each page - ```python - # Default JavaScript - crawler = AsyncWebCrawler( - js_code=[ - "window.scrollTo(0, document.body.scrollHeight);", - "document.querySelector('.load-more').click();" - ] - ) - ``` - -## Methods - -### arun() - -The primary method for crawling web pages. +## 3. Primary Method: `arun()` ```python async def arun( - # Required - url: str, # URL to crawl - - # Content Selection - css_selector: str = None, # CSS selector for content - word_count_threshold: int = 10, # Minimum words per block - - # Cache Control - bypass_cache: bool = False, # Bypass cache for this request - - # Session Management - session_id: str = None, # Session identifier - - # Screenshot Options - screenshot: bool = False, # Take screenshot - screenshot_wait_for: float = None, # Wait before screenshot - - # Content Processing - process_iframes: bool = False, # Process iframe content - remove_overlay_elements: bool = False, # Remove popups/modals - - # Anti-Bot Settings - simulate_user: bool = False, # Simulate human behavior - override_navigator: bool = False, # Override navigator properties - magic: bool = False, # Enable all anti-detection - - # Content Filtering - excluded_tags: List[str] = None, # HTML tags to exclude - exclude_external_links: bool = False, # Remove external links - exclude_social_media_links: bool = False, # Remove social media links - - # JavaScript Handling - js_code: Union[str, List[str]] = None, # JavaScript to execute - wait_for: str = None, # Wait condition - - # Page Loading - page_timeout: int = 60000, # Page load timeout (ms) - delay_before_return_html: float = None, # Wait before return - - # Extraction - extraction_strategy: ExtractionStrategy = None # Extraction strategy + self, + url: str, + config: Optional[CrawlerRunConfig] = None, + # Legacy parameters for backward compatibility... ) -> CrawlResult: + ... ``` -### Usage Examples +### 3.1 New Approach -#### Basic Crawling -```python -async with AsyncWebCrawler() as crawler: - result = await crawler.arun(url="https://example.com") -``` - -#### Advanced Crawling -```python -async with AsyncWebCrawler( - browser_type="firefox", - verbose=True, - headers={"Custom-Header": "Value"} -) as crawler: - result = await crawler.arun( - url="https://example.com", - css_selector=".main-content", - word_count_threshold=20, - process_iframes=True, - magic=True, - wait_for="css:.dynamic-content", - screenshot=True - ) -``` - -#### Session Management -```python -async with AsyncWebCrawler() as crawler: - # First request - result1 = await crawler.arun( - url="https://example.com/login", - session_id="my_session" - ) - - # Subsequent request using same session - result2 = await crawler.arun( - url="https://example.com/protected", - session_id="my_session" - ) -``` - -## Context Manager - -AsyncWebCrawler implements the async context manager protocol: +You pass a `CrawlerRunConfig` object that sets up everything about a crawl—content filtering, caching, session reuse, JS code, screenshots, etc. ```python -async def __aenter__(self) -> 'AsyncWebCrawler': - # Initialize browser and resources - return self +import asyncio +from crawl4ai import CrawlerRunConfig, CacheMode -async def __aexit__(self, *args): - # Cleanup resources - pass -``` - -Always use AsyncWebCrawler with async context manager: -```python -async with AsyncWebCrawler() as crawler: - # Your crawling code here - pass -``` - -## Best Practices - -1. **Resource Management** -```python -# Always use context manager -async with AsyncWebCrawler() as crawler: - # Crawler will be properly cleaned up - pass -``` - -2. **Error Handling** -```python -try: - async with AsyncWebCrawler() as crawler: - result = await crawler.arun(url="https://example.com") - if not result.success: - print(f"Crawl failed: {result.error_message}") -except Exception as e: - print(f"Error: {str(e)}") -``` - -3. **Performance Optimization** -```python -# Enable caching for better performance -crawler = AsyncWebCrawler( - always_by_pass_cache=False, - verbose=True +run_cfg = CrawlerRunConfig( + cache_mode=CacheMode.BYPASS, + css_selector="main.article", + word_count_threshold=10, + screenshot=True ) + +async with AsyncWebCrawler(config=browser_cfg) as crawler: + result = await crawler.arun("https://example.com/news", config=run_cfg) + print("Crawled HTML length:", len(result.cleaned_html)) + if result.screenshot: + print("Screenshot base64 length:", len(result.screenshot)) ``` -4. **Anti-Detection** +### 3.2 Legacy Parameters Still Accepted + +For **backward** compatibility, `arun()` can still accept direct arguments like `css_selector=...`, `word_count_threshold=...`, etc., but we strongly advise migrating them into a **`CrawlerRunConfig`**. + +--- + +## 4. Helper Methods + +### 4.1 `arun_many()` + ```python -# Maximum stealth -crawler = AsyncWebCrawler( - headless=True, - user_agent="Mozilla/5.0...", - headers={"Accept-Language": "en-US"} -) -result = await crawler.arun( - url="https://example.com", - magic=True, - simulate_user=True -) +async def arun_many( + self, + urls: List[str], + config: Optional[CrawlerRunConfig] = None, + # Legacy parameters... +) -> List[CrawlResult]: + ... ``` -## Note on Browser Types +Crawls multiple URLs in concurrency. Accepts the same style `CrawlerRunConfig`. Example: -Each browser type has its characteristics: - -- **chromium**: Best overall compatibility -- **firefox**: Good for specific use cases -- **webkit**: Lighter weight, good for basic crawling - -Choose based on your specific needs: ```python -# High compatibility -crawler = AsyncWebCrawler(browser_type="chromium") +run_cfg = CrawlerRunConfig( + # e.g., concurrency, wait_for, caching, extraction, etc. + semaphore_count=5 +) -# Memory efficient -crawler = AsyncWebCrawler(browser_type="webkit") -``` \ No newline at end of file +async with AsyncWebCrawler(config=browser_cfg) as crawler: + results = await crawler.arun_many( + urls=["https://example.com", "https://another.com"], + config=run_cfg + ) + for r in results: + print(r.url, ":", len(r.cleaned_html)) +``` + +### 4.2 `start()` & `close()` + +Allows manual lifecycle usage instead of context manager: + +```python +crawler = AsyncWebCrawler(config=browser_cfg) +await crawler.start() + +# Perform multiple operations +resultA = await crawler.arun("https://exampleA.com", config=run_cfg) +resultB = await crawler.arun("https://exampleB.com", config=run_cfg) + +await crawler.close() +``` + +--- + +## 5. `CrawlResult` Output + +Each `arun()` returns a **`CrawlResult`** containing: + +- `url`: Final URL (if redirected). +- `html`: Original HTML. +- `cleaned_html`: Sanitized HTML. +- `markdown_v2` (or future `markdown`): Markdown outputs (raw, fit, etc.). +- `extracted_content`: If an extraction strategy was used (JSON for CSS/LLM strategies). +- `screenshot`, `pdf`: If screenshots/PDF requested. +- `media`, `links`: Information about discovered images/links. +- `success`, `error_message`: Status info. + +For details, see [CrawlResult doc](./crawl-result.md). + +--- + +## 6. Quick Example + +Below is an example hooking it all together: + +```python +import asyncio +from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode +from crawl4ai.extraction_strategy import JsonCssExtractionStrategy +import json + +async def main(): + # 1. Browser config + browser_cfg = BrowserConfig( + browser_type="firefox", + headless=False, + verbose=True + ) + + # 2. Run config + schema = { + "name": "Articles", + "baseSelector": "article.post", + "fields": [ + {"name": "title", "selector": "h2", "type": "text"}, + {"name": "url", "selector": "a", "type": "attribute", "attribute": "href"} + ] + } + + run_cfg = CrawlerRunConfig( + cache_mode=CacheMode.BYPASS, + extraction_strategy=JsonCssExtractionStrategy(schema), + word_count_threshold=15, + remove_overlay_elements=True, + wait_for="css:.post" # Wait for posts to appear + ) + + async with AsyncWebCrawler(config=browser_cfg) as crawler: + result = await crawler.arun( + url="https://example.com/blog", + config=run_cfg + ) + + if result.success: + print("Cleaned HTML length:", len(result.cleaned_html)) + if result.extracted_content: + articles = json.loads(result.extracted_content) + print("Extracted articles:", articles[:2]) + else: + print("Error:", result.error_message) + +asyncio.run(main()) +``` + +**Explanation**: +- We define a **`BrowserConfig`** with Firefox, no headless, and `verbose=True`. +- We define a **`CrawlerRunConfig`** that **bypasses cache**, uses a **CSS** extraction schema, has a `word_count_threshold=15`, etc. +- We pass them to `AsyncWebCrawler(config=...)` and `arun(url=..., config=...)`. + +--- + +## 7. Best Practices & Migration Notes + +1. **Use** `BrowserConfig` for **global** settings about the browser’s environment. +2. **Use** `CrawlerRunConfig` for **per-crawl** logic (caching, content filtering, extraction strategies, wait conditions). +3. **Avoid** legacy parameters like `css_selector` or `word_count_threshold` directly in `arun()`. Instead: + + ```python + run_cfg = CrawlerRunConfig(css_selector=".main-content", word_count_threshold=20) + result = await crawler.arun(url="...", config=run_cfg) + ``` + +4. **Context Manager** usage is simplest unless you want a persistent crawler across many calls. + +--- + +## 8. Summary + +**AsyncWebCrawler** is your entry point to asynchronous crawling: + +- **Constructor** accepts **`BrowserConfig`** (or defaults). +- **`arun(url, config=CrawlerRunConfig)`** is the main method for single-page crawls. +- **`arun_many(urls, config=CrawlerRunConfig)`** handles concurrency across multiple URLs. +- For advanced lifecycle control, use `start()` and `close()` explicitly. + +**Migration**: +- If you used `AsyncWebCrawler(browser_type="chromium", css_selector="...")`, move browser settings to `BrowserConfig(...)` and content/crawl logic to `CrawlerRunConfig(...)`. + +This modular approach ensures your code is **clean**, **scalable**, and **easy to maintain**. For any advanced or rarely used parameters, see the [BrowserConfig docs](../api/parameters.md). \ No newline at end of file diff --git a/docs/md_v2/api/crawl-config.md b/docs/md_v2/api/crawl-config.md deleted file mode 100644 index 928ae1e2..00000000 --- a/docs/md_v2/api/crawl-config.md +++ /dev/null @@ -1,85 +0,0 @@ -# CrawlerRunConfig Parameters Documentation - -## Content Processing Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `word_count_threshold` | int | 200 | Minimum word count threshold before processing content | -| `extraction_strategy` | ExtractionStrategy | None | Strategy to extract structured data from crawled pages. When None, uses NoExtractionStrategy | -| `chunking_strategy` | ChunkingStrategy | RegexChunking() | Strategy to chunk content before extraction | -| `markdown_generator` | MarkdownGenerationStrategy | None | Strategy for generating markdown from extracted content | -| `content_filter` | RelevantContentFilter | None | Optional filter to prune irrelevant content | -| `only_text` | bool | False | If True, attempt to extract text-only content where applicable | -| `css_selector` | str | None | CSS selector to extract a specific portion of the page | -| `excluded_tags` | list[str] | [] | List of HTML tags to exclude from processing | -| `keep_data_attributes` | bool | False | If True, retain `data-*` attributes while removing unwanted attributes | -| `remove_forms` | bool | False | If True, remove all `` elements from the HTML | -| `prettiify` | bool | False | If True, apply `fast_format_html` to produce prettified HTML output | - -## Caching Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `cache_mode` | CacheMode | None | Defines how caching is handled. Defaults to CacheMode.ENABLED internally | -| `session_id` | str | None | Optional session ID to persist browser context and page instance | -| `bypass_cache` | bool | False | Legacy parameter, if True acts like CacheMode.BYPASS | -| `disable_cache` | bool | False | Legacy parameter, if True acts like CacheMode.DISABLED | -| `no_cache_read` | bool | False | Legacy parameter, if True acts like CacheMode.WRITE_ONLY | -| `no_cache_write` | bool | False | Legacy parameter, if True acts like CacheMode.READ_ONLY | - -## Page Navigation and Timing Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `wait_until` | str | "domcontentloaded" | The condition to wait for when navigating | -| `page_timeout` | int | 60000 | Timeout in milliseconds for page operations like navigation | -| `wait_for` | str | None | CSS selector or JS condition to wait for before extracting content | -| `wait_for_images` | bool | True | If True, wait for images to load before extracting content | -| `delay_before_return_html` | float | 0.1 | Delay in seconds before retrieving final HTML | -| `mean_delay` | float | 0.1 | Mean base delay between requests when calling arun_many | -| `max_range` | float | 0.3 | Max random additional delay range for requests in arun_many | -| `semaphore_count` | int | 5 | Number of concurrent operations allowed | - -## Page Interaction Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `js_code` | str or list[str] | None | JavaScript code/snippets to run on the page | -| `js_only` | bool | False | If True, indicates subsequent calls are JS-driven updates | -| `ignore_body_visibility` | bool | True | If True, ignore whether the body is visible before proceeding | -| `scan_full_page` | bool | False | If True, scroll through the entire page to load all content | -| `scroll_delay` | float | 0.2 | Delay in seconds between scroll steps if scan_full_page is True | -| `process_iframes` | bool | False | If True, attempts to process and inline iframe content | -| `remove_overlay_elements` | bool | False | If True, remove overlays/popups before extracting HTML | -| `simulate_user` | bool | False | If True, simulate user interactions for anti-bot measures | -| `override_navigator` | bool | False | If True, overrides navigator properties for more human-like behavior | -| `magic` | bool | False | If True, attempts automatic handling of overlays/popups | -| `adjust_viewport_to_content` | bool | False | If True, adjust viewport according to page content dimensions | - -## Media Handling Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `screenshot` | bool | False | Whether to take a screenshot after crawling | -| `screenshot_wait_for` | float | None | Additional wait time before taking a screenshot | -| `screenshot_height_threshold` | int | 20000 | Threshold for page height to decide screenshot strategy | -| `pdf` | bool | False | Whether to generate a PDF of the page | -| `image_description_min_word_threshold` | int | 50 | Minimum words for image description extraction | -| `image_score_threshold` | int | 3 | Minimum score threshold for processing an image | -| `exclude_external_images` | bool | False | If True, exclude all external images from processing | - -## Link and Domain Handling Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `exclude_social_media_domains` | list[str] | SOCIAL_MEDIA_DOMAINS | List of domains to exclude for social media links | -| `exclude_external_links` | bool | False | If True, exclude all external links from the results | -| `exclude_social_media_links` | bool | False | If True, exclude links pointing to social media domains | -| `exclude_domains` | list[str] | [] | List of specific domains to exclude from results | - -## Debugging and Logging Parameters - -| Parameter | Type | Default | Description | -|-----------|------|---------|-------------| -| `verbose` | bool | True | Enable verbose logging | -| `log_console` | bool | False | If True, log console messages from the page | \ No newline at end of file diff --git a/docs/md_v2/api/crawl-result.md b/docs/md_v2/api/crawl-result.md index 7e3bda98..929114c7 100644 --- a/docs/md_v2/api/crawl-result.md +++ b/docs/md_v2/api/crawl-result.md @@ -1,302 +1,330 @@ -# CrawlResult +# `CrawlResult` Reference -The `CrawlResult` class represents the result of a web crawling operation. It provides access to various forms of extracted content and metadata from the crawled webpage. +The **`CrawlResult`** class encapsulates everything returned after a single crawl operation. It provides the **raw or processed content**, details on links and media, plus optional metadata (like screenshots, PDFs, or extracted JSON). -## Class Definition +**Location**: `crawl4ai/crawler/models.py` (for reference) ```python class CrawlResult(BaseModel): - """Result of a web crawling operation.""" - - # Basic Information - url: str # Crawled URL - success: bool # Whether crawl succeeded - status_code: Optional[int] = None # HTTP status code - error_message: Optional[str] = None # Error message if failed - - # Content - html: str # Raw HTML content - cleaned_html: Optional[str] = None # Cleaned HTML - fit_html: Optional[str] = None # Most relevant HTML content - markdown: Optional[str] = None # HTML converted to markdown - fit_markdown: Optional[str] = None # Most relevant markdown content - downloaded_files: Optional[List[str]] = None # Downloaded files - - # Extracted Data - extracted_content: Optional[str] = None # Content from extraction strategy - media: Dict[str, List[Dict]] = {} # Extracted media information - links: Dict[str, List[Dict]] = {} # Extracted links - metadata: Optional[dict] = None # Page metadata - - # Additional Data - screenshot: Optional[str] = None # Base64 encoded screenshot - session_id: Optional[str] = None # Session identifier - response_headers: Optional[dict] = None # HTTP response headers + url: str + html: str + success: bool + cleaned_html: Optional[str] = None + media: Dict[str, List[Dict]] = {} + links: Dict[str, List[Dict]] = {} + downloaded_files: Optional[List[str]] = None + screenshot: Optional[str] = None + pdf : Optional[bytes] = None + markdown: Optional[Union[str, MarkdownGenerationResult]] = None + markdown_v2: Optional[MarkdownGenerationResult] = None + fit_markdown: Optional[str] = None + fit_html: Optional[str] = None + extracted_content: Optional[str] = None + metadata: Optional[dict] = None + error_message: Optional[str] = None + session_id: Optional[str] = None + response_headers: Optional[dict] = None + status_code: Optional[int] = None + ssl_certificate: Optional[SSLCertificate] = None + ... ``` -## Properties and Their Data Structures +Below is a **field-by-field** explanation and possible usage patterns. -### Basic Information +--- +## 1. Basic Crawl Info + +### 1.1 **`url`** *(str)* +**What**: The final crawled URL (after any redirects). +**Usage**: ```python -# Access basic information -result = await crawler.arun(url="https://example.com") - -print(result.url) # "https://example.com" -print(result.success) # True/False -print(result.status_code) # 200, 404, etc. -print(result.error_message) # Error details if failed +print(result.url) # e.g., "https://example.com/" ``` -### Content Properties - -#### HTML Content +### 1.2 **`success`** *(bool)* +**What**: `True` if the crawl pipeline ended without major errors; `False` otherwise. +**Usage**: ```python -# Raw HTML -html_content = result.html - -# Cleaned HTML (removed ads, popups, etc.) -clean_content = result.cleaned_html - -# Most relevant HTML content -main_content = result.fit_html +if not result.success: + print(f"Crawl failed: {result.error_message}") ``` -#### Markdown Content +### 1.3 **`status_code`** *(Optional[int])* +**What**: The page’s HTTP status code (e.g., 200, 404). +**Usage**: ```python -# Full markdown version -markdown_content = result.markdown - -# Most relevant markdown content -main_content = result.fit_markdown +if result.status_code == 404: + print("Page not found!") ``` -### Media Content - -The media dictionary contains organized media elements: - +### 1.4 **`error_message`** *(Optional[str])* +**What**: If `success=False`, a textual description of the failure. +**Usage**: ```python -# Structure -media = { - "images": [ - { - "src": str, # Image URL - "alt": str, # Alt text - "desc": str, # Contextual description - "score": float, # Relevance score (0-10) - "type": str, # "image" - "width": int, # Image width (if available) - "height": int, # Image height (if available) - "context": str, # Surrounding text - "lazy": bool # Whether image was lazy-loaded - } - ], - "videos": [ - { - "src": str, # Video URL - "type": str, # "video" - "title": str, # Video title - "poster": str, # Thumbnail URL - "duration": str, # Video duration - "description": str # Video description - } - ], - "audios": [ - { - "src": str, # Audio URL - "type": str, # "audio" - "title": str, # Audio title - "duration": str, # Audio duration - "description": str # Audio description - } - ] -} - -# Example usage -for image in result.media["images"]: - if image["score"] > 5: # High-relevance images - print(f"High-quality image: {image['src']}") - print(f"Context: {image['context']}") +if not result.success: + print("Error:", result.error_message) ``` -### Link Analysis - -The links dictionary organizes discovered links: - +### 1.5 **`session_id`** *(Optional[str])* +**What**: The ID used for reusing a browser context across multiple calls. +**Usage**: ```python -# Structure -links = { - "internal": [ - { - "href": str, # URL - "text": str, # Link text - "title": str, # Title attribute - "type": str, # Link type (nav, content, etc.) - "context": str, # Surrounding text - "score": float # Relevance score - } - ], - "external": [ - { - "href": str, # External URL - "text": str, # Link text - "title": str, # Title attribute - "domain": str, # Domain name - "type": str, # Link type - "context": str # Surrounding text - } - ] -} +# If you used session_id="login_session" in CrawlerRunConfig, see it here: +print("Session:", result.session_id) +``` -# Example usage +### 1.6 **`response_headers`** *(Optional[dict])* +**What**: Final HTTP response headers. +**Usage**: +```python +if result.response_headers: + print("Server:", result.response_headers.get("Server", "Unknown")) +``` + +### 1.7 **`ssl_certificate`** *(Optional[SSLCertificate])* +**What**: If `fetch_ssl_certificate=True` in your CrawlerRunConfig, **`result.ssl_certificate`** contains a [**`SSLCertificate`**](../advanced/ssl-certificate.md) object describing the site’s certificate. You can export the cert in multiple formats (PEM/DER/JSON) or access its properties like `issuer`, + `subject`, `valid_from`, `valid_until`, etc. +**Usage**: +```python +if result.ssl_certificate: + print("Issuer:", result.ssl_certificate.issuer) +``` + +--- + +## 2. Raw / Cleaned Content + +### 2.1 **`html`** *(str)* +**What**: The **original** unmodified HTML from the final page load. +**Usage**: +```python +# Possibly large +print(len(result.html)) +``` + +### 2.2 **`cleaned_html`** *(Optional[str])* +**What**: A sanitized HTML version—scripts, styles, or excluded tags are removed based on your `CrawlerRunConfig`. +**Usage**: +```python +print(result.cleaned_html[:500]) # Show a snippet +``` + +### 2.3 **`fit_html`** *(Optional[str])* +**What**: If a **content filter** or heuristic (e.g., Pruning/BM25) modifies the HTML, the “fit” or post-filter version. +**When**: This is **only** present if your `markdown_generator` or `content_filter` produces it. +**Usage**: +```python +if result.fit_html: + print("High-value HTML content:", result.fit_html[:300]) +``` + +--- + +## 3. Markdown Fields + +### 3.1 The Markdown Generation Approach + +Crawl4AI can convert HTML→Markdown, optionally including: + +- **Raw** markdown +- **Links as citations** (with a references section) +- **Fit** markdown if a **content filter** is used (like Pruning or BM25) + +### 3.2 **`markdown_v2`** *(Optional[MarkdownGenerationResult])* +**What**: The **structured** object holding multiple markdown variants. Soon to be consolidated into `markdown`. + +**`MarkdownGenerationResult`** includes: +- **`raw_markdown`** *(str)*: The full HTML→Markdown conversion. +- **`markdown_with_citations`** *(str)*: Same markdown, but with link references as academic-style citations. +- **`references_markdown`** *(str)*: The reference list or footnotes at the end. +- **`fit_markdown`** *(Optional[str])*: If content filtering (Pruning/BM25) was applied, the filtered “fit” text. +- **`fit_html`** *(Optional[str])*: The HTML that led to `fit_markdown`. + +**Usage**: +```python +if result.markdown_v2: + md_res = result.markdown_v2 + print("Raw MD:", md_res.raw_markdown[:300]) + print("Citations MD:", md_res.markdown_with_citations[:300]) + print("References:", md_res.references_markdown) + if md_res.fit_markdown: + print("Pruned text:", md_res.fit_markdown[:300]) +``` + +### 3.3 **`markdown`** *(Optional[Union[str, MarkdownGenerationResult]])* +**What**: In future versions, `markdown` will fully replace `markdown_v2`. Right now, it might be a `str` or a `MarkdownGenerationResult`. +**Usage**: +```python +# Soon, you might see: +if isinstance(result.markdown, MarkdownGenerationResult): + print(result.markdown.raw_markdown[:200]) +else: + print(result.markdown) +``` + +### 3.4 **`fit_markdown`** *(Optional[str])* +**What**: A direct reference to the final filtered markdown (legacy approach). +**When**: This is set if a filter or content strategy explicitly writes there. Usually overshadowed by `markdown_v2.fit_markdown`. +**Usage**: +```python +print(result.fit_markdown) # Legacy field, prefer result.markdown_v2.fit_markdown +``` + +**Important**: “Fit” content (in `fit_markdown`/`fit_html`) only exists if you used a **filter** (like **PruningContentFilter** or **BM25ContentFilter**) within a `MarkdownGenerationStrategy`. + +--- + +## 4. Media & Links + +### 4.1 **`media`** *(Dict[str, List[Dict]])* +**What**: Contains info about discovered images, videos, or audio. Typically keys: `"images"`, `"videos"`, `"audios"`. +**Common Fields** in each item: + +- `src` *(str)*: Media URL +- `alt` or `title` *(str)*: Descriptive text +- `score` *(float)*: Relevance score if the crawler’s heuristic found it “important” +- `desc` or `description` *(Optional[str])*: Additional context extracted from surrounding text + +**Usage**: +```python +images = result.media.get("images", []) +for img in images: + if img.get("score", 0) > 5: + print("High-value image:", img["src"]) +``` + +### 4.2 **`links`** *(Dict[str, List[Dict]])* +**What**: Holds internal and external link data. Usually two keys: `"internal"` and `"external"`. +**Common Fields**: + +- `href` *(str)*: The link target +- `text` *(str)*: Link text +- `title` *(str)*: Title attribute +- `context` *(str)*: Surrounding text snippet +- `domain` *(str)*: If external, the domain + +**Usage**: +```python for link in result.links["internal"]: - print(f"Internal link: {link['href']}") - print(f"Context: {link['context']}") + print(f"Internal link to {link['href']} with text {link['text']}") ``` -### Metadata +--- -The metadata dictionary contains page information: +## 5. Additional Fields +### 5.1 **`extracted_content`** *(Optional[str])* +**What**: If you used **`extraction_strategy`** (CSS, LLM, etc.), the structured output (JSON). +**Usage**: ```python -# Structure -metadata = { - "title": str, # Page title - "description": str, # Meta description - "keywords": List[str], # Meta keywords - "author": str, # Author information - "published_date": str, # Publication date - "modified_date": str, # Last modified date - "language": str, # Page language - "canonical_url": str, # Canonical URL - "og_data": Dict, # Open Graph data - "twitter_data": Dict # Twitter card data -} - -# Example usage -if result.metadata: - print(f"Title: {result.metadata['title']}") - print(f"Author: {result.metadata.get('author', 'Unknown')}") -``` - -### Extracted Content - -Content from extraction strategies: - -```python -# For LLM or CSS extraction strategies if result.extracted_content: - structured_data = json.loads(result.extracted_content) - print(structured_data) + data = json.loads(result.extracted_content) + print(data) ``` -### Screenshot - -Base64 encoded screenshot: - +### 5.2 **`downloaded_files`** *(Optional[List[str]])* +**What**: If `accept_downloads=True` in your `BrowserConfig` + `downloads_path`, lists local file paths for downloaded items. +**Usage**: ```python -# Save screenshot if available +if result.downloaded_files: + for file_path in result.downloaded_files: + print("Downloaded:", file_path) +``` + +### 5.3 **`screenshot`** *(Optional[str])* +**What**: Base64-encoded screenshot if `screenshot=True` in `CrawlerRunConfig`. +**Usage**: +```python +import base64 if result.screenshot: - import base64 - - # Decode and save - with open("screenshot.png", "wb") as f: + with open("page.png", "wb") as f: f.write(base64.b64decode(result.screenshot)) ``` -## Usage Examples - -### Basic Content Access +### 5.4 **`pdf`** *(Optional[bytes])* +**What**: Raw PDF bytes if `pdf=True` in `CrawlerRunConfig`. +**Usage**: ```python -async with AsyncWebCrawler() as crawler: - result = await crawler.arun(url="https://example.com") +if result.pdf: + with open("page.pdf", "wb") as f: + f.write(result.pdf) +``` + +### 5.5 **`metadata`** *(Optional[dict])* +**What**: Page-level metadata if discovered (title, description, OG data, etc.). +**Usage**: +```python +if result.metadata: + print("Title:", result.metadata.get("title")) + print("Author:", result.metadata.get("author")) +``` + +--- + +## 6. Example: Accessing Everything + +```python +async def handle_result(result: CrawlResult): + if not result.success: + print("Crawl error:", result.error_message) + return - if result.success: - # Get clean content - print(result.fit_markdown) - - # Process images - for image in result.media["images"]: - if image["score"] > 7: - print(f"High-quality image: {image['src']}") + # Basic info + print("Crawled URL:", result.url) + print("Status code:", result.status_code) + + # HTML + print("Original HTML size:", len(result.html)) + print("Cleaned HTML size:", len(result.cleaned_html or "")) + + # Markdown output + if result.markdown_v2: + print("Raw Markdown:", result.markdown_v2.raw_markdown[:300]) + print("Citations Markdown:", result.markdown_v2.markdown_with_citations[:300]) + if result.markdown_v2.fit_markdown: + print("Fit Markdown:", result.markdown_v2.fit_markdown[:200]) + else: + print("Raw Markdown (legacy):", result.markdown[:200] if result.markdown else "N/A") + + # Media & Links + if "images" in result.media: + print("Image count:", len(result.media["images"])) + if "internal" in result.links: + print("Internal link count:", len(result.links["internal"])) + + # Extraction strategy result + if result.extracted_content: + print("Structured data:", result.extracted_content) + + # Screenshot/PDF + if result.screenshot: + print("Screenshot length:", len(result.screenshot)) + if result.pdf: + print("PDF bytes length:", len(result.pdf)) ``` -### Complete Data Processing -```python -async def process_webpage(url: str) -> Dict: - async with AsyncWebCrawler() as crawler: - result = await crawler.arun(url=url) - - if not result.success: - raise Exception(f"Crawl failed: {result.error_message}") - - return { - "content": result.fit_markdown, - "images": [ - img for img in result.media["images"] - if img["score"] > 5 - ], - "internal_links": [ - link["href"] for link in result.links["internal"] - ], - "metadata": result.metadata, - "status": result.status_code - } -``` +--- -### Error Handling -```python -async def safe_crawl(url: str) -> Dict: - async with AsyncWebCrawler() as crawler: - try: - result = await crawler.arun(url=url) - - if not result.success: - return { - "success": False, - "error": result.error_message, - "status": result.status_code - } - - return { - "success": True, - "content": result.fit_markdown, - "status": result.status_code - } - - except Exception as e: - return { - "success": False, - "error": str(e), - "status": None - } -``` +## 7. Key Points & Future -## Best Practices +1. **`markdown_v2` vs `markdown`** + - Right now, `markdown_v2` is the more robust container (`MarkdownGenerationResult`), providing **raw_markdown**, **markdown_with_citations**, references, plus possible **fit_markdown**. + - In future versions, everything will unify under **`markdown`**. If you rely on advanced features (citations, fit content), check `markdown_v2`. -1. **Always Check Success** -```python -if not result.success: - print(f"Error: {result.error_message}") - return -``` +2. **Fit Content** + - **`fit_markdown`** and **`fit_html`** appear only if you used a content filter (like **PruningContentFilter** or **BM25ContentFilter**) inside your **MarkdownGenerationStrategy** or set them directly. + - If no filter is used, they remain `None`. -2. **Use fit_markdown for Articles** -```python -# Better for article content -content = result.fit_markdown if result.fit_markdown else result.markdown -``` +3. **References & Citations** + - If you enable link citations in your `DefaultMarkdownGenerator` (`options={"citations": True}`), you’ll see `markdown_with_citations` plus a **`references_markdown`** block. This helps large language models or academic-like referencing. -3. **Filter Media by Score** -```python -relevant_images = [ - img for img in result.media["images"] - if img["score"] > 5 -] -``` +4. **Links & Media** + - `links["internal"]` and `links["external"]` group discovered anchors by domain. + - `media["images"]` / `["videos"]` / `["audios"]` store extracted media elements with optional scoring or context. -4. **Handle Missing Data** -```python -metadata = result.metadata or {} -title = metadata.get('title', 'Unknown Title') -``` \ No newline at end of file +5. **Error Cases** + - If `success=False`, check `error_message` (e.g., timeouts, invalid URLs). + - `status_code` might be `None` if we failed before an HTTP response. + +Use **`CrawlResult`** to glean all final outputs and feed them into your data pipelines, AI models, or archives. With the synergy of a properly configured **BrowserConfig** and **CrawlerRunConfig**, the crawler can produce robust, structured results here in **`CrawlResult`**. \ No newline at end of file diff --git a/docs/md_v2/api/parameters.md b/docs/md_v2/api/parameters.md index c1c4d2ea..7645084c 100644 --- a/docs/md_v2/api/parameters.md +++ b/docs/md_v2/api/parameters.md @@ -1,36 +1,226 @@ -# Parameter Reference Table +# 1. **BrowserConfig** – Controlling the Browser + +`BrowserConfig` focuses on **how** the browser is launched and behaves. This includes headless mode, proxies, user agents, and other environment tweaks. + +```python +from crawl4ai import AsyncWebCrawler, BrowserConfig + +browser_cfg = BrowserConfig( + browser_type="chromium", + headless=True, + viewport_width=1280, + viewport_height=720, + proxy="http://user:pass@proxy:8080", + user_agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 Chrome/116.0.0.0 Safari/537.36", +) +``` + +## 1.1 Parameter Highlights + +| **Parameter** | **Type / Default** | **What It Does** | +|-----------------------|----------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------| +| **`browser_type`** | `"chromium"`, `"firefox"`, `"webkit"`
*(default: `"chromium"`)* | Which browser engine to use. `"chromium"` is typical for many sites, `"firefox"` or `"webkit"` for specialized tests. | +| **`headless`** | `bool` (default: `True`) | Headless means no visible UI. `False` is handy for debugging. | +| **`viewport_width`** | `int` (default: `1080`) | Initial page width (in px). Useful for testing responsive layouts. | +| **`viewport_height`** | `int` (default: `600`) | Initial page height (in px). | +| **`proxy`** | `str` (default: `None`) | Single-proxy URL if you want all traffic to go through it, e.g. `"http://user:pass@proxy:8080"`. | +| **`proxy_config`** | `dict` (default: `None`) | For advanced or multi-proxy needs, specify details like `{"server": "...", "username": "...", ...}`. | +| **`use_persistent_context`** | `bool` (default: `False`) | If `True`, uses a **persistent** browser context (keep cookies, sessions across runs). Also sets `use_managed_browser=True`. | +| **`user_data_dir`** | `str or None` (default: `None`) | Directory to store user data (profiles, cookies). Must be set if you want permanent sessions. | +| **`ignore_https_errors`** | `bool` (default: `True`) | If `True`, continues despite invalid certificates (common in dev/staging). | +| **`java_script_enabled`** | `bool` (default: `True`) | Disable if you want no JS overhead, or if only static content is needed. | +| **`cookies`** | `list` (default: `[]`) | Pre-set cookies, each a dict like `{"name": "session", "value": "...", "url": "..."}`. | +| **`headers`** | `dict` (default: `{}`) | Extra HTTP headers for every request, e.g. `{"Accept-Language": "en-US"}`. | +| **`user_agent`** | `str` (default: Chrome-based UA) | Your custom or random user agent. `user_agent_mode="random"` can shuffle it. | +| **`light_mode`** | `bool` (default: `False`) | Disables some background features for performance gains. | +| **`text_mode`** | `bool` (default: `False`) | If `True`, tries to disable images/other heavy content for speed. | +| **`use_managed_browser`** | `bool` (default: `False`) | For advanced “managed” interactions (debugging, CDP usage). Typically set automatically if persistent context is on. | +| **`extra_args`** | `list` (default: `[]`) | Additional flags for the underlying browser process, e.g. `["--disable-extensions"]`. | + +**Tips**: +- Set `headless=False` to visually **debug** how pages load or how interactions proceed. +- If you need **authentication** storage or repeated sessions, consider `use_persistent_context=True` and specify `user_data_dir`. +- For large pages, you might need a bigger `viewport_width` and `viewport_height` to handle dynamic content. + +--- + +# 2. **CrawlerRunConfig** – Controlling Each Crawl + +While `BrowserConfig` sets up the **environment**, `CrawlerRunConfig` details **how** each **crawl operation** should behave: caching, content filtering, link or domain blocking, timeouts, JavaScript code, etc. + +```python +from crawl4ai import AsyncWebCrawler, CrawlerRunConfig + +run_cfg = CrawlerRunConfig( + wait_for="css:.main-content", + word_count_threshold=15, + excluded_tags=["nav", "footer"], + exclude_external_links=True, +) +``` + +## 2.1 Parameter Highlights + +We group them by category. + +### A) **Content Processing** + +| **Parameter** | **Type / Default** | **What It Does** | +|------------------------------|--------------------------------------|-------------------------------------------------------------------------------------------------| +| **`word_count_threshold`** | `int` (default: ~200) | Skips text blocks below X words. Helps ignore trivial sections. | +| **`extraction_strategy`** | `ExtractionStrategy` (default: None) | If set, extracts structured data (CSS-based, LLM-based, etc.). | +| **`markdown_generator`** | `MarkdownGenerationStrategy` (None) | If you want specialized markdown output (citations, filtering, chunking, etc.). | +| **`content_filter`** | `RelevantContentFilter` (None) | Filters out irrelevant text blocks. E.g., `PruningContentFilter` or `BM25ContentFilter`. | +| **`css_selector`** | `str` (None) | Retains only the part of the page matching this selector. | +| **`excluded_tags`** | `list` (None) | Removes entire tags (e.g. `["script", "style"]`). | +| **`excluded_selector`** | `str` (None) | Like `css_selector` but to exclude. E.g. `"#ads, .tracker"`. | +| **`only_text`** | `bool` (False) | If `True`, tries to extract text-only content. | +| **`prettiify`** | `bool` (False) | If `True`, beautifies final HTML (slower, purely cosmetic). | +| **`keep_data_attributes`** | `bool` (False) | If `True`, preserve `data-*` attributes in cleaned HTML. | +| **`remove_forms`** | `bool` (False) | If `True`, remove all `` elements. | + +--- + +### B) **Caching & Session** + +| **Parameter** | **Type / Default** | **What It Does** | +|-------------------------|------------------------|------------------------------------------------------------------------------------------------------------------------------| +| **`cache_mode`** | `CacheMode or None` | Controls how caching is handled (`ENABLED`, `BYPASS`, `DISABLED`, etc.). If `None`, typically defaults to `ENABLED`. | +| **`session_id`** | `str or None` | Assign a unique ID to reuse a single browser session across multiple `arun()` calls. | +| **`bypass_cache`** | `bool` (False) | If `True`, acts like `CacheMode.BYPASS`. | +| **`disable_cache`** | `bool` (False) | If `True`, acts like `CacheMode.DISABLED`. | +| **`no_cache_read`** | `bool` (False) | If `True`, acts like `CacheMode.WRITE_ONLY` (writes cache but never reads). | +| **`no_cache_write`** | `bool` (False) | If `True`, acts like `CacheMode.READ_ONLY` (reads cache but never writes). | + +Use these for controlling whether you read or write from a local content cache. Handy for large batch crawls or repeated site visits. + +--- + +### C) **Page Navigation & Timing** + +| **Parameter** | **Type / Default** | **What It Does** | +|----------------------------|-------------------------|----------------------------------------------------------------------------------------------------------------------| +| **`wait_until`** | `str` (domcontentloaded)| Condition for navigation to “complete”. Often `"networkidle"` or `"domcontentloaded"`. | +| **`page_timeout`** | `int` (60000 ms) | Timeout for page navigation or JS steps. Increase for slow sites. | +| **`wait_for`** | `str or None` | Wait for a CSS (`"css:selector"`) or JS (`"js:() => bool"`) condition before content extraction. | +| **`wait_for_images`** | `bool` (False) | Wait for images to load before finishing. Slows down if you only want text. | +| **`delay_before_return_html`** | `float` (0.1) | Additional pause (seconds) before final HTML is captured. Good for last-second updates. | +| **`mean_delay`** and **`max_range`** | `float` (0.1, 0.3) | If you call `arun_many()`, these define random delay intervals between crawls, helping avoid detection or rate limits. | +| **`semaphore_count`** | `int` (5) | Max concurrency for `arun_many()`. Increase if you have resources for parallel crawls. | + +--- + +### D) **Page Interaction** + +| **Parameter** | **Type / Default** | **What It Does** | +|----------------------------|--------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------| +| **`js_code`** | `str or list[str]` (None) | JavaScript to run after load. E.g. `"document.querySelector('button')?.click();"`. | +| **`js_only`** | `bool` (False) | If `True`, indicates we’re reusing an existing session and only applying JS. No full reload. | +| **`ignore_body_visibility`** | `bool` (True) | Skip checking if `` is visible. Usually best to keep `True`. | +| **`scan_full_page`** | `bool` (False) | If `True`, auto-scroll the page to load dynamic content (infinite scroll). | +| **`scroll_delay`** | `float` (0.2) | Delay between scroll steps if `scan_full_page=True`. | +| **`process_iframes`** | `bool` (False) | Inlines iframe content for single-page extraction. | +| **`remove_overlay_elements`** | `bool` (False) | Removes potential modals/popups blocking the main content. | +| **`simulate_user`** | `bool` (False) | Simulate user interactions (mouse movements) to avoid bot detection. | +| **`override_navigator`** | `bool` (False) | Override `navigator` properties in JS for stealth. | +| **`magic`** | `bool` (False) | Automatic handling of popups/consent banners. Experimental. | +| **`adjust_viewport_to_content`** | `bool` (False) | Resizes viewport to match page content height. | + +If your page is a single-page app with repeated JS updates, set `js_only=True` in subsequent calls, plus a `session_id` for reusing the same tab. + +--- + +### E) **Media Handling** + +| **Parameter** | **Type / Default** | **What It Does** | +|--------------------------------------------|---------------------|-----------------------------------------------------------------------------------------------------------| +| **`screenshot`** | `bool` (False) | Capture a screenshot (base64) in `result.screenshot`. | +| **`screenshot_wait_for`** | `float or None` | Extra wait time before the screenshot. | +| **`screenshot_height_threshold`** | `int` (~20000) | If the page is taller than this, alternate screenshot strategies are used. | +| **`pdf`** | `bool` (False) | If `True`, returns a PDF in `result.pdf`. | +| **`image_description_min_word_threshold`** | `int` (~50) | Minimum words for an image’s alt text or description to be considered valid. | +| **`image_score_threshold`** | `int` (~3) | Filter out low-scoring images. The crawler scores images by relevance (size, context, etc.). | +| **`exclude_external_images`** | `bool` (False) | Exclude images from other domains. | + +--- + +### F) **Link/Domain Handling** + +| **Parameter** | **Type / Default** | **What It Does** | +|------------------------------|-------------------------|-----------------------------------------------------------------------------------------------------------------------------| +| **`exclude_social_media_domains`** | `list` (e.g. Facebook/Twitter) | A default list can be extended. Any link to these domains is removed from final output. | +| **`exclude_external_links`** | `bool` (False) | Removes all links pointing outside the current domain. | +| **`exclude_social_media_links`** | `bool` (False) | Strips links specifically to social sites (like Facebook or Twitter). | +| **`exclude_domains`** | `list` ([]) | Provide a custom list of domains to exclude (like `["ads.com", "trackers.io"]`). | + +Use these for link-level content filtering (often to keep crawls “internal” or to remove spammy domains). + +--- + +### G) **Debug & Logging** + +| **Parameter** | **Type / Default** | **What It Does** | +|----------------|--------------------|---------------------------------------------------------------------------| +| **`verbose`** | `bool` (True) | Prints logs detailing each step of crawling, interactions, or errors. | +| **`log_console`** | `bool` (False) | Logs the page’s JavaScript console output if you want deeper JS debugging.| + +--- + +## 2.2 Example Usage + +```python +import asyncio +from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode + +async def main(): + # Configure the browser + browser_cfg = BrowserConfig( + headless=False, + viewport_width=1280, + viewport_height=720, + proxy="http://user:pass@myproxy:8080", + text_mode=True + ) + + # Configure the run + run_cfg = CrawlerRunConfig( + cache_mode=CacheMode.BYPASS, + session_id="my_session", + css_selector="main.article", + excluded_tags=["script", "style"], + exclude_external_links=True, + wait_for="css:.article-loaded", + screenshot=True + ) + + async with AsyncWebCrawler(config=browser_cfg) as crawler: + result = await crawler.arun( + url="https://example.com/news", + config=run_cfg + ) + if result.success: + print("Final cleaned_html length:", len(result.cleaned_html)) + if result.screenshot: + print("Screenshot captured (base64, length):", len(result.screenshot)) + else: + print("Crawl failed:", result.error_message) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +**What’s Happening**: +- **`text_mode=True`** avoids loading images and other heavy resources, speeding up the crawl. +- We disable caching (`cache_mode=CacheMode.BYPASS`) to always fetch fresh content. +- We only keep `main.article` content by specifying `css_selector="main.article"`. +- We exclude external links (`exclude_external_links=True`). +- We do a quick screenshot (`screenshot=True`) before finishing. + +--- + +## 3. Putting It All Together + +- **Use** `BrowserConfig` for **global** browser settings: engine, headless, proxy, user agent. +- **Use** `CrawlerRunConfig` for each crawl’s **context**: how to filter content, handle caching, wait for dynamic elements, or run JS. +- **Pass** both configs to `AsyncWebCrawler` (the `BrowserConfig`) and then to `arun()` (the `CrawlerRunConfig`). -| File Name | Parameter Name | Code Usage | Strategy/Class | Description | -|-----------|---------------|------------|----------------|-------------| -| async_crawler_strategy.py | user_agent | `kwargs.get("user_agent")` | AsyncPlaywrightCrawlerStrategy | User agent string for browser identification | -| async_crawler_strategy.py | proxy | `kwargs.get("proxy")` | AsyncPlaywrightCrawlerStrategy | Proxy server configuration for network requests | -| async_crawler_strategy.py | proxy_config | `kwargs.get("proxy_config")` | AsyncPlaywrightCrawlerStrategy | Detailed proxy configuration including auth | -| async_crawler_strategy.py | headless | `kwargs.get("headless", True)` | AsyncPlaywrightCrawlerStrategy | Whether to run browser in headless mode | -| async_crawler_strategy.py | browser_type | `kwargs.get("browser_type", "chromium")` | AsyncPlaywrightCrawlerStrategy | Type of browser to use (chromium/firefox/webkit) | -| async_crawler_strategy.py | headers | `kwargs.get("headers", {})` | AsyncPlaywrightCrawlerStrategy | Custom HTTP headers for requests | -| async_crawler_strategy.py | verbose | `kwargs.get("verbose", False)` | AsyncPlaywrightCrawlerStrategy | Enable detailed logging output | -| async_crawler_strategy.py | sleep_on_close | `kwargs.get("sleep_on_close", False)` | AsyncPlaywrightCrawlerStrategy | Add delay before closing browser | -| async_crawler_strategy.py | use_managed_browser | `kwargs.get("use_managed_browser", False)` | AsyncPlaywrightCrawlerStrategy | Use managed browser instance | -| async_crawler_strategy.py | user_data_dir | `kwargs.get("user_data_dir", None)` | AsyncPlaywrightCrawlerStrategy | Custom directory for browser profile data | -| async_crawler_strategy.py | session_id | `kwargs.get("session_id")` | AsyncPlaywrightCrawlerStrategy | Unique identifier for browser session | -| async_crawler_strategy.py | override_navigator | `kwargs.get("override_navigator", False)` | AsyncPlaywrightCrawlerStrategy | Override browser navigator properties | -| async_crawler_strategy.py | simulate_user | `kwargs.get("simulate_user", False)` | AsyncPlaywrightCrawlerStrategy | Simulate human-like behavior | -| async_crawler_strategy.py | magic | `kwargs.get("magic", False)` | AsyncPlaywrightCrawlerStrategy | Enable advanced anti-detection features | -| async_crawler_strategy.py | log_console | `kwargs.get("log_console", False)` | AsyncPlaywrightCrawlerStrategy | Log browser console messages | -| async_crawler_strategy.py | js_only | `kwargs.get("js_only", False)` | AsyncPlaywrightCrawlerStrategy | Only execute JavaScript without page load | -| async_crawler_strategy.py | page_timeout | `kwargs.get("page_timeout", 60000)` | AsyncPlaywrightCrawlerStrategy | Timeout for page load in milliseconds | -| async_crawler_strategy.py | ignore_body_visibility | `kwargs.get("ignore_body_visibility", True)` | AsyncPlaywrightCrawlerStrategy | Process page even if body is hidden | -| async_crawler_strategy.py | js_code | `kwargs.get("js_code", kwargs.get("js", self.js_code))` | AsyncPlaywrightCrawlerStrategy | Custom JavaScript code to execute | -| async_crawler_strategy.py | wait_for | `kwargs.get("wait_for")` | AsyncPlaywrightCrawlerStrategy | Wait for specific element/condition | -| async_crawler_strategy.py | process_iframes | `kwargs.get("process_iframes", False)` | AsyncPlaywrightCrawlerStrategy | Extract content from iframes | -| async_crawler_strategy.py | delay_before_return_html | `kwargs.get("delay_before_return_html")` | AsyncPlaywrightCrawlerStrategy | Additional delay before returning HTML | -| async_crawler_strategy.py | remove_overlay_elements | `kwargs.get("remove_overlay_elements", False)` | AsyncPlaywrightCrawlerStrategy | Remove pop-ups and overlay elements | -| async_crawler_strategy.py | screenshot | `kwargs.get("screenshot")` | AsyncPlaywrightCrawlerStrategy | Take page screenshot | -| async_crawler_strategy.py | screenshot_wait_for | `kwargs.get("screenshot_wait_for")` | AsyncPlaywrightCrawlerStrategy | Wait before taking screenshot | -| async_crawler_strategy.py | semaphore_count | `kwargs.get("semaphore_count", 5)` | AsyncPlaywrightCrawlerStrategy | Concurrent request limit | -| async_webcrawler.py | verbose | `kwargs.get("verbose", False)` | AsyncWebCrawler | Enable detailed logging | -| async_webcrawler.py | warmup | `kwargs.get("warmup", True)` | AsyncWebCrawler | Initialize crawler with warmup request | -| async_webcrawler.py | session_id | `kwargs.get("session_id", None)` | AsyncWebCrawler | Session identifier for browser reuse | -| async_webcrawler.py | only_text | `kwargs.get("only_text", False)` | AsyncWebCrawler | Extract only text content | -| async_webcrawler.py | bypass_cache | `kwargs.get("bypass_cache", False)` | AsyncWebCrawler | Skip cache and force fresh crawl | -| async_webcrawler.py | cache_mode | `kwargs.get("cache_mode", CacheMode.ENABLE)` | AsyncWebCrawler | Cache handling mode for request | \ No newline at end of file diff --git a/docs/md_v2/api/strategies.md b/docs/md_v2/api/strategies.md index f0f8f57c..06b757d4 100644 --- a/docs/md_v2/api/strategies.md +++ b/docs/md_v2/api/strategies.md @@ -218,12 +218,12 @@ result = await crawler.arun( ## Best Practices -1. **Choose the Right Strategy** +1. **Choose the Right Strategy** - Use `LLMExtractionStrategy` for complex, unstructured content - Use `JsonCssExtractionStrategy` for well-structured HTML - Use `CosineStrategy` for content similarity and clustering -2. **Optimize Chunking** +2. **Optimize Chunking** ```python # For long documents strategy = LLMExtractionStrategy( @@ -232,7 +232,7 @@ result = await crawler.arun( ) ``` -3. **Handle Errors** +3. **Handle Errors** ```python try: result = await crawler.arun( @@ -245,7 +245,7 @@ result = await crawler.arun( print(f"Extraction failed: {e}") ``` -4. **Monitor Performance** +4. **Monitor Performance** ```python strategy = CosineStrategy( verbose=True, # Enable logging diff --git a/docs/md_v2/assets/images/dispatcher.png b/docs/md_v2/assets/images/dispatcher.png new file mode 100644 index 0000000000000000000000000000000000000000..37e06972ae95fe47c84b504f4f9d65f65abeaefc GIT binary patch literal 487245 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�f_7BuS9yfw|2>tVVQ>bgVvS#g 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�p+NyGDR9?!B;J{ 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 sl8D+`wYkW?k2o9Jt$817Y^+xMEFqLKGM84B*&E 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
RMyPSm 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 z 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 z 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 z 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%0AA4Xd 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 P00000NkvXXu0mjf+quPD literal 0 HcmV?d00001 diff --git a/docs/md_v2/assets/styles.css b/docs/md_v2/assets/styles.css index 68a93f5d..1aed2822 100644 --- a/docs/md_v2/assets/styles.css +++ b/docs/md_v2/assets/styles.css @@ -7,6 +7,7 @@ :root { --global-font-size: 16px; + --global-code-font-size: 14px; --global-line-height: 1.5em; --global-space: 10px; --font-stack: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, @@ -20,6 +21,7 @@ --invert-font-color: #151515; /* Dark color for inverted elements */ --primary-color: #1a95e0; /* Primary color can remain the same or be adjusted for better contrast */ --secondary-color: #727578; /* Secondary color for less important text */ + --secondary-dimmed-color: #8b857a; /* Dimmed secondary color */ --error-color: #ff5555; /* Bright color for errors */ --progress-bar-background: #444; /* Darker background for progress bar */ --progress-bar-fill: #1a95e0; /* Bright color for progress bar fill */ @@ -37,8 +39,9 @@ --secondary-color: #a3abba; --secondary-color: #d5cec0; --tertiary-color: #a3abba; - --primary-color: #09b5a5; /* Updated to the brand color */ + --primary-dimmed-color: #09b5a5; /* Updated to the brand color */ --primary-color: #50ffff; /* Updated to the brand color */ + --accent-color: rgb(243, 128, 245); --error-color: #ff3c74; --progress-bar-background: #3f3f44; --progress-bar-fill: #09b5a5; /* Updated to the brand color */ @@ -80,10 +83,16 @@ pre, code { line-height: var(--global-line-height); } -strong, +strong { + /* color : var(--primary-dimmed-color); */ + /* background-color: #50ffff17; */ + text-shadow: 0 0 0px var(--font-color), 0 0 0px var(--font-color); +} + .highlight { /* background: url(//s2.svgbox.net/pen-brushes.svg?ic=brush-1&color=50ffff); */ - background-color: #50ffff33; + background-color: #50ffff17; + } .terminal-card > header { @@ -157,4 +166,71 @@ ol li::before { counter-increment: item; /* float: left; */ /* padding-right: 5px; */ +} + + +/* 8 TERMINAL CSS */ + +.terminal code { + font-size: var(--global-code-font-size); + background: var(--block-background-color); + /* color: var(--secondary-color); */ + color: var(--primary-dimmed-color); +} + +.terminal pre code { + background: var(--block-background-color); + color: var(--secondary-color); +} + +.hljs-keyword, .hljs-selector-tag, .hljs-built_in, .hljs-name, .hljs-tag { + color: var(--accent-color); +} +.hljs-string { + color: var(--primary-dimmed-color); +} +.hljs-comment { + color: var(--secondary-dimmed-color); + font-style: italic; + font-size: 0.9em; +} +.hljs-number { + color: var(--primary-dimmed-color); +} + +.terminal strong > code, .terminal h2 > code , .terminal h3 > code { + background-color: transparent; + /* color: var(--font-color); */ + color: var(--primary-dimmed-color); + text-shadow: none; +} + +blockquote { + background-color: var(--invert-font-color); + padding: 1em 2em; + border-left: 2px solid var(--primary-dimmed-color); +} + +blockquote::after { + content: "💡"; + white-space: pre; + position: absolute; + top: 1em; + left: 5px; + line-height: var(--global-line-height); + color: #9ca2ab; +} + +pre { + display: block; + word-break: break-word; + word-wrap: break-word; +} + +.terminal h1 { + font-size: 2em; +} + +.terminal h1, .terminal h2, .terminal h3, .terminal h4, .terminal h5, .terminal h6 { + text-shadow: 0 0 0px var(--font-color), 0 0 0px var(--font-color), 0 0 0px var(--font-color); } \ No newline at end of file diff --git a/docs/md_v2/basic/browser-config.md b/docs/md_v2/basic/browser-config.md deleted file mode 100644 index 7df4a97b..00000000 --- a/docs/md_v2/basic/browser-config.md +++ /dev/null @@ -1,208 +0,0 @@ -# Browser Configuration - -Crawl4AI supports multiple browser engines and offers extensive configuration options for browser behavior. - -## Browser Types - -Choose from three browser engines: - -```python -# Chromium (default) -async with AsyncWebCrawler(browser_type="chromium") as crawler: - result = await crawler.arun(url="https://example.com") - -# Firefox -async with AsyncWebCrawler(browser_type="firefox") as crawler: - result = await crawler.arun(url="https://example.com") - -# WebKit -async with AsyncWebCrawler(browser_type="webkit") as crawler: - result = await crawler.arun(url="https://example.com") -``` - -## Basic Configuration - -Common browser settings: - -```python -async with AsyncWebCrawler( - headless=True, # Run in headless mode (no GUI) - verbose=True, # Enable detailed logging - sleep_on_close=False # No delay when closing browser -) as crawler: - result = await crawler.arun(url="https://example.com") -``` - -## Identity Management - -Control how your crawler appears to websites: - -```python -# Custom user agent -async with AsyncWebCrawler( - user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" -) as crawler: - result = await crawler.arun(url="https://example.com") - -# Custom headers -headers = { - "Accept-Language": "en-US,en;q=0.9", - "Cache-Control": "no-cache" -} -async with AsyncWebCrawler(headers=headers) as crawler: - result = await crawler.arun(url="https://example.com") -``` - -## Screenshot Capabilities - -Capture page screenshots with enhanced error handling: - -```python -result = await crawler.arun( - url="https://example.com", - screenshot=True, # Enable screenshot - screenshot_wait_for=2.0 # Wait 2 seconds before capture -) - -if result.screenshot: # Base64 encoded image - import base64 - with open("screenshot.png", "wb") as f: - f.write(base64.b64decode(result.screenshot)) -``` - -## Timeouts and Waiting - -Control page loading behavior: - -```python -result = await crawler.arun( - url="https://example.com", - page_timeout=60000, # Page load timeout (ms) - delay_before_return_html=2.0, # Wait before content capture - wait_for="css:.dynamic-content" # Wait for specific element -) -``` - -## JavaScript Execution - -Execute custom JavaScript before crawling: - -```python -# Single JavaScript command -result = await crawler.arun( - url="https://example.com", - js_code="window.scrollTo(0, document.body.scrollHeight);" -) - -# Multiple commands -js_commands = [ - "window.scrollTo(0, document.body.scrollHeight);", - "document.querySelector('.load-more').click();" -] -result = await crawler.arun( - url="https://example.com", - js_code=js_commands -) -``` - -## Proxy Configuration - -Use proxies for enhanced access: - -```python -# Simple proxy -async with AsyncWebCrawler( - proxy="http://proxy.example.com:8080" -) as crawler: - result = await crawler.arun(url="https://example.com") - -# Proxy with authentication -proxy_config = { - "server": "http://proxy.example.com:8080", - "username": "user", - "password": "pass" -} -async with AsyncWebCrawler(proxy_config=proxy_config) as crawler: - result = await crawler.arun(url="https://example.com") -``` - -## Anti-Detection Features - -Enable stealth features to avoid bot detection: - -```python -result = await crawler.arun( - url="https://example.com", - simulate_user=True, # Simulate human behavior - override_navigator=True, # Mask automation signals - magic=True # Enable all anti-detection features -) -``` - -## Handling Dynamic Content - -Configure browser to handle dynamic content: - -```python -# Wait for dynamic content -result = await crawler.arun( - url="https://example.com", - wait_for="js:() => document.querySelector('.content').children.length > 10", - process_iframes=True # Process iframe content -) - -# Handle lazy-loaded images -result = await crawler.arun( - url="https://example.com", - js_code="window.scrollTo(0, document.body.scrollHeight);", - delay_before_return_html=2.0 # Wait for images to load -) -``` - -## Comprehensive Example - -Here's how to combine various browser configurations: - -```python -async def crawl_with_advanced_config(url: str): - async with AsyncWebCrawler( - # Browser setup - browser_type="chromium", - headless=True, - verbose=True, - - # Identity - user_agent="Custom User Agent", - headers={"Accept-Language": "en-US"}, - - # Proxy setup - proxy="http://proxy.example.com:8080" - ) as crawler: - result = await crawler.arun( - url=url, - # Content handling - process_iframes=True, - screenshot=True, - - # Timing - page_timeout=60000, - delay_before_return_html=2.0, - - # Anti-detection - magic=True, - simulate_user=True, - - # Dynamic content - js_code=[ - "window.scrollTo(0, document.body.scrollHeight);", - "document.querySelector('.load-more')?.click();" - ], - wait_for="css:.dynamic-content" - ) - - return { - "content": result.markdown, - "screenshot": result.screenshot, - "success": result.success - } -``` \ No newline at end of file diff --git a/docs/md_v2/basic/content-selection.md b/docs/md_v2/basic/content-selection.md deleted file mode 100644 index ec838f2d..00000000 --- a/docs/md_v2/basic/content-selection.md +++ /dev/null @@ -1,135 +0,0 @@ -### Content Selection - -Crawl4AI provides multiple ways to select and filter specific content from webpages. Learn how to precisely target the content you need. - -#### CSS Selectors - -Extract specific content using a `CrawlerRunConfig` with CSS selectors: - -```python -from crawl4ai.async_configs import CrawlerRunConfig - -config = CrawlerRunConfig(css_selector=".main-article") # Target main article content -result = await crawler.arun(url="https://crawl4ai.com", config=config) - -config = CrawlerRunConfig(css_selector="article h1, article .content") # Target heading and content -result = await crawler.arun(url="https://crawl4ai.com", config=config) -``` - -#### Content Filtering - -Control content inclusion or exclusion with `CrawlerRunConfig`: - -```python -config = CrawlerRunConfig( - word_count_threshold=10, # Minimum words per block - excluded_tags=['form', 'header', 'footer', 'nav'], # Excluded tags - exclude_external_links=True, # Remove external links - exclude_social_media_links=True, # Remove social media links - exclude_external_images=True # Remove external images -) - -result = await crawler.arun(url="https://crawl4ai.com", config=config) -``` - -#### Iframe Content - -Process iframe content by enabling specific options in `CrawlerRunConfig`: - -```python -config = CrawlerRunConfig( - process_iframes=True, # Extract iframe content - remove_overlay_elements=True # Remove popups/modals that might block iframes -) - -result = await crawler.arun(url="https://crawl4ai.com", config=config) -``` - -#### Structured Content Selection Using LLMs - -Leverage LLMs for intelligent content extraction: - -```python -from crawl4ai.extraction_strategy import LLMExtractionStrategy -from pydantic import BaseModel -from typing import List - -class ArticleContent(BaseModel): - title: str - main_points: List[str] - conclusion: str - -strategy = LLMExtractionStrategy( - provider="ollama/nemotron", - schema=ArticleContent.schema(), - instruction="Extract the main article title, key points, and conclusion" -) - -config = CrawlerRunConfig(extraction_strategy=strategy) - -result = await crawler.arun(url="https://crawl4ai.com", config=config) -article = json.loads(result.extracted_content) -``` - -#### Pattern-Based Selection - -Extract content matching repetitive patterns: - -```python -from crawl4ai.extraction_strategy import JsonCssExtractionStrategy - -schema = { - "name": "News Articles", - "baseSelector": "article.news-item", - "fields": [ - {"name": "headline", "selector": "h2", "type": "text"}, - {"name": "summary", "selector": ".summary", "type": "text"}, - {"name": "category", "selector": ".category", "type": "text"}, - { - "name": "metadata", - "type": "nested", - "fields": [ - {"name": "author", "selector": ".author", "type": "text"}, - {"name": "date", "selector": ".date", "type": "text"} - ] - } - ] -} - -strategy = JsonCssExtractionStrategy(schema) -config = CrawlerRunConfig(extraction_strategy=strategy) - -result = await crawler.arun(url="https://crawl4ai.com", config=config) -articles = json.loads(result.extracted_content) -``` - -#### Comprehensive Example - -Combine different selection methods using `CrawlerRunConfig`: - -```python -from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig - -async def extract_article_content(url: str): - # Define structured extraction - article_schema = { - "name": "Article", - "baseSelector": "article.main", - "fields": [ - {"name": "title", "selector": "h1", "type": "text"}, - {"name": "content", "selector": ".content", "type": "text"} - ] - } - - # Define configuration - config = CrawlerRunConfig( - extraction_strategy=JsonCssExtractionStrategy(article_schema), - word_count_threshold=10, - excluded_tags=['nav', 'footer'], - exclude_external_links=True - ) - - async with AsyncWebCrawler() as crawler: - result = await crawler.arun(url=url, config=config) - return json.loads(result.extracted_content) -``` diff --git a/docs/md_v2/basic/content_filtering.md b/docs/md_v2/basic/content_filtering.md deleted file mode 100644 index 14f48ec6..00000000 --- a/docs/md_v2/basic/content_filtering.md +++ /dev/null @@ -1,83 +0,0 @@ -# Content Filtering in Crawl4AI - -This guide explains how to use content filtering strategies in Crawl4AI to extract the most relevant information from crawled web pages. You'll learn how to use the built-in `BM25ContentFilter` and how to create your own custom content filtering strategies. - -## Relevance Content Filter - -The `RelevanceContentFilter` is an abstract class providing a common interface for content filtering strategies. Specific algorithms, like `PruningContentFilter` or `BM25ContentFilter`, inherit from this class and implement the `filter_content` method. This method takes the HTML content as input and returns a list of filtered text blocks. - -## Pruning Content Filter - -The `PruningContentFilter` removes less relevant nodes based on metrics like text density, link density, and tag importance. Nodes that fall below a defined threshold are pruned, leaving only high-value content. - -### Usage - -```python -from crawl4ai.async_configs import CrawlerRunConfig -from crawl4ai.content_filter_strategy import PruningContentFilter - -config = CrawlerRunConfig( - content_filter=PruningContentFilter( - min_word_threshold=5, - threshold_type='dynamic', - threshold=0.45 - ), - fit_markdown=True # Activates markdown fitting -) - -result = await crawler.arun(url="https://example.com", config=config) - -if result.success: - print(f"Cleaned Markdown:\n{result.fit_markdown}") -``` - -### Parameters - -- **`min_word_threshold`**: (Optional) Minimum number of words a node must contain to be considered relevant. Nodes with fewer words are automatically pruned. -- **`threshold_type`**: (Optional, default 'fixed') Controls how pruning thresholds are calculated: - - `'fixed'`: Uses a constant threshold value for all nodes. - - `'dynamic'`: Adjusts thresholds based on node properties (e.g., tag importance, text/link ratios). -- **`threshold`**: (Optional, default 0.48) Base threshold for pruning: - - Fixed: Nodes scoring below this value are removed. - - Dynamic: This value adjusts based on node characteristics. - -### How It Works - -The algorithm evaluates each node using: -- **Text density**: Ratio of text to overall content. -- **Link density**: Proportion of text within links. -- **Tag importance**: Weights based on HTML tag type (e.g., `

`, `

`, `

`). -- **Content quality**: Metrics like text length and structural importance. - -## BM25 Algorithm - -The `BM25ContentFilter` uses the BM25 algorithm to rank and extract text chunks based on relevance to a search query or page metadata. - -### Usage - -```python -from crawl4ai.async_configs import CrawlerRunConfig -from crawl4ai.content_filter_strategy import BM25ContentFilter - -config = CrawlerRunConfig( - content_filter=BM25ContentFilter(user_query="fruit nutrition health"), - fit_markdown=True # Activates markdown fitting -) - -result = await crawler.arun(url="https://example.com", config=config) - -if result.success: - print(f"Filtered Content:\n{result.extracted_content}") - print(f"\nFiltered Markdown:\n{result.fit_markdown}") - print(f"\nFiltered HTML:\n{result.fit_html}") -else: - print("Error:", result.error_message) -``` - -### Parameters - -- **`user_query`**: (Optional) A string representing the search query. If not provided, the filter extracts metadata (title, description, keywords) and uses it as the query. -- **`bm25_threshold`**: (Optional, default 1.0) Threshold controlling relevance: - - Higher values return stricter, more relevant results. - - Lower values include more lenient filtering. - diff --git a/docs/md_v2/basic/installation.md b/docs/md_v2/basic/installation.md deleted file mode 100644 index de8aeafa..00000000 --- a/docs/md_v2/basic/installation.md +++ /dev/null @@ -1,137 +0,0 @@ -# Installation 💻 - -Crawl4AI offers flexible installation options to suit various use cases. You can install it as a Python package, use it with Docker, or run it as a local server. - -## Option 1: Python Package Installation (Recommended) - -Crawl4AI is now available on PyPI, making installation easier than ever. Choose the option that best fits your needs: - -### Basic Installation - -For basic web crawling and scraping tasks: - -```bash -pip install crawl4ai -playwright install # Install Playwright dependencies -``` - -### Installation with PyTorch - -For advanced text clustering (includes CosineSimilarity cluster strategy): - -```bash -pip install crawl4ai[torch] -``` - -### Installation with Transformers - -For text summarization and Hugging Face models: - -```bash -pip install crawl4ai[transformer] -``` - -### Full Installation - -For all features: - -```bash -pip install crawl4ai[all] -``` - -### Development Installation - -For contributors who plan to modify the source code: - -```bash -git clone https://github.com/unclecode/crawl4ai.git -cd crawl4ai -pip install -e ".[all]" -playwright install # Install Playwright dependencies -``` - -💡 After installation with "torch", "transformer", or "all" options, it's recommended to run the following CLI command to load the required models: - -```bash -crawl4ai-download-models -``` - -This is optional but will boost the performance and speed of the crawler. You only need to do this once after installation. - -## Playwright Installation Note for Ubuntu - -If you encounter issues with Playwright installation on Ubuntu, you may need to install additional dependencies: - -```bash -sudo apt-get install -y \ - libwoff1 \ - libopus0 \ - libwebp7 \ - libwebpdemux2 \ - libenchant-2-2 \ - libgudev-1.0-0 \ - libsecret-1-0 \ - libhyphen0 \ - libgdk-pixbuf2.0-0 \ - libegl1 \ - libnotify4 \ - libxslt1.1 \ - libevent-2.1-7 \ - libgles2 \ - libxcomposite1 \ - libatk1.0-0 \ - libatk-bridge2.0-0 \ - libepoxy0 \ - libgtk-3-0 \ - libharfbuzz-icu0 \ - libgstreamer-gl1.0-0 \ - libgstreamer-plugins-bad1.0-0 \ - gstreamer1.0-plugins-good \ - gstreamer1.0-plugins-bad \ - libxt6 \ - libxaw7 \ - xvfb \ - fonts-noto-color-emoji \ - libfontconfig \ - libfreetype6 \ - xfonts-cyrillic \ - xfonts-scalable \ - fonts-liberation \ - fonts-ipafont-gothic \ - fonts-wqy-zenhei \ - fonts-tlwg-loma-otf \ - fonts-freefont-ttf -``` - -## Option 2: Using Docker (Coming Soon) - -Docker support for Crawl4AI is currently in progress and will be available soon. This will allow you to run Crawl4AI in a containerized environment, ensuring consistency across different systems. - -## Option 3: Local Server Installation - -For those who prefer to run Crawl4AI as a local server, instructions will be provided once the Docker implementation is complete. - -## Verifying Your Installation - -After installation, you can verify that Crawl4AI is working correctly by running a simple Python script: - -```python -import asyncio -from crawl4ai import AsyncWebCrawler - -async def main(): - async with AsyncWebCrawler(verbose=True) as crawler: - result = await crawler.arun(url="https://www.example.com") - print(result.markdown[:500]) # Print first 500 characters - -if __name__ == "__main__": - asyncio.run(main()) -``` - -This script should successfully crawl the example website and print the first 500 characters of the extracted content. - -## Getting Help - -If you encounter any issues during installation or usage, please check the [documentation](https://crawl4ai.com/mkdocs/) or raise an issue on the [GitHub repository](https://github.com/unclecode/crawl4ai/issues). - -Happy crawling! 🕷️🤖 \ No newline at end of file diff --git a/docs/md_v2/basic/output-formats.md b/docs/md_v2/basic/output-formats.md deleted file mode 100644 index 3686c23c..00000000 --- a/docs/md_v2/basic/output-formats.md +++ /dev/null @@ -1,102 +0,0 @@ -# Output Formats - -Crawl4AI provides multiple output formats to suit different needs, ranging from raw HTML to structured data using LLM or pattern-based extraction, and versatile markdown outputs. - -## Basic Formats - -```python -result = await crawler.arun(url="https://example.com") - -# Access different formats -raw_html = result.html # Original HTML -clean_html = result.cleaned_html # Sanitized HTML -markdown_v2 = result.markdown_v2 # Detailed markdown generation results -fit_md = result.markdown_v2.fit_markdown # Most relevant content in markdown -``` - -> **Note**: The `markdown_v2` property will soon be replaced by `markdown`. It is recommended to start transitioning to using `markdown` for new implementations. - -## Raw HTML - -Original, unmodified HTML from the webpage. Useful when you need to: -- Preserve the exact page structure. -- Process HTML with your own tools. -- Debug page issues. - -```python -result = await crawler.arun(url="https://example.com") -print(result.html) # Complete HTML including headers, scripts, etc. -``` - -## Cleaned HTML - -Sanitized HTML with unnecessary elements removed. Automatically: -- Removes scripts and styles. -- Cleans up formatting. -- Preserves semantic structure. - -```python -config = CrawlerRunConfig( - excluded_tags=['form', 'header', 'footer'], # Additional tags to remove - keep_data_attributes=False # Remove data-* attributes -) -result = await crawler.arun(url="https://example.com", config=config) -print(result.cleaned_html) -``` - -## Standard Markdown - -HTML converted to clean markdown format. This output is useful for: -- Content analysis. -- Documentation. -- Readability. - -```python -config = CrawlerRunConfig( - markdown_generator=DefaultMarkdownGenerator( - options={"include_links": True} # Include links in markdown - ) -) -result = await crawler.arun(url="https://example.com", config=config) -print(result.markdown_v2.raw_markdown) # Standard markdown with links -``` - -## Fit Markdown - -Extract and convert only the most relevant content into markdown format. Best suited for: -- Article extraction. -- Focusing on the main content. -- Removing boilerplate. - -To generate `fit_markdown`, use a content filter like `PruningContentFilter`: - -```python -from crawl4ai.content_filter_strategy import PruningContentFilter - -config = CrawlerRunConfig( - content_filter=PruningContentFilter( - threshold=0.7, - threshold_type="dynamic", - min_word_threshold=100 - ) -) -result = await crawler.arun(url="https://example.com", config=config) -print(result.markdown_v2.fit_markdown) # Extracted main content in markdown -``` - -## Markdown with Citations - -Generate markdown that includes citations for links. This format is ideal for: -- Creating structured documentation. -- Including references for extracted content. - -```python -config = CrawlerRunConfig( - markdown_generator=DefaultMarkdownGenerator( - options={"citations": True} # Enable citations - ) -) -result = await crawler.arun(url="https://example.com", config=config) -print(result.markdown_v2.markdown_with_citations) -print(result.markdown_v2.references_markdown) # Citations section -``` diff --git a/docs/md_v2/basic/page-interaction.md b/docs/md_v2/basic/page-interaction.md deleted file mode 100644 index 07a2c9cd..00000000 --- a/docs/md_v2/basic/page-interaction.md +++ /dev/null @@ -1,190 +0,0 @@ -# Page Interaction - -Crawl4AI provides powerful features for interacting with dynamic webpages, handling JavaScript execution, and managing page events. - -## JavaScript Execution - -### Basic Execution - -```python -from crawl4ai.async_configs import CrawlerRunConfig - -# Single JavaScript command -config = CrawlerRunConfig( - js_code="window.scrollTo(0, document.body.scrollHeight);" -) -result = await crawler.arun(url="https://example.com", config=config) - -# Multiple commands -js_commands = [ - "window.scrollTo(0, document.body.scrollHeight);", - "document.querySelector('.load-more').click();", - "document.querySelector('#consent-button').click();" -] -config = CrawlerRunConfig(js_code=js_commands) -result = await crawler.arun(url="https://example.com", config=config) -``` - -## Wait Conditions - -### CSS-Based Waiting - -Wait for elements to appear: - -```python -config = CrawlerRunConfig(wait_for="css:.dynamic-content") # Wait for element with class 'dynamic-content' -result = await crawler.arun(url="https://example.com", config=config) -``` - -### JavaScript-Based Waiting - -Wait for custom conditions: - -```python -# Wait for number of elements -wait_condition = """() => { - return document.querySelectorAll('.item').length > 10; -}""" - -config = CrawlerRunConfig(wait_for=f"js:{wait_condition}") -result = await crawler.arun(url="https://example.com", config=config) - -# Wait for dynamic content to load -wait_for_content = """() => { - const content = document.querySelector('.content'); - return content && content.innerText.length > 100; -}""" - -config = CrawlerRunConfig(wait_for=f"js:{wait_for_content}") -result = await crawler.arun(url="https://example.com", config=config) -``` - -## Handling Dynamic Content - -### Load More Content - -Handle infinite scroll or load more buttons: - -```python -config = CrawlerRunConfig( - js_code=[ - "window.scrollTo(0, document.body.scrollHeight);", # Scroll to bottom - "const loadMore = document.querySelector('.load-more'); if(loadMore) loadMore.click();" # Click load more - ], - wait_for="js:() => document.querySelectorAll('.item').length > previousCount" # Wait for new content -) -result = await crawler.arun(url="https://example.com", config=config) -``` - -### Form Interaction - -Handle forms and inputs: - -```python -js_form_interaction = """ - document.querySelector('#search').value = 'search term'; // Fill form fields - document.querySelector('form').submit(); // Submit form -""" - -config = CrawlerRunConfig( - js_code=js_form_interaction, - wait_for="css:.results" # Wait for results to load -) -result = await crawler.arun(url="https://example.com", config=config) -``` - -## Timing Control - -### Delays and Timeouts - -Control timing of interactions: - -```python -config = CrawlerRunConfig( - page_timeout=60000, # Page load timeout (ms) - delay_before_return_html=2.0 # Wait before capturing content -) -result = await crawler.arun(url="https://example.com", config=config) -``` - -## Complex Interactions Example - -Here's an example of handling a dynamic page with multiple interactions: - -```python -from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig - -async def crawl_dynamic_content(): - async with AsyncWebCrawler() as crawler: - # Initial page load - config = CrawlerRunConfig( - js_code="document.querySelector('.cookie-accept')?.click();", # Handle cookie consent - wait_for="css:.main-content" - ) - result = await crawler.arun(url="https://example.com", config=config) - - # Load more content - session_id = "dynamic_session" # Keep session for multiple interactions - - for page in range(3): # Load 3 pages of content - config = CrawlerRunConfig( - session_id=session_id, - js_code=[ - "window.scrollTo(0, document.body.scrollHeight);", # Scroll to bottom - "window.previousCount = document.querySelectorAll('.item').length;", # Store item count - "document.querySelector('.load-more')?.click();" # Click load more - ], - wait_for="""() => { - const currentCount = document.querySelectorAll('.item').length; - return currentCount > window.previousCount; - }""", - js_only=(page > 0) # Execute JS without reloading page for subsequent interactions - ) - result = await crawler.arun(url="https://example.com", config=config) - print(f"Page {page + 1} items:", len(result.cleaned_html)) - - # Clean up session - await crawler.crawler_strategy.kill_session(session_id) -``` - -## Using with Extraction Strategies - -Combine page interaction with structured extraction: - -```python -from crawl4ai.extraction_strategy import JsonCssExtractionStrategy, LLMExtractionStrategy -from crawl4ai.async_configs import CrawlerRunConfig - -# Pattern-based extraction after interaction -schema = { - "name": "Dynamic Items", - "baseSelector": ".item", - "fields": [ - {"name": "title", "selector": "h2", "type": "text"}, - {"name": "description", "selector": ".desc", "type": "text"} - ] -} - -config = CrawlerRunConfig( - js_code="window.scrollTo(0, document.body.scrollHeight);", - wait_for="css:.item:nth-child(10)", # Wait for 10 items - extraction_strategy=JsonCssExtractionStrategy(schema) -) -result = await crawler.arun(url="https://example.com", config=config) - -# Or use LLM to analyze dynamic content -class ContentAnalysis(BaseModel): - topics: List[str] - summary: str - -config = CrawlerRunConfig( - js_code="document.querySelector('.show-more').click();", - wait_for="css:.full-content", - extraction_strategy=LLMExtractionStrategy( - provider="ollama/nemotron", - schema=ContentAnalysis.schema(), - instruction="Analyze the full content" - ) -) -result = await crawler.arun(url="https://example.com", config=config) -``` diff --git a/docs/md_v2/basic/quickstart.md b/docs/md_v2/basic/quickstart.md deleted file mode 100644 index ffc35986..00000000 --- a/docs/md_v2/basic/quickstart.md +++ /dev/null @@ -1,172 +0,0 @@ -# Quick Start Guide 🚀 - -Welcome to the Crawl4AI Quickstart Guide! In this tutorial, we'll walk you through the basic usage of Crawl4AI, covering everything from initial setup to advanced features like chunking and extraction strategies, using asynchronous programming. Let's dive in! 🌟 - ---- - -## Getting Started 🛠️ - -Set up your environment with `BrowserConfig` and create an `AsyncWebCrawler` instance. - -```python -import asyncio -from crawl4ai import AsyncWebCrawler -from crawl4ai.async_configs import BrowserConfig - -async def main(): - browser_config = BrowserConfig(verbose=True) - async with AsyncWebCrawler(config=browser_config) as crawler: - # Add your crawling logic here - pass - -if __name__ == "__main__": - asyncio.run(main()) -``` - ---- - -### Basic Usage - -Provide a URL and let Crawl4AI do the work! - -```python -from crawl4ai.async_configs import CrawlerRunConfig - -async def main(): - browser_config = BrowserConfig(verbose=True) - crawl_config = CrawlerRunConfig(url="https://www.nbcnews.com/business") - async with AsyncWebCrawler(config=browser_config) as crawler: - result = await crawler.arun(config=crawl_config) - print(f"Basic crawl result: {result.markdown[:500]}") # Print first 500 characters - -if __name__ == "__main__": - asyncio.run(main()) -``` - ---- - -### Taking Screenshots 📸 - -Capture and save webpage screenshots with `CrawlerRunConfig`: - -```python -from crawl4ai.async_configs import CacheMode - -async def capture_and_save_screenshot(url: str, output_path: str): - browser_config = BrowserConfig(verbose=True) - crawl_config = CrawlerRunConfig( - url=url, - screenshot=True, - cache_mode=CacheMode.BYPASS - ) - async with AsyncWebCrawler(config=browser_config) as crawler: - result = await crawler.arun(config=crawl_config) - - if result.success and result.screenshot: - import base64 - screenshot_data = base64.b64decode(result.screenshot) - with open(output_path, 'wb') as f: - f.write(screenshot_data) - print(f"Screenshot saved successfully to {output_path}") - else: - print("Failed to capture screenshot") -``` - ---- - -### Browser Selection 🌐 - -Choose from multiple browser engines using `BrowserConfig`: - -```python -from crawl4ai.async_configs import BrowserConfig - -# Use Firefox -firefox_config = BrowserConfig(browser_type="firefox", verbose=True, headless=True) -async with AsyncWebCrawler(config=firefox_config) as crawler: - result = await crawler.arun(config=CrawlerRunConfig(url="https://www.example.com")) - -# Use WebKit -webkit_config = BrowserConfig(browser_type="webkit", verbose=True, headless=True) -async with AsyncWebCrawler(config=webkit_config) as crawler: - result = await crawler.arun(config=CrawlerRunConfig(url="https://www.example.com")) - -# Use Chromium (default) -chromium_config = BrowserConfig(verbose=True, headless=True) -async with AsyncWebCrawler(config=chromium_config) as crawler: - result = await crawler.arun(config=CrawlerRunConfig(url="https://www.example.com")) -``` - ---- - -### User Simulation 🎭 - -Simulate real user behavior to bypass detection: - -```python -from crawl4ai.async_configs import BrowserConfig, CrawlerRunConfig - -browser_config = BrowserConfig(verbose=True, headless=True) -crawl_config = CrawlerRunConfig( - url="YOUR-URL-HERE", - cache_mode=CacheMode.BYPASS, - simulate_user=True, # Random mouse movements and clicks - override_navigator=True # Makes the browser appear like a real user -) -async with AsyncWebCrawler(config=browser_config) as crawler: - result = await crawler.arun(config=crawl_config) -``` - ---- - -### Understanding Parameters 🧠 - -Explore caching and forcing fresh crawls: - -```python -async def main(): - browser_config = BrowserConfig(verbose=True) - - async with AsyncWebCrawler(config=browser_config) as crawler: - # First crawl (uses cache) - result1 = await crawler.arun(config=CrawlerRunConfig(url="https://www.nbcnews.com/business")) - print(f"First crawl result: {result1.markdown[:100]}...") - - # Force fresh crawl - result2 = await crawler.arun( - config=CrawlerRunConfig(url="https://www.nbcnews.com/business", cache_mode=CacheMode.BYPASS) - ) - print(f"Second crawl result: {result2.markdown[:100]}...") - -if __name__ == "__main__": - asyncio.run(main()) -``` - ---- - -### Adding a Chunking Strategy 🧩 - -Split content into chunks using `RegexChunking`: - -```python -from crawl4ai.chunking_strategy import RegexChunking - -async def main(): - browser_config = BrowserConfig(verbose=True) - crawl_config = CrawlerRunConfig( - url="https://www.nbcnews.com/business", - chunking_strategy=RegexChunking(patterns=["\n\n"]) - ) - async with AsyncWebCrawler(config=browser_config) as crawler: - result = await crawler.arun(config=crawl_config) - print(f"RegexChunking result: {result.extracted_content[:200]}...") - -if __name__ == "__main__": - asyncio.run(main()) -``` - ---- - -### Advanced Features and Configurations - -For advanced examples (LLM strategies, knowledge graphs, pagination handling), ensure all code aligns with the `BrowserConfig` and `CrawlerRunConfig` pattern shown above. diff --git a/docs/md_v2/blog/articles/dockerize_hooks.md b/docs/md_v2/blog/articles/dockerize_hooks.md index 965388ee..4866c224 100644 --- a/docs/md_v2/blog/articles/dockerize_hooks.md +++ b/docs/md_v2/blog/articles/dockerize_hooks.md @@ -34,9 +34,9 @@ sequenceDiagram **Benefits for Developers and Users** -1. **Fine-Grained Control**: Instead of predefining all logic upfront, you can dynamically guide the crawler in response to actual data and conditions encountered mid-crawl. -2. **Real-Time Insights**: Monitor progress, errors, or network bottlenecks as they happen, without waiting for the entire crawl to finish. -3. **Enhanced Collaboration**: Different team members or automated systems can watch the same crawl events and provide input, making the crawling process more adaptive and intelligent. +1. **Fine-Grained Control**: Instead of predefining all logic upfront, you can dynamically guide the crawler in response to actual data and conditions encountered mid-crawl. +2. **Real-Time Insights**: Monitor progress, errors, or network bottlenecks as they happen, without waiting for the entire crawl to finish. +3. **Enhanced Collaboration**: Different team members or automated systems can watch the same crawl events and provide input, making the crawling process more adaptive and intelligent. **Next Steps** diff --git a/docs/md_v2/blog/releases/0.4.2.md b/docs/md_v2/blog/releases/0.4.2.md index 6f8f39e9..1386979a 100644 --- a/docs/md_v2/blog/releases/0.4.2.md +++ b/docs/md_v2/blog/releases/0.4.2.md @@ -72,9 +72,9 @@ Two big upgrades here: ### 🔠 **Use Cases You’ll Love** -1. **Authenticated Crawls**: Login once, export your storage state, and reuse it across multiple requests without the headache. -2. **Long-page Screenshots**: Perfect for blogs, e-commerce pages, or any endless-scroll website. -3. **PDF Export**: Create professional-looking page PDFs in seconds. +1. **Authenticated Crawls**: Login once, export your storage state, and reuse it across multiple requests without the headache. +2. **Long-page Screenshots**: Perfect for blogs, e-commerce pages, or any endless-scroll website. +3. **PDF Export**: Create professional-looking page PDFs in seconds. --- diff --git a/docs/md_v2/core/browser-crawler-config.md b/docs/md_v2/core/browser-crawler-config.md new file mode 100644 index 00000000..11fa3493 --- /dev/null +++ b/docs/md_v2/core/browser-crawler-config.md @@ -0,0 +1,248 @@ +# Browser & Crawler Configuration (Quick Overview) + +Crawl4AI’s flexibility stems from two key classes: + +1. **`BrowserConfig`** – Dictates **how** the browser is launched and behaves (e.g., headless or visible, proxy, user agent). +2. **`CrawlerRunConfig`** – Dictates **how** each **crawl** operates (e.g., caching, extraction, timeouts, JavaScript code to run, etc.). + +In most examples, you create **one** `BrowserConfig` for the entire crawler session, then pass a **fresh** or re-used `CrawlerRunConfig` whenever you call `arun()`. This tutorial shows the most commonly used parameters. If you need advanced or rarely used fields, see the [Configuration Parameters](../api/parameters.md). + +--- + +## 1. BrowserConfig Essentials + +```python +class BrowserConfig: + def __init__( + browser_type="chromium", + headless=True, + proxy_config=None, + viewport_width=1080, + viewport_height=600, + verbose=True, + use_persistent_context=False, + user_data_dir=None, + cookies=None, + headers=None, + user_agent=None, + text_mode=False, + light_mode=False, + extra_args=None, + # ... other advanced parameters omitted here + ): + ... +``` + +### Key Fields to Note + + + +1. **`browser_type`** +- Options: `"chromium"`, `"firefox"`, or `"webkit"`. +- Defaults to `"chromium"`. +- If you need a different engine, specify it here. + +2. **`headless`** + - `True`: Runs the browser in headless mode (invisible browser). + - `False`: Runs the browser in visible mode, which helps with debugging. + +3. **`proxy_config`** + - A dictionary with fields like: +```json +{ + "server": "http://proxy.example.com:8080", + "username": "...", + "password": "..." +} +``` + - Leave as `None` if a proxy is not required. + +4. **`viewport_width` & `viewport_height`**: + - The initial window size. + - Some sites behave differently with smaller or bigger viewports. + +5. **`verbose`**: + - If `True`, prints extra logs. + - Handy for debugging. + +6. **`use_persistent_context`**: + - If `True`, uses a **persistent** browser profile, storing cookies/local storage across runs. + - Typically also set `user_data_dir` to point to a folder. + +7. **`cookies`** & **`headers`**: + - If you want to start with specific cookies or add universal HTTP headers, set them here. + - E.g. `cookies=[{"name": "session", "value": "abc123", "domain": "example.com"}]`. + +8. **`user_agent`**: + - Custom User-Agent string. If `None`, a default is used. + - You can also set `user_agent_mode="random"` for randomization (if you want to fight bot detection). + +9. **`text_mode`** & **`light_mode`**: + - `text_mode=True` disables images, possibly speeding up text-only crawls. + - `light_mode=True` turns off certain background features for performance. + +10. **`extra_args`**: + - Additional flags for the underlying browser. + - E.g. `["--disable-extensions"]`. + +**Minimal Example**: + +```python +from crawl4ai import AsyncWebCrawler, BrowserConfig + +browser_conf = BrowserConfig( + browser_type="firefox", + headless=False, + text_mode=True +) + +async with AsyncWebCrawler(config=browser_conf) as crawler: + result = await crawler.arun("https://example.com") + print(result.markdown[:300]) +``` + +--- + +## 2. CrawlerRunConfig Essentials + +```python +class CrawlerRunConfig: + def __init__( + word_count_threshold=200, + extraction_strategy=None, + markdown_generator=None, + cache_mode=None, + js_code=None, + wait_for=None, + screenshot=False, + pdf=False, + verbose=True, + # ... other advanced parameters omitted + ): + ... +``` + +### Key Fields to Note + +1. **`word_count_threshold`**: + - The minimum word count before a block is considered. + - If your site has lots of short paragraphs or items, you can lower it. + +2. **`extraction_strategy`**: + - Where you plug in JSON-based extraction (CSS, LLM, etc.). + - If `None`, no structured extraction is done (only raw/cleaned HTML + markdown). + +3. **`markdown_generator`**: + - E.g., `DefaultMarkdownGenerator(...)`, controlling how HTML→Markdown conversion is done. + - If `None`, a default approach is used. + +4. **`cache_mode`**: + - Controls caching behavior (`ENABLED`, `BYPASS`, `DISABLED`, etc.). + - If `None`, defaults to some level of caching or you can specify `CacheMode.ENABLED`. + +5. **`js_code`**: + - A string or list of JS strings to execute. + - Great for “Load More” buttons or user interactions. + +6. **`wait_for`**: + - A CSS or JS expression to wait for before extracting content. + - Common usage: `wait_for="css:.main-loaded"` or `wait_for="js:() => window.loaded === true"`. + +7. **`screenshot`** & **`pdf`**: + - If `True`, captures a screenshot or PDF after the page is fully loaded. + - The results go to `result.screenshot` (base64) or `result.pdf` (bytes). + +8. **`verbose`**: + - Logs additional runtime details. + - Overlaps with the browser’s verbosity if also set to `True` in `BrowserConfig`. + +**Minimal Example**: + +```python +from crawl4ai import AsyncWebCrawler, CrawlerRunConfig + +crawl_conf = CrawlerRunConfig( + js_code="document.querySelector('button#loadMore')?.click()", + wait_for="css:.loaded-content", + screenshot=True +) + +async with AsyncWebCrawler() as crawler: + result = await crawler.arun(url="https://example.com", config=crawl_conf) + print(result.screenshot[:100]) # Base64-encoded PNG snippet +``` + +--- + +## 3. Putting It All Together + +In a typical scenario, you define **one** `BrowserConfig` for your crawler session, then create **one or more** `CrawlerRunConfig` depending on each call’s needs: + +```python +import asyncio +from crawl4ai import AsyncWebCrawler, BrowserConfig, CrawlerRunConfig, CacheMode +from crawl4ai.extraction_strategy import JsonCssExtractionStrategy + +async def main(): + # 1) Browser config: headless, bigger viewport, no proxy + browser_conf = BrowserConfig( + headless=True, + viewport_width=1280, + viewport_height=720 + ) + + # 2) Example extraction strategy + schema = { + "name": "Articles", + "baseSelector": "div.article", + "fields": [ + {"name": "title", "selector": "h2", "type": "text"}, + {"name": "link", "selector": "a", "type": "attribute", "attribute": "href"} + ] + } + extraction = JsonCssExtractionStrategy(schema) + + # 3) Crawler run config: skip cache, use extraction + run_conf = CrawlerRunConfig( + extraction_strategy=extraction, + cache_mode=CacheMode.BYPASS + ) + + async with AsyncWebCrawler(config=browser_conf) as crawler: + # 4) Execute the crawl + result = await crawler.arun(url="https://example.com/news", config=run_conf) + + if result.success: + print("Extracted content:", result.extracted_content) + else: + print("Error:", result.error_message) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +--- + +## 4. Next Steps + +For a **detailed list** of available parameters (including advanced ones), see: + +- [BrowserConfig and CrawlerRunConfig Reference](../api/parameters.md) + +You can explore topics like: + +- **Custom Hooks & Auth** (Inject JavaScript or handle login forms). +- **Session Management** (Re-use pages, preserve state across multiple calls). +- **Magic Mode** or **Identity-based Crawling** (Fight bot detection by simulating user behavior). +- **Advanced Caching** (Fine-tune read/write cache modes). + +--- + +## 5. Conclusion + +**BrowserConfig** and **CrawlerRunConfig** give you straightforward ways to define: + +- **Which** browser to launch, how it should run, and any proxy or user agent needs. +- **How** each crawl should behave—caching, timeouts, JavaScript code, extraction strategies, etc. + +Use them together for **clear, maintainable** code, and when you need more specialized behavior, check out the advanced parameters in the [reference docs](../api/parameters.md). Happy crawling! \ No newline at end of file diff --git a/docs/md_v2/basic/cache-modes.md b/docs/md_v2/core/cache-modes.md similarity index 86% rename from docs/md_v2/basic/cache-modes.md rename to docs/md_v2/core/cache-modes.md index 73460e57..b0aab78a 100644 --- a/docs/md_v2/basic/cache-modes.md +++ b/docs/md_v2/core/cache-modes.md @@ -49,7 +49,8 @@ from crawl4ai import AsyncWebCrawler, CacheMode from crawl4ai.async_configs import CrawlerRunConfig async def use_proxy(): - config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS) # Use CacheMode in CrawlerRunConfig + # Use CacheMode in CrawlerRunConfig + config = CrawlerRunConfig(cache_mode=CacheMode.BYPASS) async with AsyncWebCrawler(verbose=True) as crawler: result = await crawler.arun( url="https://www.nbcnews.com/business", @@ -71,11 +72,4 @@ if __name__ == "__main__": | `bypass_cache=True` | `cache_mode=CacheMode.BYPASS` | | `disable_cache=True` | `cache_mode=CacheMode.DISABLED`| | `no_cache_read=True` | `cache_mode=CacheMode.WRITE_ONLY` | -| `no_cache_write=True` | `cache_mode=CacheMode.READ_ONLY` | - -## Suppressing Deprecation Warnings -If you need time to migrate, you can temporarily suppress deprecation warnings: -```python -# In your config.py -SHOW_DEPRECATION_WARNINGS = False -``` +| `no_cache_write=True` | `cache_mode=CacheMode.READ_ONLY` | \ No newline at end of file diff --git a/docs/md_v2/core/content-selection.md b/docs/md_v2/core/content-selection.md new file mode 100644 index 00000000..9774f9a7 --- /dev/null +++ b/docs/md_v2/core/content-selection.md @@ -0,0 +1,332 @@ +# Content Selection + +Crawl4AI provides multiple ways to **select**, **filter**, and **refine** the content from your crawls. Whether you need to target a specific CSS region, exclude entire tags, filter out external links, or remove certain domains and images, **`CrawlerRunConfig`** offers a wide range of parameters. + +Below, we show how to configure these parameters and combine them for precise control. + +--- + +## 1. CSS-Based Selection + +A straightforward way to **limit** your crawl results to a certain region of the page is **`css_selector`** in **`CrawlerRunConfig`**: + +```python +import asyncio +from crawl4ai import AsyncWebCrawler, CrawlerRunConfig + +async def main(): + config = CrawlerRunConfig( + # e.g., first 30 items from Hacker News + css_selector=".athing:nth-child(-n+30)" + ) + async with AsyncWebCrawler() as crawler: + result = await crawler.arun( + url="https://news.ycombinator.com/newest", + config=config + ) + print("Partial HTML length:", len(result.cleaned_html)) + +if __name__ == "__main__": + asyncio.run(main()) +``` + +**Result**: Only elements matching that selector remain in `result.cleaned_html`. + +--- + +## 2. Content Filtering & Exclusions + +### 2.1 Basic Overview + +```python +config = CrawlerRunConfig( + # Content thresholds + word_count_threshold=10, # Minimum words per block + + # Tag exclusions + excluded_tags=['form', 'header', 'footer', 'nav'], + + # Link filtering + exclude_external_links=True, + exclude_social_media_links=True, + # Block entire domains + exclude_domains=["adtrackers.com", "spammynews.org"], + exclude_social_media_domains=["facebook.com", "twitter.com"], + + # Media filtering + exclude_external_images=True +) +``` + +**Explanation**: + +- **`word_count_threshold`**: Ignores text blocks under X words. Helps skip trivial blocks like short nav or disclaimers. +- **`excluded_tags`**: Removes entire tags (``, `
`, `