下载图像时维基百科用户代理问题
Wikipedia user agent problem when downloading images
我正在尝试使用 c# .net 控制台应用程序从维基百科下载大约 250 张图像。
下载 3 后出现此错误。
System.Net.WebException: 'The remote server returned an error: (403) Forbidden. Please comply with the User-Agent policy: https://meta.wikimedia.org/wiki/User-Agent_policy. '
我已经阅读了他们的 User-Agent_policy 页面并添加了一个符合他们所说的用户代理。 (尽我所能,我不是网络开发人员)
他们说,让它具有描述性,如果它是机器人,则包括 bot 这个词,在括号中包括联系方式,所有这些我都做过。
我也在每张图片之间等待 5 秒..我真的真的不想在我的浏览器中手动下载它们。
static void DownloadImages()
{
var files = Directory.GetFiles(@"C:\projects\CarnivoraData", "*", SearchOption.AllDirectories);
var client = new WebClient();
client.Headers.Add("User-Agent", "bot by <My Name> (<My email address>) I am downloading an image of each carnivoran once (less than 300 images) for educational purposes");
foreach (var path in files)
{
//Console.WriteLine(path);
//Console.WriteLine(File.ReadAllText(path));
AnimalData data = JsonSerializer.Deserialize<AnimalData>(File.ReadAllText(path));
client.DownloadFile("https:" + data.Imageurl,@"C:\projects\CarnivoraImages\"+ data.Name +Path.GetExtension(data.Imageurl));
System.Threading.Thread.Sleep(5000);
}
}
有什么建议吗?
好的,我让它工作了。我认为他们的关键是使用 httpclient 而不是 webclient 下载文件,并使用 DefaultRequestHeaders.UserAgent.ParseAdd
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("<My Name>/1.0 (<My Email>) bot");
我什至没有在图片之间等待,大约一分钟就下载了它们。
还有一个好处,这里是如何使用 httpclient 下载文件(它比 webclient 更混乱!)
static async Task GetFile(HttpClient httpClient,string filepath, string url)
{
using (var stream = await httpClient.GetStreamAsync(new Uri(url)))
{
using (var fileStream = new FileStream(filepath, FileMode.CreateNew))
{
await stream.CopyToAsync(fileStream);
}
}
}
我正在尝试使用 c# .net 控制台应用程序从维基百科下载大约 250 张图像。 下载 3 后出现此错误。
System.Net.WebException: 'The remote server returned an error: (403) Forbidden. Please comply with the User-Agent policy: https://meta.wikimedia.org/wiki/User-Agent_policy. '
我已经阅读了他们的 User-Agent_policy 页面并添加了一个符合他们所说的用户代理。 (尽我所能,我不是网络开发人员)
他们说,让它具有描述性,如果它是机器人,则包括 bot 这个词,在括号中包括联系方式,所有这些我都做过。
我也在每张图片之间等待 5 秒..我真的真的不想在我的浏览器中手动下载它们。
static void DownloadImages()
{
var files = Directory.GetFiles(@"C:\projects\CarnivoraData", "*", SearchOption.AllDirectories);
var client = new WebClient();
client.Headers.Add("User-Agent", "bot by <My Name> (<My email address>) I am downloading an image of each carnivoran once (less than 300 images) for educational purposes");
foreach (var path in files)
{
//Console.WriteLine(path);
//Console.WriteLine(File.ReadAllText(path));
AnimalData data = JsonSerializer.Deserialize<AnimalData>(File.ReadAllText(path));
client.DownloadFile("https:" + data.Imageurl,@"C:\projects\CarnivoraImages\"+ data.Name +Path.GetExtension(data.Imageurl));
System.Threading.Thread.Sleep(5000);
}
}
有什么建议吗?
好的,我让它工作了。我认为他们的关键是使用 httpclient 而不是 webclient 下载文件,并使用 DefaultRequestHeaders.UserAgent.ParseAdd
var httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.UserAgent.ParseAdd("<My Name>/1.0 (<My Email>) bot");
我什至没有在图片之间等待,大约一分钟就下载了它们。
还有一个好处,这里是如何使用 httpclient 下载文件(它比 webclient 更混乱!)
static async Task GetFile(HttpClient httpClient,string filepath, string url)
{
using (var stream = await httpClient.GetStreamAsync(new Uri(url)))
{
using (var fileStream = new FileStream(filepath, FileMode.CreateNew))
{
await stream.CopyToAsync(fileStream);
}
}
}