Pada halaman ini
LlamaIndex ialah rangka kerja pilihan untuk RAG pengeluaran, tetapi ia dihadirkan dengan pembaca HTML yang lemah pada tapak berat JavaScript dan halaman yang dilindungi Cloudflare. Tukar mereka dengan CrawlForge dan saluran paip LlamaIndex anda mengendalikan mana-mana URL -- HTML statik, SPA, atau dinding anti-bot.
from llama_index.core import Document
from crawlforge_llamaindex import CrawlForgeReader
reader = CrawlForgeReader(api_key="cf_live_your_key")
docs: list[Document] = reader.load_data(urls=["https://docs.stripe.com/api"])Panduan ini menunjukkan cara menggunakan web scraping LlamaIndex dengan CrawlForge sebagai sumber data anda -- daripada pemuat halaman tunggal ke saluran paip RAG penuh dan alat ejen.
Jadual Kandungan
- Mengapa LlamaIndex Memerlukan Pembaca Web yang Lebih Baik
- Prasyarat
- Langkah 1: Pasang Kebergantungan
- Langkah 2: Bina Pembaca CrawlForge
- Langkah 3: Indeks Halaman Web Langsung
- Langkah 4: Tanya Indeks
- Contoh Penuh: Docs RAG dengan Kemas Kini Langsung
- Lanjutan: Alat CrawlForge untuk Ejen LlamaIndex
- Penyelesaian Masalah
- Soalan Lazim
Mengapa LlamaIndex Memerlukan Pembaca Web yang Lebih Baik
SimpleWebPageReader dan BeautifulSoupWebReader terbina dalam LlamaIndex baik untuk pos blog statik tetapi gagal pada:
- Kandungan yang dirender JavaScript (aplikasi React, Vue, Angular)
- Halaman yang dilindungi Cloudflare / DataDome / Akamai (kebanyakan docs SaaS)
- Tapak yang mengembalikan 403 kepada User-Agent generik
- Halaman di mana kandungan utama berada di dalam adik-beradik
<main>, tidak mudah diekstrak
CrawlForge menyelesaikan kesemua empat. Alat extract_contentnya menggunakan algoritma kebolehbacaan yang ditala untuk halaman artikel, docs, dan produk. stealth_mode mengendalikan anti-bot. scrape_with_actions melaksanakan JavaScript. Kesemua 26 alat mengembalikan teks bersih atau markdown yang sedia untuk dikepingkan. Untuk latar belakang tentang mengapa ini penting untuk RAG, lihat panduan saluran paip RAG kami.
Prasyarat
- Python 3.9+ --
python --version - LlamaIndex --
pip install llama-index-core llama-index-readers-web - Akaun CrawlForge -- percuma di crawlforge.dev/signup, 1,000 credits disertakan
- API key OpenAI atau Anthropic untuk panggilan LLM LlamaIndex (atau gunakan mana-mana penyedia yang disokong)
Langkah 1: Pasang Kebergantungan
pip install llama-index-core llama-index-embeddings-openai requestsEksport kunci anda:
export CRAWLFORGE_API_KEY="cf_live_your_key_here"
export OPENAI_API_KEY="sk-..."Langkah 2: Bina Pembaca CrawlForge
Pembaca LlamaIndex mewarisi daripada BaseReader dan mengembalikan objek Document. Inilah pembaca minimum yang membungkus titik akhir extract_content CrawlForge:
# crawlforge_reader.py
import os
from typing import List, Optional
import requests
from llama_index.core.readers.base import BaseReader
from llama_index.core.schema import Document
class CrawlForgeReader(BaseReader):
"""LlamaIndex reader that uses CrawlForge for web scraping."""
BASE_URL = "https://crawlforge.dev/api/v1/tools"
def __init__(self, api_key: Optional[str] = None, use_stealth: bool = False):
self.api_key = api_key or os.environ["CRAWLFORGE_API_KEY"]
self.use_stealth = use_stealth
def load_data(self, urls: List[str]) -> List[Document]:
documents = []
tool = "stealth_mode" if self.use_stealth else "extract_content"
for url in urls:
response = requests.post(
f"{self.BASE_URL}/{tool}",
headers={
"Authorization": f"Bearer {self.api_key}",
"Content-Type": "application/json",
},
json={
"url": url,
"options": {"format": "markdown"},
},
timeout=30,
)
response.raise_for_status()
data = response.json()
documents.append(
Document(
text=data.get("content", ""),
metadata={
"source": url,
"title": data.get("title"),
"scraped_at": data.get("scraped_at"),
},
)
)
return documentsKos: 2 credits setiap URL untuk extract_content, 5 credits untuk stealth_mode.
Langkah 3: Indeks Halaman Web Langsung
Pasangkan pembaca ke dalam saluran paip LlamaIndex standard:
# build_index.py
from llama_index.core import VectorStoreIndex
from crawlforge_reader import CrawlForgeReader
reader = CrawlForgeReader()
docs = reader.load_data(urls=[
"https://docs.stripe.com/api/charges/create",
"https://docs.stripe.com/api/payment_intents/create",
"https://docs.stripe.com/api/refunds/create",
])
index = VectorStoreIndex.from_documents(docs)
index.storage_context.persist(persist_dir="./storage/stripe_docs")Anda kini mempunyai indeks API Stripe yang berterusan yang dibina daripada docs langsung. Kos: 6 credits (3 URL x 2).
Langkah 4: Tanya Indeks
# query_index.py
from llama_index.core import StorageContext, load_index_from_storage
storage = StorageContext.from_defaults(persist_dir="./storage/stripe_docs")
index = load_index_from_storage(storage)
query_engine = index.as_query_engine()
response = query_engine.query(
"What are the required fields to create a Charge in Stripe's API?"
)
print(response)
# -> "To create a Charge, you must provide amount (integer in cents) and
# currency (three-letter ISO code). Additionally you need a source
# (payment method) or customer."Contoh Penuh: Docs RAG dengan Kemas Kini Langsung
Gabungkan semuanya -- Stripe docs RAG yang menyegar semula setiap malam:
# docs_rag.py
import os
from datetime import datetime
from llama_index.core import VectorStoreIndex, StorageContext, load_index_from_storage
from crawlforge_reader import CrawlForgeReader
PERSIST_DIR = "./storage/stripe_docs"
TARGET_URLS = [
"https://docs.stripe.com/api/charges/create",
"https://docs.stripe.com/api/payment_intents/create",
"https://docs.stripe.com/api/refunds/create",
"https://docs.stripe.com/api/customers/create",
"https://docs.stripe.com/api/subscriptions/create",
]
def refresh_index() -> VectorStoreIndex:
"""Re-scrape sources and rebuild the index."""
reader = CrawlForgeReader()
docs = reader.load_data(urls=TARGET_URLS)
index = VectorStoreIndex.from_documents(docs)
index.storage_context.persist(persist_dir=PERSIST_DIR)
print(f"Indexed {len(docs)} docs at {datetime.utcnow().isoformat()}Z")
return index
def load_index() -> VectorStoreIndex:
"""Load the persisted index from disk."""
storage = StorageContext.from_defaults(persist_dir=PERSIST_DIR)
return load_index_from_storage(storage)
def ask(question: str) -> str:
index = load_index() if os.path.exists(PERSIST_DIR) else refresh_index()
return str(index.as_query_engine().query(question))
if __name__ == "__main__":
# Refresh once a day in a cron job: python docs_rag.py --refresh
import sys
if "--refresh" in sys.argv:
refresh_index()
else:
print(ask("How do I create a refund for a charge?"))Kos penyegaran semula malam: 10 credits (5 URL x 2). Sepanjang 30 hari itu ialah 300 credits -- jauh di dalam peringkat free.
Lanjutan: Alat CrawlForge untuk Ejen LlamaIndex
Sistem ejen LlamaIndex menerima takrifan FunctionTool sewenang-wenangnya. Bungkus panggilan CrawlForge sebagai alat dan ejen anda boleh scrape atas permintaan:
# crawlforge_tools.py
from llama_index.core.tools import FunctionTool
from crawlforge_reader import CrawlForgeReader
def scrape_url(url: str) -> str:
"""Scrape a URL and return its main content as markdown."""
reader = CrawlForgeReader()
docs = reader.load_data(urls=[url])
return docs[0].text if docs else ""
def search_and_scrape(query: str, n: int = 3) -> list[str]:
"""Search the web and return content from the top N results."""
import os, requests
resp = requests.post(
"https://crawlforge.dev/api/v1/tools/search_web",
headers={"Authorization": f"Bearer {os.environ['CRAWLFORGE_API_KEY']}"},
json={"query": query, "limit": n},
timeout=30,
).json()
urls = [r["url"] for r in resp.get("results", [])]
reader = CrawlForgeReader()
return [d.text for d in reader.load_data(urls=urls)]
scrape_tool = FunctionTool.from_defaults(fn=scrape_url)
search_tool = FunctionTool.from_defaults(fn=search_and_scrape)Kemudian hantar [scrape_tool, search_tool] kepada mana-mana ejen LlamaIndex:
from llama_index.core.agent import ReActAgent
from llama_index.llms.openai import OpenAI
agent = ReActAgent.from_tools(
tools=[scrape_tool, search_tool],
llm=OpenAI(model="gpt-4o-mini"),
verbose=True,
)
response = agent.chat(
"Research the current state of Anthropic's MCP protocol adoption in 2026. "
"Cite at least 3 sources."
)
print(response)Pecahan Kos Credit
| Operasi | Alat | Credits |
|---|---|---|
| Masukkan satu halaman statik | extract_content | 2 |
| Masukkan satu halaman berat JS | scrape_with_actions | 5 |
| Masukkan dilindungi Cloudflare | stealth_mode | 5 |
| Cari + scrape ejen (3 URL) | search_web + 3x extract_content | 11 |
| Penyelidikan mendalam penuh | deep_research | 10 |
Penyelesaian Masalah
Document.text kosong untuk sesetengah URL -- Halaman berkemungkinan memerlukan JavaScript. Cipta instans dengan use_stealth=True atau bina varian pembaca yang memanggil scrape_with_actions.
requests.exceptions.HTTPError: 429 -- Anda mencapai had kadar CrawlForge. Tambah percubaan semula dengan undur atau bahagikan muatan pukal merentas kelompok 10 URL.
Pengindeksan LlamaIndex perlahan -- Kelompokkan panggilan pembaca anda dengan concurrent.futures.ThreadPoolExecutor (terikat I/O, GIL bukan penghalang). Pecutan 10x pada 50+ URL adalah tipikal.
Metadata Document hilang -- Titik akhir scrape_structured CrawlForge tidak mengisi title dengan cara yang sama seperti extract_content. Kekal dengan extract_content untuk pengingesan RAG; gunakan scrape_structured hanya untuk pengekstrakan medan bertaip.
Kos embedding melonjak -- LlamaIndex membenamkan semula pada setiap panggilan VectorStoreIndex.from_documents. Kekalkan dengan index.storage_context.persist() dan muatkan dengan load_index_from_storage() untuk mengelakkan kerja semula.
Langkah Seterusnya
- Baca panduan saluran paip RAG untuk corak perolehan hujung ke hujung
- Terokai rangka kerja lain dalam pos integrasi LangChain kami
- Lihat docs bermula untuk REST API penuh
- Bandingkan vendor scraping di alternatif Firecrawl
Mulakan secara percuma dengan 1,000 credits di crawlforge.dev/signup. Tiada kad kredit diperlukan.
Cuba sendiri — tiada pendaftaran diperlukan
Jalankan mana-mana daripada 27 alat scraping dan pengekstrakan CrawlForge dalam playground, kemudian mula secara percuma dengan 1,000 credits.
1,000 credits percuma • Isi semula setiap bulan • Tiada kad kredit diperlukan
Tag
Tentang Penulis
Kekal dikemas kini dengan pandangan terkini
Dapatkan tutorial, kemas kini produk dan petua web scraping terus ke peti masuk anda.
Tiada spam. Berhenti melanggan bila-bila masa.