Web crawler 如何在c#(Azure功能)中下载整个网站
我正在开发一个爬虫,我需要保存一些证据,证明爬虫成功了 我正在寻找一种方法来下载发送URL的所有HTML、CSS和JS,并创建与目标站点相同的文件夹结构 我将不得不使用Azure函数来执行爬虫程序 其想法是废弃一个网站,下载内容并保存在Azure Blob中 我找到了它,但它只显示了如何下载HTML,我需要创建与爬虫看到的完全相同的东西(带有图像、CSS和处理过的JS) 我相信所有的绝对路径都会起作用,真正的问题是我将创建文件夹来保存文件的相对路径Web crawler 如何在c#(Azure功能)中下载整个网站,web-crawler,httpwebrequest,azure-functions,Web Crawler,Httpwebrequest,Azure Functions,我正在开发一个爬虫,我需要保存一些证据,证明爬虫成功了 我正在寻找一种方法来下载发送URL的所有HTML、CSS和JS,并创建与目标站点相同的文件夹结构 我将不得不使用Azure函数来执行爬虫程序 其想法是废弃一个网站,下载内容并保存在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;
}
我没有下载所有的网站,而是只下载了一个文件。
它(对我)有效
;)