0

クロスドメインの制限のためにこれがおそらく失敗していることを知っていることを指摘することから始めたいと思います-それを本当に確認したいだけです.

javascriptで開くウィンドウがあります。次に、Ajax リクエストを使用してサイトのコンテンツをプルし、それを新しいウィンドウにエコーします (ベースの href リンクを含めて、相対的に機能させるようにします)。

アイデアは、JS でレンダリングされた HTML をスクレイピングして、サイトが実際にバナーを実行しているかどうかを確認できることです (そうではないという疑いがあります!)。

私はこれでウィンドウを開きます:

msaScrape.msaWin = window.open ('null.php', 'msa_weed', "scrollbars=yes,toolbar=no,status=no,width=1000,height=1000");

これにより、新しいウィンドウにターゲット ページのコンテンツがロードされ、JS で起動されたものも正しくロードおよびレンダリングされます (バナーは少し後に表示されます)。

私は、msaScrape.msaWin.document.body、msaScrape.msaWin.document.body.innerHTML、および多くの他の組み合わせを試しましたが、完全にレンダリングされた HTML を返すものはありません。

Ajax リクエストからの raw バッファーでテストを実行すると、埋め込まれた文字列をうまく検出できますが、バナーは JS 経由で読み込まれるため、HTML でバナー ID を検索する前にそれらを DOM に読み込む必要があります。

私がやろうとしていることは可能ですか、それとも不可能なことをしようとしていますか? このポップアップ ウィンドウに書き込むことができ、生のレンダリングされていないバッファをスキャン (および一致を検出) できるのは奇妙だと思います。ポップアップ ページが HTML をレンダリングできるようにするとすぐに、それが落ちてソースを取得できなくなります。

必要に応じて、スクレイプ アンド マッチを行おうとしている (小さな) JS ビット全体を投稿できます。クライアントが私にそれをしても構わないかどうかを確認するだけです (プライベート クライアント用であり、彼らを動揺させたくないのです!)。

4

1 に答える 1

0

リモートでロードされたウィンドウのinnerHTMLをスキャンする方法は次のとおりです。

            setTimeout(function(){
                window.parent.document.getElementById('stopScraper').focus();
                if(window.parent.msaScrape.msaWin.document.body.innerHTML.match(window.parent.msaScrape.msaTest)){
                    window.parent.msaScrape.msaHits++;
                }
            }, 1000);
            window.parent.focus();

stopScraperは、呼び出し元のページにフォーカスを戻すことができる単なるフォーム入力でした。

この問題は、ポップアップがDomをレンダリングするのに十分な時間がないことが原因でした(さらに、PHPでコンテンツを文字列として取得したときに、ベースhref = "http://www.example.com"を挿入して、文字列をnull.phpにエコーアウトしたときにパスが機能しました)

リクエストの間隔を8.5秒にして実行し、ポップアップにさらに1秒待って、ページ内のJSファイルによって読み込まれたものを読み取ろうとする前にDomを完全に読み込みました。

ライブのクロスドメインテストの最終結果:

リクエスト:4024スクレイプ:4024(ビートを逃しませんでした!)ヒット:147(ドムで特定のバナーを探していました)

私がこれをどのように行ったかについてもっと説明が必要な場合は、おそらく私にメールを送ってください。エンジン全体を送信します。他のドメインで試す前に、テストモードが組み込まれています。しかし、いくつかのファイル-それに加えて、私が行っていたことの合法性についてあまり確信が持てないので、答え全体を公開するべきではないと思います!

要するに、PHP file_get_contentsを使用して同じドメイン経由でコンテンツをロードする場合は、ベースhref(欠落している場合)を追加し、null.phpのコンテンツとしてエコーします(上の質問に示すように、javascriptを使用してポップアップとしてこのウィンドウを開きます)-ここのコードは、テスト文字列を完全にロードされたDomと照合します

この時点で、すべて(外部JSファイルによってロードされたバナーを含む)をテストする必要があることを強調したいので、JSを起動させるためにブラウザーで生のHTMLをレンダリングする必要がありました。私もPhantomJSを見ていましたが、結局は必要ありませんでした!JSだけで問題を解決することができました:)

于 2012-12-14T12:23:53.313 に答える