.NET Selenium 图像下载 - “远程服务器返回错误:(403) 禁止。”

问题描述 投票:0回答:1

System.Net.WebException:“远程服务器返回错误:(403) 禁止。”

我正在尝试使用 C# 中的 Selenium 从网页下载图像。该网页似乎阻止直接下载,虽然我可以通过右键单击图像来手动下载图像,但我的 Selenium 代码遇到了问题,可能是由于安全策略或其他限制。

我可以使用 Chrome 中的插件下载整个页面的图像,也可以通过右键单击鼠标手动下载图像,但我想在我的应用程序中自动下载它们。您对此有不同的解决方案吗?

这是我的代码片段:

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System.Net;

class Program
{
    [Obsolete]
    static async Task Main(string[] args)
    {
        Console.Write("URL: ");
        string url = Console.ReadLine() ?? "";

        await DownloadImagesAsync(url);
    }

    [Obsolete]
    static async Task DownloadImagesAsync(string url)
    {
        string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
        string downloadFolder = Path.Combine(desktopPath, "DownloadedImages");

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

        var options = new ChromeOptions();
        options.AddArgument("user-agent=Mozilla/....");

        using var driver = new ChromeDriver(options);

        try
        {
            driver.Navigate().GoToUrl(url);

            var imageElements = driver.FindElements(By.TagName("img"));

            using WebClient webClient = new();

            webClient.Headers.Add("User-Agent", "Mozilla/....");

            Uri uri = new(url);
            string referer = $"{uri.Scheme}://{uri.Host}/";
            webClient.Headers.Add("Referer", referer);
            
            webClient.Headers.Add("Sec-Ch-Ua", "Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Google Chrome\";v=\"120");
            webClient.Headers.Add("Sec-Ch-Ua-Mobile", "?0");
            webClient.Headers.Add("Sec-Ch-Ua-Platform", "\"Windows\"");

            for (int i = 0; i < imageElements.Count; i++)
            {
                string fileName = $"{Guid.NewGuid()}_{i + 1}.jpg";

                try
                {
                    var imageElement = imageElements[i];

                    string imageUrl = imageElement.GetAttribute("src");

                    string filePath = Path.Combine(downloadFolder, fileName);

                    await webClient.DownloadFileTaskAsync(imageUrl, filePath);

                    Console.WriteLine($"{fileName}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"{fileName} => Error: {ex.Message}");
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("Error: " + ex.Message);
        }
        finally
        {
            driver.Quit();
        }
   }
}

这是我在 DownloadFileTaskAsync 过程中遇到的错误: System.Net.WebException:“远程服务器返回错误:(403) 禁止。”

c# .net selenium-webdriver selenium-chromedriver http-status-code-403
1个回答
0
投票

这看起来像是机器人保护。您可以尝试以下方法来绕过它:

  1. 确保您使用的是最新的用户代理版本
  2. 启用 cookie 并尝试在执行请求之前设置一些
  3. 尝试更改引用标头
  4. 下载图片前尝试设置一些延迟
  5. 像人一样行动,而不是机器人
© www.soinside.com 2019 - 2024. All rights reserved.