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サイト」が開きます。サーバーからの応答をキャプチャする方法がわかりません。
Seleniumを使用した場合のAJAX応答をキャプチャできませんでしたが、Seleniumがない場合でも、次のように機能します。
1-ブラウザのネットワーク分析ツールを監視してXMLリクエストを見つけます
2 =リクエストを特定したら、Pythonのリクエストまたはurllib2モジュールを使用してリクエストを再生成します。追加機能があるため、個人的にリクエストをお勧めします。私にとって最も重要なのはrequests.Sessionでした。
これらの2つのステップに関しては、多くのヘルプと関連する投稿を見つけることができます。
それがいつか誰かを助けることを願っています。
私はかつて、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);
""")