最近私はサイドプロジェクトとしてWebクローラーを作成しましたが、構造化された方法はSystem.Net.WebClient
のDownloadString
関数を使用して指定されたアドレス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を引っ張ってはならない別の方法がありますか?私の次の質問は、これが設計によるのであれば、どのようにしてこれを達成するのでしょうか?なぜ彼らはそれをスクランブルするだろうか?競合他社がウェブサイトをクロールしないようにしようとしていますか?
「テスト」でもすべてのユーザーエージェントがそのヘッダー値をそこに置くように思えます。 – Esko
それはトリックでした。私は決してそれをチェックすると思っただろう、ありがとう! –
問題ありません - 喜んで助けてください –