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) 禁止。”
这看起来像是机器人保护。您可以尝试以下方法来绕过它: