2016-07-14 8 views
1

最近私はサイドプロジェクトとしてWebクローラーを作成しましたが、構造化された方法はSystem.Net.WebClientDownloadString関数を使用して指定されたアドレスhtmlをダウンロードし、 htmlに含まれているリンクのうちのどれかを探し、見つかったすべてのリンク上でプロセスを繰り返します(すでにクロールされているものはスキップします)。WebClient.DownloadStringがぎこちなくなっています

ほとんどのアドレスでうまく動作しますが、それを種としてwww.yahoo.comで起動すると、非常に奇妙なことが起こります。 DownloadStringからhtmlのマークアップを取得する代わりに、ちょっとばかばかしいバックを取得しています。

DownloadString機能の私の理解では、それが基本的にWebページ上のときにview page sourceあなたが見るもの恩返しだろうということですが、私は、私はHTMLを表示ブラウザでwww.yahoo.comで期待どおりにことを行うときので、これは場合することはできません。

私の最初の考えは、文字列がデコードに使用されたものとは異なるエンコーダでエンコードされているように見えたが、手動でエンコードするときに使用するエンコード文字列をSystem.Net.WebClientクラスを介してダウンロードします。

これは私が受け取るテキストの一部です:

‹Ä½y“£FÖ7úÿó)4í™ûQ«Ä.è;^´ïû~ûvH€Ö ÷›€ÈL©ªì‰{­» gÉ“'OîÉ¿ÿQî•Æ‹~%cûÿùwøŸŒ¥þþEÜ¥|ÉØ’cüþEsr“Ñ—ŒbK¾KËlδâÚûãg윻2}×Ïy€S°õ3úü/w 2žB†©š.íí ³±+·7s®“9XÚQórže˜AƼŒªùëÀÝfÊ×ÿÊë€" µdÙ¾¤k_2~p¶µß¿È

www.yahoo.comからHTMLを引っ張ったときに、私は何か間違ったことをやっているのであれば、私の最初の質問は、誰もが知っているんですか?もしそうなら、私はhtmlを引っ張ってはならない別の方法がありますか?私の次の質問は、これが設計によるのであれば、どのようにしてこれを達成するのでしょうか?なぜ彼らはそれをスクランブルするだろうか?競合他社がウェブサイトをクロールしないようにしようとしていますか?

答えて

2

yahooはユーザエージェント特有のようです。これを指定して適切なプレーンテキスト応答を取得することができます。

Using webRequest As WebClient = New WebClient 
     webRequest.Headers(HttpRequestHeader.UserAgent) = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727)" 
     Dim url As String = "http://www.yahoo.com" 
     Dim webPage As String = webRequest.DownloadString(url) 
     Debug.WriteLine(webPage) 
    End Using 
+1

「テスト」でもすべてのユーザーエージェントがそのヘッダー値をそこに置くように思えます。 – Esko

+1

それはトリックでした。私は決してそれをチェックすると思っただろう、ありがとう! –

+0

問題ありません - 喜んで助けてください –

関連する問題