Fai*_*sal 13 python selenium web-scraping
我点击Firefox中的链接,网页使用javascript发送请求,然后服务器发送某种包含网站地址的响应.因此,这个新网站将在新窗口中打开.链接后面的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
Run Code Online (Sandbox Code Playgroud)
我想捕获服务器响应并使用Python和Selenium提取"新网站".我一直在使用BeautifulSoup进行刮擦,这对Selenium来说还是一个新手.
到目前为止,我能够找到这个元素并使用selenium点击它,这将在新窗口中打开"新网站".我不知道如何从服务器捕获响应.
小智 16
我曾经截获了一些使用selenium向页面注入javascript的ajax调用.历史的另一个不好的方面是硒有时可能会说"脆弱".因此,无论如何我在进行注射时都会遇到硒异常.
无论如何,我的想法是拦截XHR调用,并将其响应设置为我创建的一个新的dom元素,我可以从selenium操作.在拦截的条件下,你甚至可以使用发出请求的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);
""")
Run Code Online (Sandbox Code Playgroud)
小智 12
当我尝试根据 AJAX 请求捕获 XHR 内容时,我来到了此页面。我最终找到了这个包
from seleniumwire import webdriver # Import from seleniumwire
# Create a new instance of the Firefox driver
driver = webdriver.Firefox()
# Go to the Google home page
driver.get('https://www.google.com')
# Access requests via the `requests` attribute
for request in driver.requests:
if request.response:
print(
request.url,
request.response.status_code,
request.response.headers['Content-Type']
)
Run Code Online (Sandbox Code Playgroud)
这个包允许从任何请求获取内容响应,例如 json :
https://www.google.com/ 200 text/html; charset=UTF-8
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png 200 image/png
https://consent.google.com/status?continue=https://www.google.com&pc=s×tamp=1531511954&gl=GB 204 text/html; charset=utf-8
https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_272x92dp.png 200 image/png
https://ssl.gstatic.com/gb/images/i2_2ec824b0.png 200 image/png
https://www.google.com/gen_204?s=webaft&t=aft&atyp=csi&ei=kgRJW7DBONKTlwTK77wQ&rt=wsrt.366,aft.58,prt.58 204 text/html; charset=UTF-8
..
Run Code Online (Sandbox Code Playgroud)
我无法使用 selenium 捕获 AJAX 响应,但这里是有效的,尽管没有 selenium:
1-通过监控浏览器中的网络分析工具找出XML请求
2= 识别请求后,使用 Python 的 requests 或 urllib2 模块重新生成它。我个人推荐 requests 因为它的附加功能,对我来说最重要的是 requests.Session。
您可以找到有关这两个步骤的大量帮助和相关帖子。
希望有一天它能帮助别人。
| 归档时间: |
|
| 查看次数: |
13807 次 |
| 最近记录: |