web-crawler - 如何在 c# (Azure Functions) 中下载整个网站
问题描述
我正在开发一个爬虫,我需要保存一些证据证明爬虫完成了他的工作。
我正在寻找一种方法来下载已发送 URL 的所有 HTML、CSS 和 JS,并创建目标站点的相同文件夹结构。
我将不得不使用 Azure Functions 来执行爬虫。
想法是废弃一个站点,下载内容并保存在 Azure Blob 中。
我找到了这篇关于它的文章,但它只展示了如何下载 HTML,我需要创建与爬虫看到的完全相同的东西(带有图像、CSS 和处理过的 JS)。
我相信所有绝对路径都会起作用,真正的问题是我将创建文件夹来保存文件的相对路径。
有人能帮我吗?
解决方案
好吧,我相信这个答案对那些和我经历过同样事情的人会有所帮助。
我的解决方案是下载 HTML(使用 HttpWebRequest)并写入文件(存储在 Azure Blob 中)。
就我而言,我创建了一个函数来更正 HTML 文件中的所有亲属路径,如下所示:
private static HtmlDocument CorrectHTMLReferencies(string urlRoot, string htmlContent)
{
HtmlDocument document = new HtmlDocument();
document.LoadHtml(htmlContent);
Regex rx = new Regex(@"([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?");
var nodesIMG = document.DocumentNode.SelectNodes("//img");
var nodesCSS = document.DocumentNode.SelectNodes("//link");
var nodesJS = document.DocumentNode.SelectNodes("//script");
string protocol = "http:";
if (urlRoot.Contains(":"))
protocol = urlRoot.Split(':')[0] + ":";
void WatchURl(HtmlNodeCollection colNodes, string attr)
{
foreach (HtmlNode node in colNodes)
{
if (node.Attributes.Any(a => a.Name?.ToLower() == attr.ToLower()))
{
string link = node.Attributes[attr].Value;
if (rx.IsMatch(link))
{
if (link.Substring(0, 2) == "//")
{
string novaUrl = protocol + link;
node.SetAttributeValue(attr, novaUrl);
}
}
else
{
node.SetAttributeValue(attr, urlRoot + link);
}
}
}
}
WatchURl(nodesIMG, "src");
WatchURl(nodesCSS, "href");
WatchURl(nodesJS, "src");
return document;
}
我只下载一个文件,而不是下载所有网站。这个对我有用) ;)
推荐阅读
- c# - SqlDependency 尝试使用 log4net 做某事并且无法启动
- javascript - 保存对文档片段的引用的函数属性:何时使用 cloneNode?
- linux - UIO 和 msync:为什么即使地址是 PAGESIZE 的倍数,msync 也会返回“无效参数”
- html - 单击导航项时,如何将 ProgressBar 元素设置为可见?
- data-binding - Svelte 从孩子绑定父商店
- hibernate - 尝试在 intellij hibernate 控制台上运行 hql 查询
- r - R中的网格表到PDF - 格式化页面上的位置,并重复页眉/页脚
- algorithm - 合并两个链表的算法方法
- reactjs - 替代在子组件上调用方法?
- tensorflow - 跨分区的 Dask Map TensorFlow