Loader LangChain per Pagine Web e Crawling di Siti#
Il loader EnConvert per LangChain converte le pagine web e i siti interi in LangChain Documents. Percepisci i singoli URL in markdown o esplora un intero sito e restituisci un Document per chunk pronto per RAG. Ogni rendering della pagina ha un punteggio render_quality (0,0–1,0) nei suoi metadati, quindi una pagina bloccata o vuota è segnalata anziché essere silenziosamente considerata attendibile.
langchain-enconvert · Fonte: enconvert/langchain-enconvert · Richiede: langchain-core>=0.3 · Licenza: MIT
Installazione#
pip install langchain-enconvert
Aggiungi la tua chiave API#
Il loader richiede una credenziale: Chiave API EnConvert.
from langchain_enconvert import EnconvertLoader
loader = EnconvertLoader(api_key="sk_...")
# Oppure imposta $ENCONVERT_API_KEY e ometti il parametro
loader = EnconvertLoader()
Genera una chiave API privata nel dashboard. Le chiavi private iniziano con sk_. Le chiavi pubbliche pk_ vengono rifiutate.
pk_ sono destinate ai widget del browser e vengono rifiutate dal loader. Scopri di più su Private Keys.
Usa EnconvertLoader#
Il loader supporta due modalità.
Percepisci alcuni URL#
Converti i singoli URL in Documents markdown:
from langchain_enconvert import EnconvertLoader
loader = EnconvertLoader(urls=["https://example.com", "https://example.com/pricing"])
docs = loader.load()
I metadati di ogni Document contengono:
- source: l'URL
- render_quality: un numero da 0,0 (bloccato/vuoto) a 1,0 (rendering pulito)
Esplora un sito in chunk#
Esplora un intero sito e restituisci un Document per chunk di contenuto, pronto per RAG:
from langchain_enconvert import EnconvertLoader
loader = EnconvertLoader(
ingest_url="https://docs.example.com",
mode="sitemap", # oppure "crawl" oppure "hybrid"
max_pages=100
)
docs = loader.load() # Blocca fino al completamento del crawl
I metadati di ogni Document contengono l'URL source specifico del chunk, il titolo e il contesto della sezione.
Il loader esegue il polling del lavoro di ingestione fino al completamento, quindi .load() è sincrono. Per vero async, usa .lazy_load() per iterare un Document alla volta.
Costruisci una pipeline RAG#
Concatena il loader in uno splitter di testo e un archivio vettoriale:
from langchain_enconvert import EnconvertLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
# Carica e dividi
loader = EnconvertLoader(ingest_url="https://docs.example.com", mode="sitemap")
docs = loader.load()
# Incorpora e indicizza
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=100)
chunks = splitter.split_documents(docs)
embeddings = OpenAIEmbeddings()
vectorstore = FAISS.from_documents(chunks, embeddings)
# Query
retriever = vectorstore.as_retriever()
relevant = retriever.invoke("Come installo questo?")
Risoluzione dei problemi#
raise ValueError("Provide either urls or ingest_url, but not both")
Hai passato sia urls= che ingest_url= al loader. Scegli uno: percepisci i singoli URL o esplora un sito. Passare nessuno genera anche un errore.
AuthenticationError: 401 Unauthorized
La chiave API è scorretta o mancante. Verifica di aver impostato api_key= o la variabile di ambiente $ENCONVERT_API_KEY su una chiave privata (inizia con sk_). Le chiavi pubbliche vengono rifiutate immediatamente.
Il tempo di caricamento sembra molto lungo.
Gli crawl dei siti sono asincroni. Il loader esegue il polling fino al completamento del lavoro, che può richiedere diversi minuti su un sito grande. Per un'UX reattiva, usa l'API async (await loader.aload() in un contesto async) o esegui il polling diretto dello stato del lavoro tramite /v2/ingest/{job_id}.
render_quality è molto basso per le pagine che mi aspettavo di leggere correttamente.
Un punteggio basso (< 0,5) significa che la pagina è bloccata, vuota o ha JavaScript pesante che non è stato renderizzato in tempo. Controlla l'URL source grezzo in un browser per vedere cosa fornisce effettivamente la pagina. Se è un'app mono-pagina, un secondo rendering potrebbe avere successo; se è bloccato, non ci sono tentativi.
Fonte e link#
- Fonte: enconvert/langchain-enconvert
- Pacchetto: PyPI
- Licenza: MIT
- Documentazione LangChain: python.langchain.com
- API sottostante: Introduction
Domande frequenti#
Come carico un singolo URL in un Document?#
from langchain_enconvert import EnconvertLoader
loader = EnconvertLoader(urls=["https://example.com"])
docs = loader.load()
Il contenuto di ogni Document è il markdown della pagina e i metadati contengono l'URL source e il punteggio render_quality.
Come esploro e indicizzo un intero sito?#
loader = EnconvertLoader(ingest_url="https://docs.example.com", mode="sitemap", max_pages=100)
docs = loader.load()
Il loader blocca fino al completamento del crawl, quindi restituisce un Document per chunk. Usa mode="crawl" per il crawling HTTP, "sitemap" per l'analisi della mappa del sito o "hybrid" per entrambi.
Come verifico il render_quality di una pagina?#
I metadati di ogni Document includono render_quality, un punteggio da 0,0 a 1,0. Un punteggio basso significa che la pagina era bloccata o vuota. Dirama prima di indicizzare:
for doc in docs:
if doc.metadata.get('render_quality', 1.0) > 0.5:
vectorstore.add_documents([doc])
Posso trasmettere i Document uno alla volta?#
Sì, usa .lazy_load():
for doc in loader.lazy_load():
print(doc.page_content[:100])
Che cosa fare se ho bisogno di esplorare molti siti?#
Crea un loader per sito e chiama .load() in sequenza, oppure usa .aload() in un contesto async per distribuire i crawl in parallelo.