ビジュアルは、物事をより明確に、より速く、より簡単に理解するのに役立ちます。したがって、画像は多くの理由でWeb上で一般的に使用されます。場合によっては、別のWebページから画像をダウンロードする必要があります。したがって、この記事では、C#でURLから画像をダウンロードする方法について説明します。また、プラグアンドプレイの種類のプロジェクトで画像のダウンロードを簡単にテストできるように、いくつかのダウンロードリソースも含まれています。
画像をダウンロードするためのC#WebスクレイピングAPIのインストール
Aspose.HTML for .NETは、WebページまたはHTMLファイルからデータまたは情報を抽出するために使用できるWebスクレイピングC#ライブラリです。 新しいリリースセクションから参照DLLファイルをダウンロードするか、次のNuGetインストールコマンドを使用して、APIを簡単に構成できます。
PM> Install-Package Aspose.Html
C#のURLから画像をダウンロードする
簡単なAPI呼び出しで、C#のURLから画像を簡単にダウンロードできます。同様に、HTMLやその他のWebページ形式を処理して画像をダウンロードできます。入力ドキュメントのIMGまたはOBJECT要素からすべての画像を収集し、一意の名前で指定されたフォルダーに書き込むことができます。さらに、PNG、JPG、およびSVG画像の保存をサポートします。 C#のURLから画像をダウンロードするには、以下の手順に従ってください。
- URL、MimeType、およびContentを操作するImageクラスを作成します。
- IMGまたはOBJECT要素から画像を取得します。
- ImageSaverクラスを使用して、イメージをディスクに書き込みます。
次のコードサンプルは、C#でプログラムで画像をダウンロードするプロセス全体を示しています。
namespace DownloadImage
{
class Program
{
static void Main(string[] args)
{
// https://purchase.aspose.com/temporary-licenseで無料の評価ライセンスを取得できます
Aspose.Html.License license = new License();
license.SetLicense("License.lic");
// ディスク上のデータを読み書きするためのパスを設定します
string dataDir = @"D:\Image Web Scraping\";
// ローカルディスクから入力ファイルを読み取るパスを指定します
//var doc = new HTMLDocument(dataDir + "Sample.html");を使用します。
// C#でURLから画像をダウンロードするURLを指定します
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);
}
}
}
実用的なサンプルプロジェクトをダウンロードする
プラグアンドプレイのC#デモアプリケーションは、GitHubリポジトリから作業サンプルプロジェクトのクローンを作成するか、GoogleドライブからZIPファイルとしてアクセスすることで見つけることができます。
無料の評価ライセンスを取得する
無料一時ライセンスをリクエストすることで、評価制限の制限を回避できます。
結論
この記事では、URLまたはC#から画像をダウンロードする方法を学びました。同様に、APIは画像への相対パスを解決できるため、要件に応じてHTMLページから画像をダウンロードできます。 JPG、PNG、またはSVG形式の画像を一意の名前で保存できます。さらに、ドキュメントセクションにアクセスすると、他のWebスクレイピング機能を調べることができます。質問や懸念について話し合う必要がある場合は、フォーラムまでご連絡ください。