Главная / Статьи

Настройки LangChain WebBaseLoader для сохранения текста страницы и удаления Chrome

WebBaseLoader загружает страницы в раздел Документы. SoupStrainer, заголовки, SSL, прокси-серверы, таймауты, ограничения скорости и сессии определяют, будет ли в процессе обработки RAG получен текст статьи или лишний навигационный контент.

Издатель: REACTAPP.TOP5 мин чтения1064 слов

Источники: Loading Web Pages in LangChain with WebBaseLoader

WebBaseLoader преобразует URL в объект LangChain Document. Стандартный метод загрузки часто смешивает основной текст статьи с боковыми панелями, навигацией и элементами поиска. Параметры конструктора позволяют контролировать процесс парсинга, заголовки запросов, использование SSL, прокси-серверов, таймауты, группировку операций, сессии и метаданные, что помогает пайплайнам сохранять только важный контент и игнорировать остальное. В приведённом ниже примере в качестве основы используется реальная страница документации, и каждый параметр рассматривается по отдельности.

Настройка

pip install langchain langchain-community beautifulsoup4

WebBaseLoader использует библиотеку beautifulsoup4 для парсинга HTML и библиотеку requests для выполнения HTTP-запросов. Их необходимо установить в той же среде, что и коммунити-загрузчики LangChain.

Веб-страница для эксперимента

https://reference.langchain.com/python/langchain-community/document_loaders/web_base/WebBaseLoader

Укажите загрузчику стабильный публичный URL документации, чтобы было легко сравнивать влияние различных параметров при последовательных запусках.

Конструктор

WebBaseLoader(
    web_path: Union[str, Sequence[str]] = '',
    header_template: Optional[dict] = None,
    verify_ssl: bool = True,
    proxies: Optional[dict] = None,
    continue_on_failure: bool = False,
    autoset_encoding: bool = True,
    encoding: Optional[str] = None,
    web_paths: Sequence[str] = (),
    requests_per_second: int = 2,
    default_parser: str = 'html.parser',
    requests_kwargs: Optional[Dict[str, Any]] = None,
    raise_for_status: bool = False,
    bs_get_text_kwargs: Optional[Dict[str, Any]] = None,
    bs_kwargs: Optional[Dict[str, Any]] = None,
    session: Any = None,
    *,
    show_progress: bool = True,
    trust_env: bool = False
)

Требуется только web_path. Все остальное настраивает поведение загрузки и парсинга для сайтов с большим количеством шума или строгих сетей.

web_path

web_path принимает один URL или список URL. Списки позволяют выполнять пакетную загрузку за один вызов; сочетайте их с ограничениями по частоте запросов и политиками обработки ошибок, описанными далее, чтобы один неисправный хост не замедлил всю работу.

bs_kwargs

bs_kwargs передаёт аргументы с ключами в BeautifulSoup. Полезным параметром является parse_only в сочетании с bs4.SoupStrainer, который ограничивает парсинг выбранными тегами и не включает вспомогательные элементы в page_content. Инструменты разработчика браузера помогают определить значимые теги на целевой странице — например, h1, содержащий заголовок. После фильтрации по этому тегу загрузчик возвращает сжатую строку вместо полного содержимого страницы, насыщенного дополнительными элементами.

bs_get_text_kwargs

После того как BeautifulSoup сужает структуру дерева, метод get_text() выравнивает её. Параметры для этого вызова передаются через bs_get_text_kwargs. Сочетание фильтра тегов (например, h2) с параметрами separator="|" и strip=True вставляет видимые разделители между соседними фрагментами текста и удаляет лишние пробелы, чтобы заголовки и метки не сливались в один блок в тексте документа.

default_parser

default_parser определяет парсер BeautifulSoup. Встроенный "html.parser" не требует дополнительных компонентов, но менее терпим к повреждённой разметке. На корректно сформированных страницах выбор парсера может не оказывать видимого влияния; однако при наличии беспорядочного HTML использование lxml или html5lib (если они установлены) может помочь восстановить структуру.

header_template

Некоторые хосты отклоняют простые пользовательские агенты Python с кодом ошибки HTTP 403. По умолчанию WebBaseLoader использует стандартный агент. Параметр header_template позволяет пользователю задавать заголовки, похожие на те, что используются браузерами:

requests.exceptions.HTTPError: 403 Client Error: Forbidden for url: ...
loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    header_template={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
                      "(KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36"
    }
)

Это изменение решает многие проблемы с кодом 403, но существуют и другие меры защиты от ботов. Перед массовой загрузкой необходимо соблюдать правила, указанные в файле robots.txt, и условия использования сайта.

verify_ssl и прокси

По умолчанию параметр verify_ssl установлен в значение True, поэтому недействительные или самоподписанные сертификаты приводят к немедленному отклонению запроса — это часто встречается на внутренних или тестовых хостах:

loader = WebBaseLoader(
    web_path="https://internal-staging-docs.example.com/overview",
    verify_ssl=False
)

Отключение проверки устраняет один из механизмов безопасности. Используйте это только при сборе данных с локальных или доверенных сетей, никогда не применяйте к процессам, загружающим произвольные публичные URL-адреса.

Параметр proxies определяет маршрутизацию запросов через HTTP- или HTTPS-прокси в формате, ожидаемом библиотекой requests:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    proxies={
        "http": "http://user:pass@proxyhost:port",
        "https": "https://user:pass@proxyhost:port",
    }
)

requests_kwargs и raise_for_status

requests_kwargs передаёт параметры непосредственно в основной запрос — таймауты, куки и всё остальное, что загрузчик не обрабатывает в первостепенном порядке:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    requests_kwargs={"timeout": 10}
)

Без таймаута застрявший сокет может блокировать функцию .load() навсегда. Для заданий, которые не находятся под пристальным контролем, его всегда следует установить.

raise_for_status по умолчанию равен False, поэтому ответы 404 или 500 всё равно возвращают документ с HTML-кодом ошибки. Установите его в True, чтобы быстро получать ошибку при плохом статусе:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    raise_for_status=True
)

continue_on_failure

При загрузке множества URL-адресов параметр continue_on_failure определяет, приведёт ли какая-либо исключение, тайм-аут или ошибочный статус к прерыванию обработки всей группы. При наличии недействительного третьего URL-адреса, если параметр raise_for_status установлен в значение false, а continue_on_failure=True, процесс может завершиться и вывести оставшиеся документы вместо того, чтобы остановиться при первой ошибке. Рекомендуется явно логировать пропущенные URL-адреса, чтобы скрытые пробелы не маскировали потерю данных.

autoset_encoding и encoding

Ответы представляют собой байты до момента декодирования. При установке параметра autoset_encoding=True (по умолчанию) библиотека requests пытается определить кодировку на основе заголовков и содержимого. Необходимо явно указать параметр encoding, если источник вводит ложные сведения о своей кодировке:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    encoding="utf-8"
)

Явное указание кодировки имеет приоритет даже в случае, когда функция автоматического определения кодировки включена.

requests_per_second и show_progress

Параметры для управления пакетной обработкой:

loader = WebBaseLoader(
    web_path=[
        "https://docs.langchain.com/oss/python/langchain/overview",
        "https://docs.langchain.com/oss/python/langchain/quickstart",
        "https://docs.langchain.com/oss/python/langchain/install",
    ],
    requests_per_second=1,
    show_progress=True
)

documents = loader.load()
print(len(documents))

requests_per_second ограничивает скорость запросов — уменьшите его при превышении лимитов или чтобы проявить уважение к исходному серверу. show_progress включает/выключает панель прогресса tqdm (по умолчанию включена); отключите её в сервисах, где панели прогресса мешают логам.

session и trust_env

Передавайте готовый объект requests.Session, когда необходимо совместно использовать кошки аутентификации, адаптеры повторных попыток или пулы соединений между загрузчиками:

import requests

session = requests.Session()
session.headers.update({"Authorization": "Bearer <token>"})

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    session=session
)

trust_env по умолчанию равен False и определяет, применяются ли прокси среды, такие как HTTP_PROXY. Установите значение True, если машина или контейнер уже используют настройки прокси на уровне операционной системы:

loader = WebBaseLoader(
    web_path="https://docs.langchain.com/oss/python/langchain/overview",
    trust_env=True
)

Метаданные

WebBaseLoader заполняет метаданные из тегов <title>, <meta name="description"> и <html lang="..."> без необходимости использования пользовательской функции metadata_func:

print(documents[0].metadata)
{'source': 'https://reference.langchain.com/python/langchain-community/document_loaders/web_base/WebBaseLoader', 'title': 'WebBaseLoader | langchain_community | LangChain Reference', 'description': 'Python API reference for document_loaders.web_base.WebBaseLoader in langchain_community. Part of the LangChain ecosystem.', 'language': 'en'}

Проверяйте эти поля при создании корпусов RAG, чтобы язык и заголовки передавались вместе с текстом. В сочетании с SoupStrainer и таймаутами этот загрузчик превращается в контролируемый этап обработки данных, а не в хаотичный выгруз чистого HTML.

Настройка параметров

Практический профиль производства часто включает: SoupStrainer через bs_kwargs для основного контента, шаблон заголовка, похожий на тот, что используется в браузере (header_template), явные таймауты в requests_kwargs, параметры raise_for_status=True вместе с continue_on_failure=True для обработки нескольких URL, умеренное значение requests_per_second, а также общую сессию (session) в случаях, когда важны куки аутентификации. Такое сочетание превращает WebBaseLoader из демонстрационного скрапера в контролируемый инструмент для загрузки данных, подходящий для создания корпусов RAG.