5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

C#,WebClientのDownloadStringで403されるときの対処

Last updated at Posted at 2019-11-13

動いてたコードが動かない...?!でも僕何もしてないもん!!!

昔書いたスクレイピングのためのプログラムが突然動作しなくなりました.
確認すると,webページをダウンロードする箇所でexceptionをもらっている様子.具体的には,403エラーをサーバーから返されたようです.

このページでは,一部のwebサイトはChromeなどを使用するとアクセスできるが,自前のプラグラムでそのwebページのhtmlをダウンロードしようとすると,403でダウンロードできないことが述べられています.

本投稿では,そのようなページをなんとかダウンロードできるように頑張った結果を報告します.とりあえず,ここで達成されていなかった,https://www.nike.com/jp/のページをダウンロードすることを目標にします.

また筆者はネットワーク雑魚勢なので,問題があればご指摘お願いします.

403されたコード

以下のコードでは,DownloadStringの引数にhttps://www.google.co.jp/を指定すると問題なく実行できます.
一方https://www.nike.com/jp/を指定すると,403をもらいます.

base.cs
using( var wc = new System.Net.WebClient() ) {

  var html = wc.DownloadString( @"https://www.google.co.jp/" ); // OK!!!
  //var html = wc.DownloadString( @"https://www.nike.com/jp/" ); // NG...

  Console.WriteLine( html );
}

解決策

HTTPのヘッダに,何かしら指定しました.

modified.cs
using( var wc = new System.Net.WebClient() ) {

  wc.Headers.Add( "accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3" );

  var html = wc.DownloadString( $@"https://www.nike.com/jp/" ); //OK!!!

  Console.WriteLine( html );
}

このソースコードでは,keyがaccept,valueがtext/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3という謎のヘッダをリクエストに取り付けました.

このヘッダの正体は,Chromeでhttps://www.nike.com/jp/にアクセスするときに使用されていたヘッダの一部を借用したものです.どのようなヘッダが使用されていたかは,Chromeのデベロッパーツールを使用すると確認できます.すなわち,Chromeでアクセスできるんだからその状況を再現してやろう,というコンセプト.

403.png

スクショからはいろいろなヘッダが取り付けられていたことが確認できますが,https://www.nike.com/jp/のページをダウンロードするだけなら,acceptヘッダだけつけておけば問題ないようです.他のwebページでは必要なヘッダは異なるはずです.どのヘッダを取り付けると403を回避できるかは,片っ端からヘッダを付けたり外したりするとわかります.パワープレイ.

結論

適当なヘッダを取り付けておけば,とりあえずwebページは落ちてきます.
リクエストを送るwebサーバーごとに,リクエストに取り付けておくべきヘッダはもちろん異なるはずです.うまく対処しましょう.
リクエストにヘッダを取り付けない状態ではサーバーが403を返す理由を考えると,機械的にアクセスするのは避けるべきなのかなあとも思ったりはします.

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?