Настройки LangChain WebBaseLoader для сохранения текста страницы и удаления Chrome
WebBaseLoader загружает страницы в раздел Документы. SoupStrainer, заголовки, SSL, прокси-серверы, таймауты, ограничения скорости и сессии определяют, будет ли в процессе обработки RAG получен текст статьи или лишний навигационный контент.
Источники: 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.