WebClient запрещает открывать страницу википедии?

Вот код, который я пытаюсь запустить:

var wc = new WebClient();
var stream = wc.OpenRead(
             "http://en.wikipedia.org/wiki/List_of_communities_in_New_Brunswick");

Но я продолжаю получать запрещенную ошибку 403. Не понимаю, почему. На других страницах все работало. Я могу нормально открыть страницу в своем браузере. Как я могу это исправить?


person mpen    schedule 27.01.2011    source источник


Ответы (1)


Обычно я бы не использовал OpenRead(), вместо этого попробуйте DownloadData() или DownloadString().

Также может случиться так, что википедия намеренно блокирует ваш запрос, потому что вы не предоставили строку пользовательского агента:

WebClient client = new WebClient();
client.Headers.Add("user-agent", 
    "Mozilla/5.0 (Windows; Windows NT 5.1; rv:1.9.2.4) Gecko/20100611 Firefox/3.6.4");

Я довольно часто использую WebClient и довольно быстро узнал, что веб-сайты могут и будут блокировать ваш запрос, если вы не предоставите строку пользовательского агента, которая соответствует известному веб-браузеру. Кроме того, если вы создадите свою собственную строку пользовательского агента (например, «мой супер крутой парсер»), вы также будете заблокированы.

[Редактировать]

Я изменил свой пример строки пользовательского агента на строку современной версии Firefox. Первоначальный пример, который я привел, был строкой пользовательского агента для IE6, что не очень хорошая идея. Почему? Некоторые веб-сайты могут выполнять фильтрацию на основе IE6 и отправлять всем пользователям этого браузера сообщение или на другую страницу с надписью «Пожалуйста, обновите свой браузер» — это означает, что вы не получите контент, который хотели получить.

person JK.    schedule 27.01.2011
comment
Использование DownloadString() вместо OpenRead() будет работать как с указанием пользовательского агента, так и без него. Если вы предпочитаете использовать OpenRead() по какой-либо причине, добавление строки пользовательского агента в заголовки работает. - person Nathan Taylor; 27.01.2011
comment
Просто странно, потому что он отлично работал для некоторых других провинций ... хотя добавление строки пользовательского агента исправило это для NB. Спасибо! Почему DownloadString должно иметь значение? Он так же подключается, не так ли? - person mpen; 27.01.2011
comment
@ Натан, я бы все равно использовал известный пользовательский агент. Что, если через пару месяцев веб-сайт изменится и теперь отклонит пустой пользовательский агент? Ваш код ломается без предупреждения, и найти проблему будет очень сложно. Но вы можете быть уверены, что они не начнут внезапно отвергать известный пользовательский агент. - person JK.; 27.01.2011
comment
С этим не поспоришь. - person Nathan Taylor; 27.01.2011