C# WebClient - ソースの質問を表示
-
16-09-2019 - |
質問
C# WebClient を使用してログインの詳細をページに投稿し、すべての結果を読み取ります。
ロードしようとしているページには Flash が含まれています (ブラウザ内で HTML に変換されます)。検索エンジンに引っかからないようにフラッシュしてるのかな?
私が興味のあるフラッシュは単なるテキスト(画像/ビデオではない)などであり、Firefoxで「選択ソースを表示」すると、HTML内に見たいテキストが実際に表示されます。
(興味深いことに、ページ全体のソースを表示すると、HTML 内に表示したいテキストが表示されません。これも関係あるのでしょうか?)
現在、ログインの詳細を投稿し、HTML を再度ロードした後、Flash HTML が表示されないページが表示されます (ページ全体のソースを表示したかのように)。
前もって感謝します、
ジム
追伸:POST は実際に機能しており、ログインは成功していることを指摘しておきます。
解決
バイオリン弾き (または同様のツール) は、このような画面スクレイピングの問題を追跡するのに非常に役立ちます。通常のブラウザを使用し、フィドラーをアクティブにして、必要なデータにアクセスするためにログインとナビゲーションのプロセスを実行する際に行われるすべてのリクエストを確認します。その間に、サーバーが応答しているコードの動作が 1 つ以上異なることがわかり、実際のクライアントとは異なる HTML が表示されることになるでしょう。
以下のリスト (「101 のスクレイピング」と考えてください) が探したいものです。以下の内容のほとんどは、おそらくすでに行っている内容ですが、完全を期すためにすべてを含めました。
効果的にスクレイピングするには、次の 1 つ以上に対処する必要がある場合があります。
- Cookie および/または隠しフィールド。 サイト上の任意のページにアクセスすると、通常、セッション Cookie や非表示のフォーム フィールドを取得します。これらは (通常のブラウザでは) 後続のすべてのリクエストでサーバーに伝播されます。永続的な Cookie も取得される可能性があります。多くのサイトでは、適切な Cookie (または「Cookie なしセッション」を使用しているサイトのフォーム フィールド) なしでリクエストが表示されると、サイトはユーザーを「Cookie なし」の UI、ログイン ページ、または別の望ましくない場所 (スクレイパー アプリの視点)。最初のリクエストで設定された Cookie を必ずキャプチャし、後続のリクエストでサーバーに忠実に送信するようにしてください。ただし、後続のリクエストのいずれかが Cookie を変更する場合 (この場合、代わりにその新しい Cookie が伝播されます)。
- 認証トークン 上記の特殊なケースは、フォーム認証 Cookie または隠しフィールドです。ログイン トークン (通常は Cookie) を取得して送り返していることを確認してください。
- ポスト vs.得る これは明らかですが、実際のブラウザと同じ HTTP メソッドを使用していることを確認してください。
- フォームフィールド (特に隠されたもの!) すでに実行していると思いますが、必ず送信してください 全て 表示されるフィールドだけでなく、実際のブラウザが行うフォーム フィールドも同様です。フィールドが適切に HTML エンコードされていることを確認してください。
- HTTP ヘッダー。 これはすでにチェックしていますが、(Cookie 以外の) ヘッダーが同一であることを確認するためにもう一度チェックすることは意味があるかもしれません。私は常にまったく同じヘッダーから始めて、ヘッダーを 1 つずつ取り出して、リクエストが失敗するか偽のデータを返す原因となったヘッダーだけを保持します。このアプローチにより、スクレイピング コードが簡素化されます。
- リダイレクトします。 これらは、サーバーまたはクライアント スクリプト (例:「ユーザーが Flash プラグインをロードしていない場合は、非 Flash ページにリダイレクトします」)。見る ウェブリクエスト:この ContentType="application/xhtml+xml, text/xml, text/html; に対して WebRequest を使用して郵便番号を検索する方法文字セット=utf-8"? リダイレクションがスクリーンスクレーパーをどのようにつまずく可能性があるかを示すクレイジーな例です。スクレイピングに .NET を使用している場合、リダイレクト依存のスクレイピングには (WebClient ではなく) HttpWebRequest を使用する必要があることに注意してください。これは、デフォルトでは、WebClient はコードが 2 番目のスクレイピングに Cookie とヘッダーを添付する方法を提供していないためです。 (リダイレクト後の) リクエスト。詳細については、上のスレッドを参照してください。
- サブリクエスト (フレーム、ajax、フラッシュなど) - 多くの場合、(メインの HTTP リクエストではなく) ページ要素が、スクレイピングしたいデータをフェッチすることになります。これは、どの HTTP 応答に必要なテキストが含まれているかを確認し、実際にそのコンテンツに対するリクエストを行っているページ上の内容が見つかるまで逆方向に作業することでわかります。いくつかのサイトは、ajax 経由で圧縮または暗号化されたテキストをリクエストし、クライアント側のスクリプトを使用してそれを復号化するなど、サブリクエストで非常におかしなことを行っています。この場合は、クライアント スクリプトの動作をリバース エンジニアリングするなど、もう少し作業を行う必要があります。
- 注文する - これは明らかです:ブラウザ クライアントと同じ順序で HTTP リクエストを作成します。それは作る必要があるという意味ではありません 毎 リクエスト(例:画像)。通常、必要なデータが HTML 内になく、ajax/flash などにある場合を除き、text/html コンテンツ タイプを返すリクエストを行うだけで済みます。リクエスト。
他のヒント
(私は全体のページのソースを表示するときに興味深いことに、私は私が見たいと思っていること、HTMLの中に、テキストが表示されません。これが関連していませんか?)
これは、通常、ページが読み込まれた後に不一致ではJavaScriptを経由して、いくつかのDOM操作によって引き起こされることを意味します。 JavaScriptをオフにしてみて、それがどのように見えるかを参照してください。