我正在使用谷歌Abot网络爬虫,并想知道如何存储单独的网页或只是图像到一个文件夹。我查看了论坛,其中显示了以下内容。但是我不能多次存储在同一个文件中,这是否意味着每次我必须创建一个不同的文件名,还是有一种更简单的方式来存储网页。另外,如果我只想存储图像,我应该使用什么选项?我检查了其他的Abot堆栈溢出帖子,并发现下面的爬行页面内容为注释。如何使用它们只存储图像?
//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}
我用crawledPage.HtmlDocument.Save(@"C://TESTCRAWL/FILE"+rnd.Next(1,100).ToString()+".html",System.Text.Encoding.UTF8来存储网页,有办法只获取图像吗?
发布于 2015-10-06 04:59:38
ABot不会自动下载图像,它是为爬行web urls而构建的,您需要编写代码来提取图像urls,然后遍历所有urls
步骤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:驱动器中下载映像
int i = 0;
foreach (string src in imgScrs)
{
client.DownloadFile(new Uri(src), @"c:\temp\image_" + i +".jpg");
i++;
}注释::我使用"i“变量为每个图像指定一个唯一的名称,否则每次都会覆盖相同的图像
发布于 2017-01-26 20:20:11
现在,您可以让Abot (c#)为您下载图像。至少有两个解决方案。
制备
在每个解决方案中,创建和使用自定义CrawlConfiguration实例,并将其传递给SiteCrawler构造函数。
在配置对象中包括图像类型MIME。
config.DownloadableContentTypes = "text/html,application/json,text/plain,image/jpeg,image/pjpeg,*/*"
解决方案1
LinkSelector,从HapHyperLinkParser继承并将其传递给SiteCrawler构造器。LinkSelector重写GetHrefValues中。从下载的页面中提取图像URL,并将它们包含在返回的列表中。crawler_ProcessPageCrawlCompleted,在crawledPage.Content.Bytes处理程序中保存图像。解决方案2
crawler_ProcessPageCrawlCompleted处理程序中的图像URL,并将它们添加到爬虫调度程序中,如下所示
e.CrawlContext.Scheduler.Add(new PageToCrawl(new Uri(pictureUrl)));
您的图像将以与其他HTML页面相同的方式下载。crawler_ProcessPageCrawlCompleted,在crawledPage.Content.Bytes处理程序中保存图像。在任何一种情况下,您都可以通过例如页面URL来区分这是一个页面还是图像。
福利
使用你的爬行器而不是单独的下载器有很大的好处。
如果网站需要登录才能下载任何内容,您可以为爬虫建立会话,而不必担心会打开另一个会话。一些网站也防止同一用户多次登录。
另外,您需要小心使用单独的下载程序,并确保它们不会为每个映像建立新的连接。我建议创建连接池并重用它。否则,您可以关闭服务器。
我更喜欢只使用爬行器。
https://stackoverflow.com/questions/29621616
复制相似问题