引言
网站地图(Sitemap)是网站管理员用来告知搜索引擎其网站页面的文件。对于开发者和数据科学家来说,通过使用SitemapLoader类,我们能够更高效地从网站地图中提取多个页面的内容。在这篇文章中,我们将探讨如何使用SitemapLoader类加载和解析网站地图,并讨论如何优化爬取速度与定制抓取规则。
主要内容
1. SitemapLoader的基本用法
SitemapLoader类继承自WebBaseLoader,用于从指定URL加载网站地图,并抓取其中的所有页面,每个页面以Document对象的形式返回。默认情况下,爬取是并发进行的,每秒最多进行2个请求。
from langchain_community.document_loaders.sitemap import SitemapLoader
sitemap_loader = SitemapLoader(web_path="https://api.python.langchain.com/sitemap.xml") # 使用API代理服务提高访问稳定性
docs = sitemap_loader.load()
如果需要加快爬取速度,您可以修改requests_per_second参数。不过,请注意过多的请求可能导致服务器封锁您的IP。
sitemap_loader.requests_per_second = 5
sitemap_loader.requests_kwargs = {"verify": False} # 避免 SSL 验证失败
2. 过滤网站地图URL
大型网站地图文件中可能包含成千上万个URL,在大部分情况下我们并不需要全部加载。可以通过传递字符串或正则表达式列表给filter_urls参数来过滤URL。
loader = SitemapLoader(
web_path="https://api.python.langchain.com/sitemap.xml",
filter_urls=["https://api.python.langchain.com/en/latest"],
)
documents = loader.load()
3. 添加自定义抓取规则
SitemapLoader使用beautifulsoup4来抓取页面元素,默认抓取页面上的所有元素。但我们可以通过构造自定义抓取函数来只抓取我们需要的内容。
安装beautifulsoup4:
pip install beautifulsoup4
定义自定义抓取函数:
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())
将此函数添加到SitemapLoader对象:
loader = SitemapLoader(
"https://api.python.langchain.com/sitemap.xml",
filter_urls=["https://api.python.langchain.com/en/latest/"],
parsing_function=remove_nav_and_header_elements,
)
4. 加载本地网站地图文件
SitemapLoader也支持加载本地的sitemap文件:
sitemap_loader = SitemapLoader(web_path="example_data/sitemap.xml", is_local=True)
docs = sitemap_loader.load()
常见问题和解决方案
问题1:如何解决SSL证书验证失败的问题?
解决方案:使用requests_kwargs参数设置verify=False。
问题2:如何避免服务器封锁?
解决方案:保持合理的请求频率,并尊重网站的robots.txt文件。
总结和进一步学习资源
使用SitemapLoader可以使我们在短时间内抓取大量网页内容。在使用时需注意请求频率,同时可以根据需要定制抓取规则。有关LangChain和BeautifulSoup的更多信息,请参阅下述官方文档。
参考资料
结束语:如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---