0

URLに外部ページを配置するリンクを介してアクセスされているhtmlページがあります-例

http://www.mydomain.com/mypage?external-page=encodedURL

渡された URL から一部のデータをスクレイピングするのは、私のページの責任です。

javascript/jquery を使用して、渡されたページにアクセスするにはどうすればよいですか? 特定のクラスと ID のコンテンツを引き出すことができる必要があります。

これは、同一生成元ポリシーに違反していますか? もしそうなら、このような外部ページを処理する他の方法はありますか? ブラウザまたは端末コマンドで Web ページにアクセスしてコンテンツを受信できるが、js ファイルでは受信できないのは奇妙に思えます。

4

2 に答える 2

1

外部ページとあなたのページが同じドメインにある場合、JavaScript を使用してその外部ページにアクセスできるはずです。そうしないと、JavaScript が外部サイトへのアクセスを許可されず、ブラウザーがクロスサイト スクリプティングを防止します。

于 2013-03-07T00:35:58.780 に答える
1

ブラウザー拡張機能を使用して外部ページをスクレイピングし、データをサイトに送信するか、ページ内に表示して、DOM 経由でページの JavaScript からアクセスできるようにします。

ドメインでプロキシを使用して、外部ページを取得し、それをオリジンがドメインにある JavaScript に渡すこともできます。

アクセス可能な外部ページ用の API を使用できます。

Access-Control-Allow-Origin=* でページを提供するように、外部ページのコードを要求、コマンド、変更することができます (アクセスできる場合)。

できることはこれだけだと思います。

編集: 「奇妙に見える」は、ユーザープロセスの意図的な違いに気付くまでです. ユーザーが悪意を持っているとは考えられていませんが、プロセスはそうである可能性があります。プロセスは、たとえば、ユーザーがログインしている gmail セッションから外部ページにアクセスできる場合にデータを取得し、そのデータをサーバーに送信することができます。端末上のユーザーはおそらく (常にではありませんが!) そのセッションにログインしたユーザーであるため、ユーザーが悪意のあるユーザーであるとは考えられません。ただし、ユーザーが移動する Web サイトを起源とするスクリプトは、そのユーザーと同じ権限で動作することはできません。そのスクリプトはエージェントでもあり、アクションを実行できますが、ユーザーによって作成または指示されることはありません。これが、オリジンの分離と同一オリジン ポリシーの最も強力な理由です。

ブックマークレットと IFrame の実行コンテキスト ブックマークレットを介してすべてのページに JS を挿入する場合、その挿入されたコードは、ページの残りの部分、または少なくともそのページの「トップ フレーム」と同じオリジンを持っているかのように動作します。 . トップフレームと同じコンテキストで実行されます。ページにネストされた iframe がある場合、ブックマークレットがそこに挿入しようとすると、「安全でないページ x からのアクセス試行」エラーが発生します。これは、ブックマークレットの起点がトップ ページにあり、トップ ページが異なるドメインのネストされた iframe にアクセスできないためです。

そのため、スクレイピングしたいサイトの一部がトップ フレームの下の iframe にある場合、ブックマークレットはそれを取得できません。

ブックマークレットを使用してデータを送信する あるページの URL を自分のドメインで取得し、別のドメインのその URL からデータを取得し、そのデータを同じページに表示するには、データを取得する方法が必要です。 . ブックマークレットを使用できますが、フローには「ユーザー ヘルプ」が含まれます。次のようになります。

  1. D. ドメインのページを読み込みます。ユーザーは URL を入力ボックスに入力します。送信をクリックします。
  2. D の Javascript は、ユーザーが指定した URL を指す新しいタブ/ウィンドウを開きます。
  3. ユーザーがその外部ページでスクレイピング ブックマークレットをクリックすると、目的のデータ X が収集されます。
  4. 目的のデータ X は、Ajax を介して「サーバー」S にセッション識別子 I で送信されます。
  5. ページ D はサーバー S をポーリングし、セッション識別子 I を持つデータが取得されたことが通知されるまで、そのデータを取得して D に表示します。

サーバーの必要性があります。これはドメインに固有であるため、ローカル ストレージを使用して情報を送信することはできません。サーバーを必要としない代替手段があります。ブラウザ拡張機能を作成する必要があります。

ブラウザ拡張機能を使用したデータの送信 拡張機能の「バックグラウンド ページ」は、基本的にすべてのブラウザ タブのローカル サーバーと同じであり、異なるドメインをターゲットとするタブ間で情報を送信できます。このセットアップの「クライアント」は「コンテンツ スクリプト」であり、すべてのページにロードされます (ユーザーが実際にブックマークレットをクリックしてロードする必要がないことを除いて、ブックマークレットと同じです。これは自動的に行われます)。フローは次のようになります。

  1. 再びDページ。ユーザーが入力ボックスに URL を入力します。送信 -> をクリックすると、拡張機能のコードがトリガーされます。
  2. 拡張機能のバックグラウンド ページは、タブを開くように指示し、それを URL にターゲティングします。
  3. コンテンツ スクリプトがそのタブに自動的に読み込まれ、取得するデータをバックグラウンドでチェックします。そのデータを取得し、メッセージ (json 文字列) を介してバックグラウンド ページに送信します。
  4. バックグラウンド ページは、その通知とデータをページ D の元のコンテンツ スクリプトにプッシュします。これにより、情報が表示されます。
  5. 必要に応じて、バックグラウンド ページも情報をサーバーに送信して、そのユーザーのデータストアに保存します。

私がブラウザ拡張機能の「バックグラウンド ページ」と「コンテンツ スクリプト」に使用する言語は、Google Chrome に重点を置いています。同じ概念が Safari や Firefox でも利用できます。IE をサポートしたい場合は、別のことを解決する必要があります。IE10 は、拡張機能をサポートする予定さえありません。

于 2013-03-07T00:40:36.140 に答える