我正在使用Google Abot网络抓取工具,并且想知道如何将单独的网页或图像存储到文件夹中。我查看了论坛,其中显示了以下内容。但是我不能多次存储到同一个文件中,这是否意味着我每次都要创建一个不同的文件名,或者是否有一种更简单的方式来存储网页。另外,如果我只想存储图像,我应该使用哪些选项?我检查了其他Abot stackoverflow帖子,发现以下抓取的网页内容为评论。如何使用它们仅存储图像?
//crawledPage.RawContent //raw html
//crawledPage.HtmlDocument //lazy loaded html agility pack object (HtmlAgilityPack.HtmlDocument)
//crawledPage.CSDocument //lazy loaded cs query object (CsQuery.Cq)
void crawler_ProcessPageCrawlCompleted(object sender, PageCrawlCompletedArgs e)
{
CrawledPage crawledPage = e.CrawledPage;
if (crawledPage.WebException != null || crawledPage.HttpWebResponse.StatusCode != HttpStatusCode.OK)
Console.WriteLine("Crawl of page failed {0}", crawledPage.Uri.AbsoluteUri);
else
Console.WriteLine("Crawl of page succeeded {0}", crawledPage.Uri.AbsoluteUri);
if (!string.IsNullOrEmpty(crawledPage.Content.Text))
File.WriteAllText(SOMEFILEPATH, crawledPage.Content.Text); //or crawledPage.Content.Bytes
}
P.S。我用它来存储网页使用crawledPage.HtmlDocument.Save(@" C:// TESTCRAWL / FILE" + rnd.Next(1,100).ToString()+" .html& #34;,System.Text.Encoding.UTF8); 有没有办法获得图像?
答案 0 :(得分:2)
ABot不会自动下载图片,它是为了抓取网址而构建的,您需要编写代码来提取图片网址然后遍历所有网址
第1步:使用HtmlAgilityPack从网页源中提取图像SRC
List<string> imgScrs = new List<string>();
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(crawledPage.Content.Text);
var nodes = doc.DocumentNode.SelectNodes(@"//img[@src]"); s
foreach (var img in nodes)
{
HtmlAttribute att = img["src"];
imgScrs.Add(att.Value)
}
第2步:遍历列表中的每个src并在c:drive中下载图片
int i = 0;
foreach (string src in imgScrs)
{
client.DownloadFile(new Uri(src), @"c:\temp\image_" + i +".jpg");
i++;
}
注意::我正在使用“i”变量为每个图片指定一个唯一的名称,否则每次都会覆盖相同的图像
答案 1 :(得分:2)
现在你可以让Abot(c#)为你下载图像。至少有两种解决方案。
<强>制备强>
在每个解决方案中,创建并使用自定义CrawlConfiguration
实例并将其传递给SiteCrawler
构造函数。
在配置对象中包含您的图像类型MIME,例如
config.DownloadableContentTypes = "text/html,application/json,text/plain,image/jpeg,image/pjpeg,*/*"
解决方案1
LinkSelector
继承自HapHyperLinkParser
并将其传递给SiteCrawler
contructor。LinkSelector
覆盖GetHrefValues
中。从下载的页面中提取图像URL,并将其包含在返回的列表中。crawler_ProcessPageCrawlCompleted
crawledPage.Content.Bytes
处理程序中
醇>
解决方案2
在crawler_ProcessPageCrawlCompleted
处理程序中提取图片网址,并将其添加到您的抓取工具计划程序中
e.CrawlContext.Scheduler.Add(new PageToCrawl(new Uri(pictureUrl)));
您的图片将以与任何其他HTML页面相同的方式下载。
通过引用crawler_ProcessPageCrawlCompleted
将图片保存在crawledPage.Content.Bytes
处理程序中。
在任何一种情况下,您都可以通过以下方式区分这是一个页面还是图像。页面网址。
<强>优势强>
使用抓取工具而非单独的下载器有很多好处。
如果网站需要登录才能下载任何内容,您可以为抓取工具建立会话,而不必担心打开另一个会话。某些网站也会阻止同一用户进行多次登录。
此外,您需要注意单独的下载程序,并确保它们不会为每个图像建立新的连接。我建议创建连接池并重新使用它。否则你可以关闭服务器。
我的偏好仍然只是使用抓取工具。