Télécharger l'image à partir de l'URL C#

Les visuels sont utiles pour comprendre les choses plus clairement, plus rapidement et plus facilement. Ainsi, les images sont couramment utilisées sur le Web pour de nombreuses raisons. Parfois, vous devrez peut-être télécharger des images à partir de différentes pages Web. En conséquence, cet article explique comment télécharger une image à partir d’une URL en C#. Il contient également des ressources de téléchargement afin que vous puissiez simplement tester le téléchargement d’images avec un type de projet plug-and-play.

Installation de l’API C# Web Scraping pour télécharger l’image

Aspose.HTML for .NET est une bibliothèque C# de grattage Web qui peut être utilisée pour extraire des données ou des informations à partir de pages Web ou de fichiers HTML. Vous pouvez facilement configurer l’API en téléchargeant les fichiers DLL de référence depuis la section New Releases ou en utilisant la commande d’installation NuGet suivante :

PM> Install-Package Aspose.Html

Télécharger l’image à partir de l’URL en C#

Vous pouvez facilement télécharger une image à partir d’une URL en C# avec de simples appels d’API. De même, vous pouvez traiter le HTML et d’autres formats de page Web pour télécharger les images. Vous pouvez collecter toutes les images des éléments IMG ou OBJECT du document d’entrée et les écrire dans le dossier spécifié avec des noms uniques. De plus, il prend en charge l’enregistrement d’images PNG, JPG et SVG. Veuillez suivre les étapes ci-dessous pour télécharger des images à partir de l’URL en C# :

  • Créez une classe Image pour travailler avec URL, MimeType et Content.
  • Récupérez l’image à partir de l’élément IMG ou OBJECT.
  • Écrivez l’image sur le disque à l’aide de la classe ImageSaver.

Les exemples de code suivants illustrent l’ensemble du processus de téléchargement d’image par programme en C# :

namespace DownloadImage
{
    class Program
    {
        static void Main(string[] args)
        {
            // Vous pouvez obtenir une licence d'évaluation GRATUITE sur https://purchase.aspose.com/temporary-license
            Aspose.Html.License license = new License();
            license.SetLicense("License.lic");

            // Définir le chemin pour lire ou écrire des données sur le disque
            string dataDir = @"D:\Image Web Scraping\";

            // Spécifiez le chemin pour lire le fichier d'entrée à partir du disque local
            //using var doc = new HTMLDocument(dataDir + "Sample.html");

            // Spécifiez l'URL pour télécharger l'image à partir de l'URL en C#
            using var doc = new HTMLDocument("YOUR URL GOES HERE");            
            var grabber = new ImageGrabber();
            var saver = new ImageSaver(dataDir);
            saver.Save(grabber.GrabFrom(doc));
        }
    }
}
namespace DownloadImage
{
    public class Image
    {
        public Image(ResponseMessage response)
        {
            Content = response.Content.ReadAsByteArray();
            Url = response.Request.RequestUri;
            MimeType = response.Headers.ContentType.MediaType;
        }

        public Url Url { get; }
        public MimeType MimeType { get; }
        public byte[] Content { get; }
    }
}
namespace DownloadImage
{
    class ImageGrabber
    {
        private readonly IList<IElementGrabber> _elementGrabbers = new List<IElementGrabber>();

        public ImageGrabber()
        {
            _elementGrabbers.Add(new ImgElementGrabber());
            _elementGrabbers.Add(new ObjectElementGrabber());
        }

        public IEnumerable<Image> GrabFrom(Document document)
        {
            return _elementGrabbers.SelectMany(collector => collector.Collect(document));
        }

        private interface IElementGrabber
        {
            public IEnumerable<Image> Collect(Document document);
        }

        private class ImgElementGrabber : IElementGrabber
        {
            public IEnumerable<Image> Collect(Document document)
            {
                var images = document.QuerySelectorAll("img");

                foreach (Element image in images)
                {
                    if (!image.HasAttribute("src")) continue;
                    var src = image.GetAttribute("src");
                    using var response = document.Context.Network.Send(new RequestMessage(new Url(src, document.BaseURI)));

                    if (response.IsSuccess)
                    {
                        yield return new Image(response);
                    }
                }
            }
        }

        private class ObjectElementGrabber : IElementGrabber
        {
            public IEnumerable<Image> Collect(Document document)
            {
                var objects = document.QuerySelectorAll("object");

                foreach (Element obj in objects)
                {
                    if (!obj.HasAttribute("data")) continue;
                    var data = obj.GetAttribute("data");
                    using var response = document.Context.Network.Send(new RequestMessage(new Url(data, document.BaseURI)));

                    if (response.Headers.ContentType.MediaType.Type.StartsWith("image") && response.IsSuccess)
                    {
                        yield return new Image(response);
                    }
                }
            }
        }
    }
}
namespace DownloadImage
{
    public class ImageSaver
    {
        private readonly string _folderPath;

        public ImageSaver(string folderPath)
        {
            _folderPath = folderPath;
        }

        public void Save(IEnumerable<Image> images)
        {
            foreach (var image in images)
            {
                Save(image);
            }
        }

        public void Save(Image image)
        {
            if (!Directory.Exists(_folderPath)) Directory.CreateDirectory(_folderPath);

            var fileName = Path.GetFileNameWithoutExtension(image.Url.Pathname);
            var extension = Path.GetExtension(image.Url.Pathname);

            if (string.IsNullOrEmpty(extension))
            {
                extension = image.MimeType.Type switch
                {
                    "image/jpeg" => ".jpeg",
                    "image/png" => ".png",
                    "image/svg+xml" => ".svg",
                    _ => ".png"
                };
            }

            if (string.IsNullOrEmpty(fileName))
            {
                fileName = "image";
            }

            var i = 0;
            var fileNameWithExtension = fileName + extension;
            string savedImagePath;

            while (File.Exists(savedImagePath = Path.Combine(_folderPath, fileNameWithExtension)))
            {
                fileNameWithExtension = $"{fileName} ({i++}){extension}";
            }

            File.WriteAllBytes(savedImagePath, image.Content);
        }
    }
}

Télécharger un exemple de projet de travail

Vous pouvez trouver une application de démonstration C# plug-and-play en clonant l’exemple de projet de travail à partir du GitHub Repository ou y accéder sous forme de fichier ZIP à partir de Google Drive.

Obtenez une licence d’évaluation gratuite

Vous pouvez éviter les restrictions de limitation d’évaluation en demandant une licence temporaire gratuite.

Conclusion

Dans cet article, vous avez appris à télécharger une image à partir d’une URL ou en C#. De même, vous pouvez télécharger des images à partir d’une page HTML selon vos besoins, car l’API peut résoudre les chemins relatifs vers les images. Il vous permet d’enregistrer les images au format JPG, PNG ou SVG avec des noms uniques. De plus, vous pouvez explorer d’autres fonctionnalités de scraping Web en visitant la section documentation. Si vous avez besoin de discuter de questions ou de préoccupations, veuillez nous écrire sur le forum.

Voir également

Créer un Web Scraper en C#