【问题标题】:How to download all images from a site on the C# + HtmlAgilityPack? [closed]如何从 C# + HtmlAgilityPack 上的站点下载所有图像? [关闭]
【发布时间】:2015-12-25 14:13:32
【问题描述】:

我使用的程序有:Teleport、HTTrack、Offline Explorer、DownThemAll 等。所有图片仅找到 - DownThemAll。但是我有很多页面,你要下载商品的图片。 DownThemAll 不适合。

我在C#+HtmlAgilityPack上写了程序,但是她没有找到所有商品的图片。

理想情况下,我想要以下内容:

  1. 程序加载文件 URLS.txt。其中此类引用是:

http://www.onlinetrade.ru/catalogue/televizori-c181/

http://www.onlinetrade.ru/catalogue/3d_ochki-c130/

  1. 程序在这些页面上加载商品的所有图片。

你有什么建议?也许我在 C# 上写代码是错误的?

HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
WebClient wc = new WebClient();
string url = wc.DownloadString("http://www.onlinetrade.ru/catalogue/televizori-c181/");
doc.LoadHtml(url);

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//a[@class='catalog__displayedItem__columnFotomainLnk']/img");

if (nodes != null)
            {
                foreach (HtmlNode node in nodes)
                {                    
                    listBox1.Items.Add(node.Attributes["src"].Value);
                }
            }

【问题讨论】:

    标签: c# .net parsing html-agility-pack


    【解决方案1】:

    你做得很好。在这个解决方案中,我使用的是 LINQ 和 TPL。

    这个网站使用分页,所以你必须加载所有页面才能下载所有产品的图像。

    1. 加载首页(HtmlNode)
    2. 了解此产品目录有多少页
    3. 加载其他页面(HtmlNode)

    那么你有一个页面集合

    1. 加载您要下载的 img 节点
    2. 使用 de Image url 和新的 WebClient 实例创建一个元组¹
    3. 下载图片
    public class ImageDownloader
    {
        public void DownloadImagesFromUrl(string url, string folderImagesPath)
        {
            var uri = new Uri(url + "/?per_page=50");
            var pages = new List<HtmlNode> { LoadHtmlDocument(uri) };
    
            pages.AddRange(LoadOtherPages(pages[0], url));
    
            pages.SelectMany(p => p.SelectNodes("//a[@class='catalog__displayedItem__columnFotomainLnk']/img"))
                 .Select(node => Tuple.Create(new UriBuilder(uri.Scheme, uri.Host, uri.Port, node.Attributes["src"].Value).Uri, new WebClient()))
                 .AsParallel()
                 .ForAll(t => DownloadImage(folderImagesPath, t.Item1, t.Item2));
        }
    
        private static void DownloadImage(string folderImagesPath, Uri url, WebClient webClient)
        {
            try
            {
                webClient.DownloadFile(url, Path.Combine(folderImagesPath, Path.GetFileName(url.ToString())));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
    
        private static IEnumerable<HtmlNode> LoadOtherPages(HtmlNode firstPage, string url)
        {
            return Enumerable.Range(1, DiscoverTotalPages(firstPage))
                             .AsParallel()
                             .Select(i => LoadHtmlDocument(new Uri(url + "/?per_page=50&page=" + i)));
        }
    
        private static int DiscoverTotalPages(HtmlNode documentNode)
        {
            var totalItemsDescription = documentNode.SelectNodes("//div[@class='catalogItemList__numsInWiev']").First().InnerText.Trim();
            var totalItems = int.Parse(Regex.Match(totalItemsDescription, @"\d+$").ToString());
            var totalPages = (int)Math.Ceiling(totalItems / 50d);
            return totalPages;
        }
    
        private static HtmlNode LoadHtmlDocument(Uri uri)
        {
            var doc = new HtmlDocument();
            var wc = new WebClient();
            doc.LoadHtml(wc.DownloadString(uri));
    
            var documentNode = doc.DocumentNode;
            return documentNode;
        }
    }
    

    你可以这样使用:

    DownloadImagesFromUrl("http://www.onlinetrade.ru/catalogue/televizori-c181/", @"C:\temp\televizori-c181\images");
    

    然后下载了 178 张图片。

    图片在下载的时候,有时候会失败,建议你用Polly实现Retry pattern

    Obs¹:WebClient 不支持并行操作,所以我为每个图像 url 创建一个。

    【讨论】:

    • 谢谢。但是同样的问题:并非所有图片都已加载。在此页面上,50 张图片,仅下载 10 张。
    • @program23 更改代码,现在将下载所有图像
    • 我需要上传的图片是“class= catalog __displayedItem__column FotomainLnk”。为什么找不到图片的所有链接?
    • @program23 你只需要下载产品的图片吗?
    • @program23 所以我之前的版本是对的,下载了10张图片。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 2012-08-28
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    相关资源
    最近更新 更多