【RAG】【Data-Processor】【data_connectors37】Web页面读取器示例
案例目标本案例展示了如何使用LlamaIndex的各种Web页面读取器从互联网上获取内容并将其转换为可用于AI应用的数据格式。这些读取器支持多种网页内容提取方式包括简单的HTML解析、JavaScript渲染、反爬虫绕过等功能能够适应不同类型的网站和内容提取需求。技术栈与核心依赖llama-indexllama-index-readers-webhtml2textrequestshyperbrowserscrapfly-sdkzyte-api这些库提供了从网页提取内容、处理HTML、绕过反爬虫机制等功能使开发者能够轻松地将网页内容集成到AI应用中。环境配置# 安装基础依赖%pip install llama-index llama-index-readers-web# 根据需要安装特定读取器的依赖%pip install html2text # SimpleWebPageReader需要%pip install hyperbrowser # HyperbrowserWebReader需要%pip install scrapfly-sdk # ScrapflyReader需要%pip install zyte-api # ZyteWebReader需要注意不同的Web读取器可能需要不同的API密钥或配置参数。请根据您选择的读取器类型获取相应的API密钥。案例实现1. 使用SimpleWebPageReaderimport loggingimport sysfrom llama_index.core import SummaryIndexfrom llama_index.readers.web import SimpleWebPageReaderfrom IPython.display import Markdown, display# 配置日志logging.basicConfig(streamsys.stdout, levellogging.INFO)logging.getLogger().addHandler(logging.StreamHandler(streamsys.stdout))# 使用html_to_textTrue选项需要安装html2textdocuments SimpleWebPageReader(html_to_textTrue).load_data([http://paulgraham.com/worked.html])# 创建索引并查询index SummaryIndex.from_documents(documents)query_engine index.as_query_engine()response query_engine.query(作者在成长过程中做了什么)display(Markdown(f{response}))2. 使用Spider Readerfrom llama_index.readers.web import SpiderWebReader# 初始化Spider读取器spider_reader SpiderWebReader(api_keyYOUR_API_KEY, # 在https://spider.cloud获取modescrape,# params{} # 可选参数详见https://spider.cloud/docs/api)# 抓取单个URLdocuments spider_reader.load_data(urlhttps://spider.cloud)print(documents)# 抓取域名的所有子页面documents spider_reader.load_data(urlhttps://spider.cloud, modecrawl)3. 使用FireCrawl Readerfrom llama_index.readers.web.firecrawl_web.base import FireCrawlWebReader# 初始化FireCrawl读取器firecrawl_reader FireCrawlWebReader(api_key, # 从https://www.firecrawl.dev/获取modescrape, # 或crawl用于爬取整个网站)# 加载文档documents firecrawl_reader.load_data(urls[https://www.paulgraham.com,https://www.paulgraham.com/worked.html,])# 使用提取模式提取结构化数据firecrawl_reader_extract FireCrawlWebReader(api_key,modeextract, # 使用提取模式提取结构化数据params{prompt: 从这篇文章中提取标题、作者和主要观点,},)documents firecrawl_reader_extract.load_data(urls[https://www.paulgraham.com/worked.html])4. 使用Hyperbrowser Readerfrom llama_index.readers.web import HyperbrowserWebReader# 初始化Hyperbrowser读取器reader HyperbrowserWebReader(api_keyyour_api_key_here)# 抓取单个页面docs reader.load_data(urls[https://example.com],operationscrape,)# 爬取整个网站docs reader.load_data(urls[https://example.com],operationcrawl,)5. 使用TrafilaturaWebReaderfrom llama_index.readers.web import TrafilaturaWebReader# 初始化Trafilatura读取器documents TrafilaturaWebReader().load_data([http://paulgraham.com/worked.html])# 创建索引并查询index SummaryIndex.from_documents(documents)query_engine index.as_query_engine()response query_engine.query(作者在成长过程中做了什么)6. 使用RssReaderfrom llama_index.core import SummaryIndexfrom llama_index.readers.web import RssReader# 加载RSS源documents RssReader().load_data([https://rss.nytimes.com/services/xml/rss/nyt/HomePage.xml])# 创建索引并查询index SummaryIndex.from_documents(documents)query_engine index.as_query_engine()response query_engine.query(今天新闻发生了什么)7. 使用ScrapflyReaderfrom llama_index.readers.web import ScrapflyReader# 初始化Scrapfly读取器scrapfly_reader ScrapflyReader(api_keyYour ScrapFly API key, # 从https://www.scrapfly.io/获取ignore_scrape_failuresTrue, # 忽略无法处理的网页并记录异常)# 从URL加载文档作为markdowndocuments scrapfly_reader.load_data(urls[https://web-scraping.dev/products])# 使用自定义配置scrapfly_scrape_config {asp: True, # 绕过抓取阻塞和反机器人解决方案如Cloudflarerender_js: True, # 使用云无头浏览器启用JavaScript渲染proxy_pool: public_residential_pool, # 选择代理池数据中心或住宅country: us, # 选择代理位置auto_scroll: True, # 自动滚动页面js: , # 由无头浏览器执行自定义JavaScript代码}documents scrapfly_reader.load_data(urls[https://web-scraping.dev/products],scrape_configscrapfly_scrape_config, # 传递抓取配置scrape_formatmarkdown, # 抓取结果格式可以是markdown默认或text)8. 使用ZyteWebReaderfrom llama_index.readers.web import ZyteWebReader# 初始化Zyte读取器zyte_reader ZyteWebReader(api_keyyour ZYTE API key here,modearticle, # 或html-text或html)urls [https://www.zyte.com/blog/web-scraping-apis/,https://www.zyte.com/blog/system-integrators-extract-big-data/,]documents zyte_reader.load_data(urlsurls)# 启用浏览器渲染和JavaScriptzyte_dw_params {browserHtml: True, # 启用浏览器渲染javascript: True, # 启用JavaScript}zyte_reader ZyteWebReader(api_keyyour ZYTE API key here,download_kwargszyte_dw_params,)documents zyte_reader.load_data(urlsurls)# 设置continue_on_failure为False如果任何请求失败则停止zyte_reader ZyteWebReader(api_keyyour ZYTE API key here,modehtml-text,download_kwargszyte_dw_params,continue_on_failureFalse,)9. 使用AgentQLWebReaderfrom llama_index.readers.web import AgentQLWebReaderfrom llama_index.core import VectorStoreIndex# 初始化AgentQL读取器agentql_reader AgentQLWebReader(api_keyYOUR_API_KEY, # 从https://dev.agentql.com获取params{is_scroll_to_bottom_enabled: True}, # 可选附加参数)# 从单个页面URL加载文档document agentql_reader.load_data(urlhttps://www.ycombinator.com/companies?batchW25,query{ company[] { name location description industry_category link(a link to the companys detail on Ycombinator)} },)# 创建索引并查询index VectorStoreIndex.from_documents(document)query_engine index.as_query_engine()response query_engine.query(查找从事网络代理工作的公司列出它们的名称、位置和链接)10. 使用OxylabsWebReaderfrom llama_index.readers.web import OxylabsWebReader# 初始化Oxylabs读取器reader OxylabsWebReader(usernameOXYLABS_USERNAME,passwordOXYLABS_PASSWORD)documents reader.load_data([https://sandbox.oxylabs.io/products/1,https://sandbox.oxylabs.io/products/2,])# 使用参数选择地理位置、用户代理类型、JavaScript渲染、标头和cookiesdocuments reader.load_data([https://sandbox.oxylabs.io/products/3,],{geo_location: Berlin, Germany,render: html,user_agent_type: mobile,context: [{key: force_headers, value: True},{key: force_cookies, value: True},{key: headers,value: {Content-Type: text/html,Custom-Header-Name: custom header content,},},{key: cookies,value: [{key: NID, value: 1234567890},{key: 1P JAR, value: 0987654321},],},{key: http_method, value: get},{key: follow_redirects, value: True},{key: successful_status_codes, value: [808, 909]},],},)11. 使用ZenRowsWebReaderfrom llama_index.readers.web import ZenRowsWebReader# 基础网页抓取zenrows_reader ZenRowsWebReader(api_keyYOUR_API_KEY, # 从https://app.zenrows.com/register获取response_typemarkdown,)# 抓取单个URLdocuments zenrows_reader.load_data([https://httpbin.io/html])# 高级抓取绕过反机器人zenrows_advanced ZenRowsWebReader(api_keyYOUR_API_KEY,js_renderTrue, # 启用JavaScript渲染premium_proxyTrue, # 使用住宅代理proxy_countryus, # 可选指定国家)documents zenrows_advanced.load_data([https://www.scrapingcourse.com/antibot-challenge])# 与LlamaIndex集成 - 抓取多个页面zenrows_reader ZenRowsWebReader(api_keyYOUR_API_KEY,js_renderTrue,response_typemarkdown)urls [https://example.com/, https://httpbin.io/html]documents zenrows_reader.load_data(urls)# 创建索引并查询index SummaryIndex.from_documents(documents)query_engine index.as_query_engine()response query_engine.query(在这些页面上找到了什么内容)12. 使用OlostepWebReaderfrom llama_index.readers.web import OlostepWebReaderfrom llama_index.core import SummaryIndex# 以抓取模式初始化读取器reader OlostepWebReader(api_keyYOUR_OLOSTEP_API_KEY, modescrape)# 从URL加载数据documents reader.load_data(urlhttps://www.olostep.com/)# 创建索引并查询index SummaryIndex.from_documents(documents)query_engine index.as_query_engine()response query_engine.query(用100字总结)# 以搜索模式初始化读取器reader OlostepWebReader(api_keyYOUR_OLOSTEP_API_KEY, modesearch)# 使用搜索查询加载数据documents reader.load_data(queryAI的最新进展是什么)# 也可以传递附加参数例如指定搜索的国家documents_with_params reader.load_data(queryAI的最新进展是什么,params{country: US})# 创建索引并查询index SummaryIndex.from_documents(documents)query_engine index.as_query_engine()response query_engine.query(列出标题)案例效果通过使用这些Web页面读取器开发者可以从各种网站提取文本内容包括需要JavaScript渲染的动态网站绕过常见的反爬虫机制如Cloudflare等防护系统将网页内容转换为适合AI应用的格式如Markdown或纯文本提取结构化数据如文章标题、作者、产品信息等批量处理多个URL提高数据收集效率将提取的内容直接集成到LlamaIndex的索引系统中便于后续查询和分析案例实现思路Web页面读取器的实现基于以下思路统一接口设计所有读取器都实现了相同的基础接口使开发者可以轻松切换不同的读取器而无需更改应用代码。多策略内容提取针对不同类型的网站和内容提供多种提取策略包括简单的HTML解析、JavaScript渲染、API调用等。反爬虫绕过集成代理轮换、用户代理伪装、请求头定制等技术提高成功获取内容的概率。内容格式转换将原始HTML内容转换为更适合AI应用的格式如Markdown、纯文本或结构化数据。元数据提取除了主要内容外还提取页面的元数据如标题、作者、发布日期等丰富上下文信息。错误处理提供灵活的错误处理机制允许开发者选择在遇到错误时是继续处理其他URL还是停止整个流程。扩展建议自定义内容过滤器开发自定义过滤器只提取符合特定条件的内容如特定长度、特定关键词或特定格式的文本。增量更新机制实现增量更新机制只抓取自上次更新以来发生变化的内容减少不必要的请求。内容质量评估集成内容质量评估算法自动过滤低质量或重复的内容。多语言支持增强多语言内容的处理能力包括自动语言检测和翻译功能。分布式抓取实现分布式抓取架构提高大规模数据收集的效率。智能缓存实现智能缓存机制避免重复抓取相同内容同时确保内容及时更新。可视化界面开发可视化界面方便非技术用户配置和使用Web读取器。总结Web页面读取器是LlamaIndex生态系统中的重要组成部分它们为AI应用提供了从互联网获取实时数据的能力。通过这些读取器开发者可以轻松地将网页内容集成到知识库中使AI系统能够回答基于最新信息的问题。无论是简单的静态网页还是复杂的动态网站LlamaIndex都提供了相应的解决方案大大降低了从网络获取数据的门槛。随着互联网内容的不断增长这些读取器将成为构建智能应用不可或缺的工具。