2011-01-27 6 views
3

は、ここで私が実行しようとしているコードです:WebClientがwikipediaを開くことを禁止していますか?

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

しかし、私は403禁断のエラーを取得しておきます。理由を理解しないでください。他のページでもうまくいきました。私はブラウザでページを正常に開くことができます。これをどうすれば解決できますか?

答えて

10

私は通常OpenRead()を使用しませんが、代わりにDownloadData()またはDownloadString()を試してみます。

あなたはユーザーエージェント文字列を提供していないので、また、それは、ウィキペディアが意図的にあなたの要求をブロックしていることであるかもしれない:私はかなり頻繁にWebクライアントを使用し

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"); 

、およびウェブサイトは、あなたのリクエストをブロックすることができることを非常に素早く学びました既知のWebブラウザに一致するユーザーエージェント文字列を指定しない場合。また、あなた自身のユーザーエージェント文字列(例えば "my super cool web scraper")を作成すると、ブロックされます。

[編集]

私は、Firefoxの現代版のように私の例のユーザーエージェント文字列を変更しました。私が与えた元の例はIE6用のユーザーエージェント文字列でしたが、これは良い考えではありません。どうして?一部のウェブサイトでは、IE6に基づいてフィルタリングを実行し、そのブラウザを使用している人にメッセージを送信するか、「ブラウザを更新してください」という別のページに送信することがあります。

+1

OpenRead()の代わりに 'DownloadString()'を使うと、ユーザエージェントを指定してもしなくても動作します。なんらかの理由で 'OpenRead()'を使いたい場合は、ヘッダにユーザエージェントの文字列を追加する*は*動作します。 –

+0

他のいくつかの州ではうまくいたのでちょっと奇妙です...ユーザエージェントの文字列を追加するとNBのために修正されました。ありがとう!なぜ、 'DownloadString'が何か変わるべきなのでしょうか?それは同じ方法で接続しますね。 – mpen

+1

@Nathanとにかくよく知られているユーザーエージェントを使用します。 2ヶ月間ウェブサイトの変更が追跡され、空のユーザーエージェントが拒否された場合はどうなりますか?あなたのコードは警告なしで壊れ、問題を見つけるのは非常に難しいでしょう。しかし、突然既知のユーザーエージェントを拒否しないようにすることはかなり確実です。 –

関連する問題