Files
2024-07-04 11:34:32 +08:00

3.9 KiB

Documentation

  • Class name: LLMSaltWebCrawler
  • Category: SALT/Language Toolkit/Tools
  • Output node: False

LLMSaltWebCrawler节点是为网络爬虫和数据抓取而设计的,能够在网页间导航以收集数据。它支持深度控制、域名排除、SSL验证和基于关键词的相关性过滤等功能,以高效地从指定URL收集和解析内容。

Input types

Required

Optional

  • url
    • 网络爬虫的起始URL。它对定义爬虫范围至关重要,并作为爬虫过程的入口点。
    • Comfy dtype: STRING
    • Python dtype: str
  • urls
    • 要爬取的URL列表。这允许多个入口点,扩大了爬取的广度。
    • Comfy dtype: LIST
    • Python dtype: list
  • max_depth
    • 定义爬虫应从起始URL导航的深度。它将爬取限制在指定的深度,以管理范围和资源。
    • Comfy dtype: INT
    • Python dtype: int
  • max_links
    • 限制每页要跟随的链接数量,控制收集的数据量并管理资源使用。
    • Comfy dtype: INT
    • Python dtype: int
  • trim_line_breaks
    • 一个标志,用于指示是否从爬取过程中提取的文本中删除换行符,有助于数据清洁。
    • Comfy dtype: BOOLEAN
    • Python dtype: bool
  • verify_ssl
    • 决定在发出请求时是否验证SSL证书,通过避免潜在的有害站点来增强安全性。
    • Comfy dtype: BOOLEAN
    • Python dtype: bool
  • exclude_domains
    • 指定要从爬取中排除的域名,通过避免不相关或不需要的站点来允许更有针对性的数据收集。
    • Comfy dtype: STRING
    • Python dtype: str
  • keywords
    • 用于基于相关性过滤内容的关键词列表,确保收集的数据与特定兴趣或主题相关。
    • Comfy dtype: STRING
    • Python dtype: str

Output types

  • documents
    • Comfy dtype: DOCUMENT
    • 输出是文档列表,每个文档包含从爬取的网页中获取的结构化数据,包括URL、标题、文本和找到的链接,组织得便于处理和分析。
    • Python dtype: list

Usage tips

  • Infra type: CPU
  • Common nodes: unknown

Source code

class LLMSaltWebCrawler:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {},
            "optional": {
                "url": ("STRING", {}),
                "urls": ("LIST", {}),
                "max_depth": ("INT", {"min": 1, "max": 4, "default": 2}),
                "max_links": ("INT", {"min": 1, "max": 6, "default": 2}),
                "trim_line_breaks": ("BOOLEAN", {"default": True}),
                "verify_ssl": ("BOOLEAN", {"default": True}),
                "exclude_domains": ("STRING", {"multiline": True, "dynamicPrompts": False, "placeholder": "Optional exclude domains, eg: example.com, example2.com"}),
                "keywords": ("STRING", {"multiline": True, "dynamicPrompts": False, "placeholder": "Optional relevancy keywords, eg: artificial intelligence, ai"})
            }
        }
    

    RETURN_TYPES = ("DOCUMENT",)
    RETURN_NAMES = ("documents",)

    FUNCTION = "crawl"
    CATEGORY = f"{MENU_NAME}/{SUB_MENU_NAME}/Tools"

    def crawl(self, url:str="google.com", urls:list=None, max_depth:int=2, max_links:int=2, trim_line_breaks:bool=True, verify_ssl:bool=True, exclude_domains:str="", keywords:str="") -> list:

        search_urls = []
        if not url.strip() and not urls:
            raise Exception("Please provide at lease one URL")
        
        url = url.strip()
        if url != "" and valid_url(url):
            search_urls.append(url)
        if urls:
            search_urls.extend([url for url in urls if valid_url(url)])

        logger.info("Valid URLs:")
        logger.info(search_urls)

        crawler = WebCrawler(search_urls, exclude_domains=exclude_domains, relevancy_keywords=keywords, max_links=max_links)

        results = crawler.parse_sites(crawl=True, max_depth=max_depth, trim_line_breaks=trim_line_breaks, verify_ssl=verify_ssl)

        return (results.to_documents(), )