首页 > 解决方案 > 如何在 c# (Azure Functions) 中下载整个网站

问题描述

我正在开发一个爬虫,我需要保存一些证据证明爬虫完成了他的工作。

我正在寻找一种方法来下载已发送 URL 的所有 HTML、CSS 和 JS,并创建目标站点的相同文件夹结构。

我将不得不使用 Azure Functions 来执行爬虫。

想法是废弃一个站点,下载内容并保存在 Azure Blob 中。

我找到了这篇关于它的文章,但它只展示了如何下载 HTML,我需要创建与爬虫看到的完全相同的东西(带有图像、CSS 和处理过的 JS)。

我相信所有绝对路径都会起作用,真正的问题是我将创建文件夹来保存文件的相对路径。

有人能帮我吗?

标签: web-crawlerhttpwebrequestazure-functions

解决方案


好吧,我相信这个答案对那些和我经历过同样事情的人会有所帮助。

我的解决方案是下载 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;
}

我只下载一个文件,而不是下载所有网站。这个对我有用) ;)


推荐阅读