web-dev-qa-db-ja.com

キャプチャAJAX Seleniumおよびpython

Firefoxでリンクをクリックすると、WebページがJavaScriptを使用してリクエストを送信し、サーバーがWebサイトアドレスを含む何らかの応答を送信します。したがって、この新しいWebサイトは新しいウィンドウで開きます。リンクの背後にあるhtmlコードは次のとおりです(最初と最後の<span>タグを省略しました):

> class="taLnk hvrIE6"
> onclick="ta.trackEventOnPage('AttractionContactInfo', 'Website',
> 2316062, 1); ta.util.cookie.setPIDCookie(15190);
> ta.call('ta.util.link.targetBlank', event, this,
> {'aHref':'LqMWJQiMnYQQoqnQQxGEcQQoqnQQWJQzZYUWJQpEcYGII26XombQQoqnQQQQoqnqgoqnQQQQoqnQQQQoqnQQQQoqnqgoqnQQQQoqnQQuuuQQoqnQQQQoqnxioqnQQQQoqnQQJMsVCIpEVMSsVEtHJcSQQoqnQQQQoqnxioqnQQQQoqnQQniaQQoqnQQQQoqnqgoqnQQQQoqnQQWJQzhYmkXHJUokUHnmKTnJXB',
> 'isAsdf':true})">Website

サーバーの応答をキャプチャし、PythonとSeleniumを使用して「新しいWebサイト」を抽出します。私はスクレイピングにBeautifulSoupを使用しており、Seleniumはかなり新しいです。

これまでのところ、この要素を見つけて、Seleniumを使用してクリックすると、新しいウィンドウで「新しいWebサイト」が開きます。サーバーからの応答をキャプチャする方法がわかりません。

15
Faisal

Seleniumを使用した場合のAJAX応答をキャプチャできませんでしたが、Seleniumがない場合でも、次のように機能します。

1-ブラウザのネットワーク分析ツールを監視してXMLリクエストを見つけます

2 =リクエストを特定したら、Pythonのリクエストまたはurllib2モジュールを使用してリクエストを再生成します。追加機能があるため、個人的にリクエストをお勧めします。私にとって最も重要なのはrequests.Sessionでした。

これらの2つのステップに関しては、多くのヘルプと関連する投稿を見つけることができます。

それがいつか誰かを助けることを願っています。

1
Faisal

私はかつて、Seleniumを使用してページにjavascriptを挿入するいくつかのajax呼び出しを傍受しました。歴史の悪い面は、セレンが時々「壊れやすい」と言うことができるということです。したがって、理由もなく、この注射を行っているときにセレンの例外が発生しました。

とにかく、私の考えはXHR呼び出しをインターセプトし、その応答を、私が作成したSeleniumから操作できる新しいdom要素に設定することでした。傍受の条件では、リクエストを行ったURLを使用して、実際に必要なURLを傍受することもできます(self._url)

ところで、私は すべてのajax呼び出しをインターセプトしますか? からアイデアを得ました

多分これは役に立ちます。

browser.execute_script("""
(function(XHR) {
  "use strict";

  var element = document.createElement('div');
  element.id = "interceptedResponse";
  element.appendChild(document.createTextNode(""));
  document.body.appendChild(element);

  var open = XHR.prototype.open;
  var send = XHR.prototype.send;

  XHR.prototype.open = function(method, url, async, user, pass) {
    this._url = url; // want to track the url requested
    open.call(this, method, url, async, user, pass);
  };

  XHR.prototype.send = function(data) {
    var self = this;
    var oldOnReadyStateChange;
    var url = this._url;

    function onReadyStateChange() {
      if(self.status === 200 && self.readyState == 4 /* complete */) {
        document.getElementById("interceptedResponse").innerHTML +=
          '{"data":' + self.responseText + '}*****';
      }
      if(oldOnReadyStateChange) {
        oldOnReadyStateChange();
      }
    }

    if(this.addEventListener) {
      this.addEventListener("readystatechange", onReadyStateChange,
        false);
    } else {
      oldOnReadyStateChange = this.onreadystatechange;
      this.onreadystatechange = onReadyStateChange;
    }
    send.call(this, data);
  }
})(XMLHttpRequest);
""")
15
supita