c#实现网页图片提取工具代码分享


在C#中实现一个网页图片提取工具,通常需要用到网络请求(如HttpClient)来下载网页内容,然后使用HTML解析库(如HtmlAgilityPack)来解析HTML文档,并提取其中的图片URL。最后,可以使用HttpClient再次请求这些图片URL,将它们保存到本地文件系统中。

下面是一个简化的示例代码,展示了如何使用C#和HtmlAgilityPack来从网页中提取图片并保存到本地:


using System;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
using HtmlAgilityPack;

class WebImageExtractor
{
    static async Task Main(string[] args)
    {
        string url = "http://example.com"; // 目标网页的URL
        string savePath = "D:\\ImagesFromWeb"; // 保存图片的本地路径

        if (!Directory.Exists(savePath))
        {
            Directory.CreateDirectory(savePath);
        }

        HtmlDocument doc = await GetHtmlDocumentAsync(url);
        var images = doc.DocumentNode.SelectNodes("//img[@src]");

        if (images != null)
        {
            foreach (var img in images)
            {
                string imgUrl = img.GetAttributeValue("src", string.Empty);
                string imgExtension = Path.GetExtension(imgUrl);
                string imgFileName = Path.Combine(savePath, $"image_{Guid.NewGuid().ToString().Substring(0, 8)}{imgExtension}");

                await DownloadImageAsync(imgUrl, imgFileName);
            }
        }
    }

    static async Task<HtmlDocument> GetHtmlDocumentAsync(string url)
    {
        using (HttpClient client = new HttpClient())
        {
            string html = await client.GetStringAsync(url);
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(html);
            return doc;
        }
    }

    static async Task DownloadImageAsync(string imageUrl, string filePath)
    {
        using (HttpClient client = new HttpClient())
        {
            HttpResponseMessage response = await client.GetAsync(imageUrl, HttpCompletionOption.ResponseHeadersRead);
            response.EnsureSuccessStatusCode();

            using (Stream contentStream = await response.Content.ReadAsStreamAsync(),
                    fileStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None,
                        bufferSize: 8192, useAsync: true))
            {
                await contentStream.CopyToAsync(fileStream);
            }
        }
    }
}

**注意**:

- 示例中使用了`HtmlAgilityPack`库来解析HTML,你需要先通过NuGet安装这个库。

- 示例代码假设所有图片URL都是直接指向图片文件的,实际情况中可能需要处理相对路径、基URL等问题。

- 示例中图片文件名使用GUID生成,以避免命名冲突。

- 示例代码使用了异步编程模型(async/await),以提高应用程序的响应性和效率。

- 请确保目标网页的`robots.txt`文件允许你进行此类抓取操作,以避免违反其使用条款。