Головна / Статті

Налаштування LangChain WebBaseLoader, які зберігають текст сторінки та видаляють Chrome

WebBaseLoader завантажує сторінки до папки Documents. 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"
)

Явне вказування кодування має пріоритет навіть тоді, коли функція autoset увімкнена.

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.