Strona główna / Artykuły

Narzędzia LangChain WebBaseLoader do przechowywania tekstu strony i usuwania elementów Chrome

WebBaseLoader pobiera strony do folderu Dokumenty. SoupStrainer, nagłówki, SSL, proxy, czas wygaśnięcia, limity przepustowości oraz sesje decydują o tym, czy proces RAG pobierze tekst artykułu, czy też tylko niepotrzebne dane nawigacyjne.

Wydawca: REACTAPP.TOP5 min czytania1064 słów

Źródła: Loading Web Pages in LangChain with WebBaseLoader

WebBaseLoader przekształca URL w obiekt typu LangChain Document. Standardowa funkcja pobierania danych często łączy tekst głównej treści z elementami bocznymi, nawigacją oraz narzędziami wyszukiwania. Parametry konstruktora umożliwiają kontrolę nad procesem parsowania, nagłówkami, protokołem SSL, proxyami, czasami oczekiwania, grupowaniem zapytań, sesjami oraz metadanymi, dzięki czemu pipeline zachowuje tylko istotną treść, a resztę odrzuca. Poniższy przewodnik wykorzystuje rzeczywistą stronę dokumentacji jako przykład i omawia każdy parametr po kolei.

Ustawienia

pip install langchain langchain-community beautifulsoup4

WebBaseLoader polega na bibliotece beautifulsoup4 do parsowania HTML oraz requests do obsługi zapytań HTTP. Należy zainstalować obie w tym samym środowisku co narzędzia do ładowania danych z community w LangChain.

Strona internetowa do eksperymentu

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

Należy skierować narzędzie na stabilny, publiczny adres dokumentacji, aby efekty zmian parametrów można było łatwo porównywać pomiędzy różnymi uruchomieniami.

Konstruktor

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
)

Wymagany jest tylko web_path. Wszystko inne służy do dostosowania zachowania pobierania i analizy treści na stronach bardziej zanieczyszczonych danymi lub w bardziej restrykcyjnych sieciach.

web_path

web_path przyjmuje jedną adresację URL lub listę adresów URL. Listy umożliwiają pobieranie wielu elementów za jednym razem; należy je łączyć z ograniczeniami szybkości i politykami radzenia sobie z błędami opisanymi później, aby jeden nieprawidłowy serwer nie spowolnił całej operacji.

bs_kwargs

bs_kwargs przekazuje argumenty słów kluczowych do BeautifulSoup. Cenną opcją jest parse_only w połączeniu z bs4.SoupStrainer, która ogranicza parsowanie do wybranych tagów i pomija elementy boczne z page_content. Narzędzia deweloperskie przeglądarki pomagają zidentyfikować istotne tagi na stronie docelowej – na przykład h1, który zawiera tytuł. Po przefiltrowaniu do tego tagu narzędzie zwraca skrócony ciąg znaków zamiast pełnego, obszernego treści strony.

bs_get_text_kwargs

Po tym, jak BeautifulSoup sprowadza drzewo do prostszej formy, get_text() je spłaszcza. Funkcja bs_get_text_kwargs przekazuje argumenty do tej funkcji. Połączenie filtru tagów (na przykład h2) z parametrami separator="|" oraz strip=True umieszcza widoczne rozdzielniki między sąsiadującymi fragmentami i usuwa zbędne spacje, dzięki czemu nagłówki i etykiety nie łączą się ze sobą w tekście dokumentu.

default_parser

default_parser wybiera parser BeautifulSoup. Wbudowany "html.parser" nie wymaga dodatkowych zależności, ale jest mniej wyrozumiały wobec uszkodzonego kodu. Na poprawnie sformatowanych stronach wybór parsera może nie dawać widocznego efektu; natomiast przy chaotycznym HTML użycie lxml lub html5lib (gdy są zainstalowane) może pomóc przy przywróceniu struktury.

header_template

Część hostów odrzuca proste agenty użytkownika w Pythonie z kodem błędu HTTP 403. Domyślny agent WebBaseLoader jest ogólny. Funkcja header_template umożliwia użytkownikom ustawienie nagłówków przypominających te z przeglądarki:

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"
    }
)

Ta zmiana rozwiązuje wiele przypadków błędu 403, ale nadal istnieją inne mechanizmy ochronne przed botami. Przed masowym ładowaniem należy przestrzegać zasad określonych w pliku robots.txt oraz warunków użytkowania strony.

verify_ssl i proxy

Domyślna wartość verify_ssl to True, więc nieważne lub samopodpisane certyfikaty powodują natychmiastowe odmowienie — co jest powszechne na hostach wewnętrznych lub testowych:

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

Wyłączenie weryfikacji oznacza usunięcie jednej z barier bezpieczeństwa. Należy to stosować tylko przy pobieraniu danych z lokalnych sieci lub zaufanych źródeł, a nigdy w przypadku procesów pobierających dowolne publiczne adresy URL.

Funkcja proxies umożliwia przekierowanie żądań przez proxy HTTP lub HTTPS według struktury słownika oczekiwanej przez bibliotekę 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 i raise_for_status

requests_kwargs przekazuje opcje bezpośrednio do podstawowego żądania — czas wygaśnięcia, pliki cookie oraz wszystko inne, co loader nie traktuje jako elementu pierwszorzędnego:

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

Bez ustawienia czasu wygaśnięcia zablokowany socket może blokować funkcję .load() na zawsze. Zadania pozostawione bez nadzoru powinny zawsze mieć taką ustawienie.

raise_for_status ma domyślnie wartość False, więc odpowiedzi 404 lub 500 nadal generują dokument zawierający błędny kod HTML. Ustaw je na True, aby szybko zakończyć działanie w przypadku nieprawidłowych statusów:

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

continue_on_failure

Gdy ładowane są liczne adresy URL, continue_on_failure decyduje, czy jedna wyjątek, przekroczenie czasu oczekiwania lub status błędu powoduje przerwanie całej serii operacji. Przy nieważnym trzecim adrese URL, raise_for_status ustawionym na false oraz continue_on_failure=True, proces może zostać dokończony i wydrukować pozostałe dokumenty zamiast zakończyć się przy pierwszym błędzie. Zaleca się wyraźne rejestrowanie pominiętych adresów URL, aby ukryte luki nie maskowały utraty danych.

autoset_encoding i encoding

Odpowiedzi są w formie bajtów, dopóki nie zostaną zdekodowane. Przy użyciu autoset_encoding=True (standardowo), requests próbuje odgadnąć kodowanie na podstawie nagłówków i treści. Ustal encoding wyraźnie, gdy źródło kłamie co do swojego zestawu znaków:

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

Wyraźne określenie kodowania ma pierwszeństwo nawet wtedy, gdy funkcja autoset jest włączona.

requests_per_second i show_progress

Narzędzia do zarządzania serią operacji:

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 ogranicza szybkość żądań — obniż je w przypadku limitów przepustowości lub aby okazać szacunek serwerowi źródłowemu. show_progress włącza/zamyka pasek postępu tqdm (domyślnie włączony); wyłącz go w usługach, gdzie paski postępu psują logi.

session i trust_env

Pasuj przygotowany obiekt requests.Session, gdy pliki cookie autoryzacyjne, adaptery ponawiania prób lub połączenia z puli powinny być udostępniane między różnymi elementami aplikacji:

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 ma wartość domyślną False i określa, czy mają zastosowanie proxy środowiskowe, takie jak HTTP_PROXY. Ustaw wartość True, jeśli maszyna lub kontener już korzysta z ustawień proxy na poziomie systemu operacyjnego:

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

Metryki

WebBaseLoader wypełnia metadane z <title>, <meta name="description"> oraz <html lang="..."> bez konieczności użycia specjalnej funkcji 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'}

Należy sprawdzić te pola podczas tworzenia korpusów RAG, aby język i tytuły były przekazywane razem z tekstem. W połączeniu z SoupStrainer oraz mechanizmami timeoutu, ten narzędzie staje się kontrolowanym krokiem przetwarzania zamiast chaotycznym wyeksportowaniem treści HTML.

Konfiguracja narzędzia

Praktyczny profil produkcji często łączy: SoupStrainer za pośrednictwem bs_kwargs do zawartości głównej, header_template przypominający przeglądarkę, wyraźne limity czasowe w requests_kwargs, ustawienie raise_for_status=True w połączeniu z continue_on_failure=True dla zadań obejmujących wiele adresów URL, umiarkowaną wartość requests_per_second oraz wspólną sesję session, gdy ważne są pliki cookie autoryzacyjne. Taka kombinacja przekształca WebBaseLoader z narzędzia demonstracyjnego w kontrolowany etap pobierania danych odpowiedni do tworzenia korpusów RAG.