Visuals sind hilfreich, um Dinge klarer, schneller und einfacher zu verstehen. Daher werden Bilder aus vielen Gründen häufig über das Internet verwendet. Manchmal müssen Sie möglicherweise Bilder von verschiedenen Webseiten herunterladen. Dementsprechend behandelt dieser Artikel das Herunterladen von Bildern von einer URL in C#. Es enthält auch einige Download-Ressourcen, sodass Sie das Herunterladen von Bildern einfach mit einem Plug-and-Play-Projekt testen können.
Installation der C#-Web-Scraping-API zum Herunterladen des Bilds
Aspose.HTML for .NET ist eine Web-Scraping-C#-Bibliothek, die verwendet werden kann, um Daten oder Informationen aus Webseiten oder HTML-Dateien zu extrahieren. Sie können die API einfach konfigurieren, indem Sie die Referenz-DLL-Dateien aus dem Abschnitt Neue Versionen herunterladen oder den folgenden NuGet-Installationsbefehl verwenden:
PM> Install-Package Aspose.Html
Bild von URL in C# herunterladen
Mit einfachen API-Aufrufen können Sie Bilder ganz einfach von der URL in C# herunterladen. Ebenso können Sie HTML und andere Webseitenformate verarbeiten, um die Bilder herunterzuladen. Sie können alle Bilder aus den Elementen IMG oder OBJECT aus dem Eingabedokument sammeln und sie mit eindeutigen Namen in den angegebenen Ordner schreiben. Darüber hinaus unterstützt es das Speichern von PNG-, JPG- und SVG-Bildern. Bitte führen Sie die folgenden Schritte aus, um Bilder von der URL in C# herunterzuladen:
- Erstellen Sie eine Image-Klasse, um mit URL, MimeType und Content zu arbeiten.
- Rufen Sie das Bild aus dem IMG- oder OBJECT-Element ab.
- Schreiben Sie das Image mithilfe der ImageSaver-Klasse auf die Festplatte.
Die folgenden Codebeispiele veranschaulichen den gesamten Prozess zum programmgesteuerten Herunterladen von Bildern in C#:
namespace DownloadImage
{
class Program
{
static void Main(string[] args)
{
// Sie können eine KOSTENLOSE Evaluierungslizenz unter https://purchase.aspose.com/temporary-license erhalten
Aspose.Html.License license = new License();
license.SetLicense("License.lic");
// Legen Sie den Pfad zum Lesen oder Schreiben von Daten auf der Festplatte fest
string dataDir = @"D:\Image Web Scraping\";
// Geben Sie den Pfad zum Lesen der Eingabedatei von der lokalen Festplatte an
//using var doc = new HTMLDocument(dataDir + "Sample.html");
// Geben Sie die URL an, um das Bild von der URL in C# herunterzuladen
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);
}
}
}
Laden Sie ein funktionierendes Beispielprojekt herunter
Sie finden eine Plug-and-Play-C#-Demoanwendung, indem Sie das funktionierende Beispielprojekt aus dem GitHub-Repository klonen oder als ZIP-Datei von Google Drive darauf zugreifen.
Holen Sie sich eine kostenlose Evaluierungslizenz
Sie können die Einschränkungen der Evaluierungsbeschränkung umgehen, indem Sie eine kostenlose temporäre Lizenz anfordern.
Fazit
In diesem Artikel haben Sie gelernt, wie Sie Bilder von einer URL oder in C# herunterladen. Ebenso können Sie Bilder gemäß Ihren Anforderungen von einer HTML-Seite herunterladen, da die API die relativen Pfade zu Bildern auflösen kann. Es ermöglicht Ihnen, Bilder im JPG-, PNG- oder SVG-Format mit eindeutigen Namen zu speichern. Darüber hinaus können Sie andere Web-Scraping-Funktionen erkunden, indem Sie den Abschnitt Dokumentation besuchen. Falls Sie Fragen oder Bedenken besprechen müssen, schreiben Sie uns bitte im Forum.