递归URL加载器#

class langchain_community.document_loaders.recursive_url_loader.RecursiveUrlLoader(url: str, max_depth: int | None = 2, use_async: bool | None = None, extractor: Callable[[str], str] | None = None, metadata_extractor: Callable[[str, str], dict] | Callable[[str, str, Response | ClientResponse], dict] | None = None, exclude_dirs: Sequence[str] | None = (), timeout: int | None = 10, prevent_outside: bool = True, link_regex: str | Pattern | None = None, headers: dict | None = None, check_response_status: bool = False, continue_on_failure: bool = True, *, base_url: str | None = None, autoset_encoding: bool = True, encoding: str | None = None, proxies: dict | None = None)[source]#

从根URL递归加载所有子链接。

Security Note: This loader is a crawler that will start crawling

在给定的URL上,然后递归地扩展到爬取子链接。

网络爬虫通常不应部署为具有对任何内部服务器的网络访问权限。

控制谁可以提交爬取请求以及爬虫具有的网络访问权限。

在爬取过程中,爬虫可能会遇到恶意URL,这些URL可能导致服务器端请求伪造(SSRF)攻击。

为了降低风险,爬虫默认只会加载与起始URL相同域的URL(通过prevent_outside命名参数控制)。

这将减轻SSRF攻击的风险,但不会完全消除它。

例如,如果抓取一个托管多个站点的主机:

https://some_host/alice_site/ https://some_host/bob_site/

Alice网站上的恶意URL可能会导致爬虫向Bob网站上的一个端点发出恶意GET请求。这两个网站托管在同一主机上,因此默认情况下不会阻止此类请求。

参见 https://python.langchain.com/docs/security/

设置:

这个类没有必需的额外依赖项。您可以选择安装 beautifulsoup4 以获取更丰富的默认元数据提取:

pip install -U beautifulsoup4
Instantiate:
from langchain_community.document_loaders import RecursiveUrlLoader

loader = RecursiveUrlLoader(
    "https://docs.python.org/3.9/",
    # max_depth=2,
    # use_async=False,
    # extractor=None,
    # metadata_extractor=None,
    # exclude_dirs=(),
    # timeout=10,
    # check_response_status=True,
    # continue_on_failure=True,
    # prevent_outside=True,
    # base_url=None,
    # ...
)
Lazy load:
docs = []
docs_lazy = loader.lazy_load()

# async variant:
# docs_lazy = await loader.alazy_load()

for doc in docs_lazy:
    docs.append(doc)
print(docs[0].page_content[:100])
print(docs[0].metadata)
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" /><
{'source': 'https://docs.python.org/3.9/', 'content_type': 'text/html', 'title': '3.9.19 Documentation', 'language': None}
Async load:
docs = await loader.aload()
print(docs[0].page_content[:100])
print(docs[0].metadata)
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" /><
{'source': 'https://docs.python.org/3.9/', 'content_type': 'text/html', 'title': '3.9.19 Documentation', 'language': None}
Content parsing / extraction:

默认情况下,加载器将每个链接的原始 HTML 设置为文档页面内容。要将此 HTML 解析为更人性化/LLM 友好的格式,您可以传入一个自定义的 extractor 方法:

# This example uses `beautifulsoup4` and `lxml`
import re
from bs4 import BeautifulSoup

def bs4_extractor(html: str) -> str:
    soup = BeautifulSoup(html, "lxml")
    return re.sub(r"

+”, “

“, soup.text).strip()

loader = RecursiveUrlLoader(

https://docs.python.org/3.9/”, 提取器=bs4_extractor,

) print(loader.load()[0].page_content[:200])

3.9.19 Documentation

Download
Download these documents
Docs by version

Python 3.13 (in development)
Python 3.12 (stable)
Python 3.11 (security-fixes)
Python 3.10 (security-fixes)
Python 3.9 (securit
Metadata extraction:

与内容提取类似,您可以指定一个元数据提取函数来定制如何从HTTP响应中提取文档元数据。

import aiohttp
import requests
from typing import Union

def simple_metadata_extractor(
    raw_html: str, url: str, response: Union[requests.Response, aiohttp.ClientResponse]
) -> dict:
    content_type = getattr(response, "headers").get("Content-Type", "")
    return {"source": url, "content_type": content_type}

loader = RecursiveUrlLoader(
    "https://docs.python.org/3.9/",
    metadata_extractor=simple_metadata_extractor,
)
loader.load()[0].metadata
{'source': 'https://docs.python.org/3.9/', 'content_type': 'text/html'}
Filtering URLs:

你可能并不总是想从一个网站拉取每个URL。有四个参数允许我们控制我们递归拉取的URL。首先,我们可以设置prevent_outside参数来防止拉取base_url之外的URL。请注意,base_url不需要与我们传入的URL相同,如下所示。我们还可以使用link_regexexclude_dirs来更具体地选择我们想要的URL。在这个例子中,我们只从包含字符串“index”的python文档中拉取网站,并且这些网站不位于网站的FAQ部分。

loader = RecursiveUrlLoader(
    "https://docs.python.org/3.9/",
    prevent_outside=True,
    base_url="https://docs.python.org",
    link_regex=r'<a\s+(?:[^>]*?\s+)?href="([^"]*(?=index)[^"]*)"',
    exclude_dirs=['https://docs.python.org/3.9/faq']
)
docs = loader.load()
['https://docs.python.org/3.9/',
'https://docs.python.org/3.9/py-modindex.html',
'https://docs.python.org/3.9/genindex.html',
'https://docs.python.org/3.9/tutorial/index.html',
'https://docs.python.org/3.9/using/index.html',
'https://docs.python.org/3.9/extending/index.html',
'https://docs.python.org/3.9/installing/index.html',
'https://docs.python.org/3.9/library/index.html',
'https://docs.python.org/3.9/c-api/index.html',
'https://docs.python.org/3.9/howto/index.html',
'https://docs.python.org/3.9/distributing/index.html',
'https://docs.python.org/3.9/reference/index.html',
'https://docs.python.org/3.9/whatsnew/index.html']

使用要爬取的URL和要排除的任何子目录进行初始化。

Parameters:
  • url (str) – 要爬取的URL。

  • max_depth (Optional[int]) – 递归加载的最大深度。

  • use_async (Optional[bool]) – 是否使用异步加载。 如果为True,lazy_load函数将不会延迟加载,但它仍将以预期的方式工作,只是不延迟。

  • extractor (可选[Callable[[str], str]]) – 一个从原始HTML中提取文档内容的函数。 当提取函数返回空字符串时,文档将被忽略。默认返回原始HTML。

  • metadata_extractor (可选[_MetadataExtractorType]) –

    一个从参数中提取元数据的函数:原始HTML、源URL和requests.Response/aiohttp.ClientResponse对象(参数按此顺序)。 默认的提取器将尝试使用BeautifulSoup4来提取页面的标题、描述和语言。 ..code-block:: python

    import requests import aiohttp

    def simple_metadata_extractor(

    raw_html: str, url: str, response: Union[requests.Response, aiohttp.ClientResponse]

    ) -> dict:

    content_type = getattr(response, “headers”).get(“Content-Type”, “”) return {“source”: url, “content_type”: content_type}

  • exclude_dirs (可选[序列[str]]) – 要排除的子目录列表。

  • timeout (可选[int]) – 请求的超时时间,单位为秒。如果为 None,则连接不会超时。

  • prevent_outside (bool) – 如果为True,阻止从不是根URL子级的URL加载。

  • link_regex (Union[str, re.Pattern, None]) – 用于从网页的原始HTML中提取子链接的正则表达式。

  • headers (可选[字典]) – 用于所有请求的默认请求头。

  • check_response_status (bool) – 如果为True,检查HTTP响应状态并跳过具有错误响应(400-599)的URL。

  • continue_on_failure (bool) – 如果为True,则在获取或解析链接时引发异常时继续。否则,引发异常。

  • base_url (可选[str]) – 用于检查外部链接的基础URL。

  • autoset_encoding (bool) – 是否自动设置响应的编码。 如果为True,响应的编码将被设置为明显的编码,除非encoding参数已经被显式设置。

  • encoding (可选[str]) – 响应的编码。如果手动设置,无论autoset_encoding参数如何,编码都将设置为给定值。

  • proxies (可选[字典]) –

    一个将协议名称映射到代理URL的字典,用于请求。 这允许爬虫通过指定的代理服务器路由其请求。 如果为None,则不使用代理,请求将直接发送到目标URL。 示例用法: ..code-block:: python

    proxies = {

    “http”: “http://10.10.1.10:3128”, “https”: “https://10.10.1.10:1080”,

    }

方法

__init__(url[, max_depth, use_async, ...])

使用要爬取的URL和要排除的任何子目录进行初始化。

alazy_load()

一个用于文档的懒加载器。

aload()

将数据加载到Document对象中。

lazy_load()

懒加载网页。

load()

将数据加载到Document对象中。

load_and_split([text_splitter])

加载文档并将其分割成块。

__init__(url: str, max_depth: int | None = 2, use_async: bool | None = None, extractor: Callable[[str], str] | None = None, metadata_extractor: Callable[[str, str], dict] | Callable[[str, str, Response | ClientResponse], dict] | None = None, exclude_dirs: Sequence[str] | None = (), timeout: int | None = 10, prevent_outside: bool = True, link_regex: str | Pattern | None = None, headers: dict | None = None, check_response_status: bool = False, continue_on_failure: bool = True, *, base_url: str | None = None, autoset_encoding: bool = True, encoding: str | None = None, proxies: dict | None = None) None[source]#

使用要爬取的URL和要排除的任何子目录进行初始化。

Parameters:
  • url (str) – 要爬取的URL。

  • max_depth (int | None) – 递归加载的最大深度。

  • use_async (bool | None) – 是否使用异步加载。 如果为True,lazy_load函数将不会延迟加载,但它仍将以预期的方式工作,只是不延迟。

  • extractor (Callable[[str], str] | None) – 一个用于从原始HTML中提取文档内容的函数。 当提取函数返回空字符串时,文档将被忽略。默认返回原始HTML。

  • metadata_extractor (Callable[[str, str], dict] | Callable[[str, str, Response | ClientResponse], dict] | None) –

    一个用于从参数中提取元数据的函数:原始HTML、源URL和requests.Response/aiohttp.ClientResponse对象(参数按此顺序)。 默认的提取器将尝试使用BeautifulSoup4来提取页面的标题、描述和语言。 ..code-block:: python

    import requests import aiohttp

    def simple_metadata_extractor(

    raw_html: str, url: str, response: Union[requests.Response, aiohttp.ClientResponse]

    ) -> dict:

    content_type = getattr(response, “headers”).get(“Content-Type”, “”) return {“source”: url, “content_type”: content_type}

  • exclude_dirs (Sequence[str] | None) – 要排除的子目录列表。

  • timeout (int | None) – 请求的超时时间,单位为秒。如果为 None,则连接不会超时。

  • prevent_outside (bool) – 如果为True,阻止从不是根URL子级的URL加载。

  • link_regex (str | Pattern | None) – 用于从网页的原始HTML中提取子链接的正则表达式。

  • headers (dict | None) – 用于所有请求的默认请求头。

  • check_response_status (bool) – 如果为True,检查HTTP响应状态并跳过具有错误响应(400-599)的URL。

  • continue_on_failure (bool) – 如果为True,则在获取或解析链接时引发异常时继续。否则,引发异常。

  • base_url (str | None) – 用于检查外部链接的基础URL。

  • autoset_encoding (bool) – 是否自动设置响应的编码。 如果为True,响应的编码将被设置为明显的编码,除非encoding参数已经被显式设置。

  • encoding (str | None) – 响应的编码。如果手动设置,编码将被设置为给定值,无论autoset_encoding参数如何。

  • proxies (dict | None) –

    一个将协议名称映射到代理URL的字典,用于请求。 这允许爬虫通过指定的代理服务器路由其请求。 如果为None,则不使用代理,请求将直接发送到目标URL。 示例用法: ..code-block:: python

    proxies = {

    “http”: “http://10.10.1.10:3128”, “https”: “https://10.10.1.10:1080”,

    }

Return type:

async alazy_load() AsyncIterator[Document]#

文档的懒加载器。

Return type:

AsyncIterator[Document]

async aload() list[Document]#

将数据加载到Document对象中。

Return type:

列表[Document]

lazy_load() Iterator[Document][source]#

懒加载网页。 当 use_async 为 True 时,此函数将不会懒加载, 但它仍将以预期的方式工作,只是不懒加载。

Return type:

迭代器[文档]

load() list[Document]#

将数据加载到Document对象中。

Return type:

列表[Document]

load_and_split(text_splitter: TextSplitter | None = None) list[Document]#

加载文档并将其分割成块。块以文档形式返回。

不要重写此方法。它应该被视为已弃用!

Parameters:

text_splitter (可选[TextSplitter]) – 用于分割文档的TextSplitter实例。 默认为RecursiveCharacterTextSplitter。

Returns:

文档列表。

Return type:

列表[Document]

使用 RecursiveUrlLoader 的示例