Python Selenium PhantomJS等待图像可用
我正在编写一个基于SeleniumPhantomJS的通用蜘蛛来访问和抓取网页。 程序的输入包括需要爬网的模板(css选择器),输出应根据模板生成数据。 如果我们试图从web站点抓取图像,有时可能会得到空图像(如果执行时的页面源不包括图像,就是这种情况),这可以通过 然而,当网页为图像提供占位符时,会出现更具挑战性的问题,这些占位符随后会通过Python Selenium PhantomJS等待图像可用,python,selenium,web-crawler,phantomjs,wait,Python,Selenium,Web Crawler,Phantomjs,Wait,我正在编写一个基于SeleniumPhantomJS的通用蜘蛛来访问和抓取网页。 程序的输入包括需要爬网的模板(css选择器),输出应根据模板生成数据。 如果我们试图从web站点抓取图像,有时可能会得到空图像(如果执行时的页面源不包括图像,就是这种情况),这可以通过 然而,当网页为图像提供占位符时,会出现更具挑战性的问题,这些占位符随后会通过ajax请求被真实图像URL替换 问题是,如何确保selenium只在图像的真实URL包含到页面中后才对其进行爬网。我想检查图像的src属性是否有变化,只有
ajax
请求被真实图像URL替换
问题是,如何确保selenium只在图像的真实URL包含到页面中后才对其进行爬网。我想检查图像的src
属性是否有变化,只有在一次变化之后,我才应该开始解析页面源代码。但是,不确定如何实现这一点?或者这是个好主意
编辑
img{
宽度:100%;
高度:自动;
}
$(文档).ready(函数(){
//setTimeout(函数(){
//替换图像占位符
$.get(“ajax/test.html”,函数(数据){
}).always(函数(){
$('img')。每个(函数(){
$(this.attr('src',$(this.attr('data-backup'));
});
});
// }, 1000);
});
如果站点使用jQuery,您可以检查以下内容以确保所有ajax交互都已完成
jQuery.active == 0
检查此线程以了解相关问题:
编辑
此代码适用于我们:
public static int TIME_OUT_SECONDS = 10;
public static int POLLING_MILLISECONDS = 100;
public static final String JS_JQUERY_DEFINED = "return typeof jQuery != 'undefined';";
public static final String JS_JQUERY_ACTIVE = "return jQuery.active != 0;";
public static final String JS_DOC_READY = "return document.readyState != 'complete';";
public static final String JS_BLOCK = "return typeof $ != 'undefined' && typeof $.blockSelenium != 'undefined' && $.blockSelenium==true;";
public static void waitForJQuery(final WebDriver driver) {
new FluentWait<WebDriver>(driver).withTimeout(TIME_OUT_SECONDS, TimeUnit.SECONDS).pollingEvery(POLLING_MILLISECONDS, TimeUnit.MILLISECONDS).until(new Function<WebDriver, Boolean>() {
@Override
public Boolean apply(final WebDriver input) {
boolean ajax = false;
boolean jQueryDefined = executeBooleanJavascript(input, JS_JQUERY_DEFINED);
if (jQueryDefined) {
ajax |= executeBooleanJavascript(input, JS_JQUERY_ACTIVE);
}
boolean ready = executeBooleanJavascript(input, JS_DOC_READY);
boolean block = executeBooleanJavascript(input, JS_BLOCK);
ajax |= ready;
ajax |= block;
// continue if all ajax request are processed
return !ajax;
}
});
}
private static boolean executeBooleanJavascript(final WebDriver input, final String javascript) {
return (Boolean) ((JavascriptExecutor) input).executeScript(javascript);
}
public static int TIME\u OUT\u SECONDS=10;
公共静态整数轮询_毫秒=100;
公共静态最终字符串JS_JQUERY_DEFINED=“返回JQUERY的类型!='undefined';”;
公共静态最终字符串JS_JQUERY_ACTIVE=“return JQUERY.ACTIVE!=0;”;
公共静态最终字符串JS_DOC_READY=“return document.readyState!=‘complete’;”;
公共静态最终字符串JS_BLOCK=“返回类型为$!='undefined'&&typeof$.blockSelenium!='undefined'&&$.blockSelenium==true;”;
公共静态void waitForJQuery(最终WebDriver){
新建FluentWait(驱动程序)。withTimeout(超时秒,TimeUnit.SECONDS)。pollingEvery(轮询毫秒,TimeUnit.miconds)。直到(新函数(){
@凌驾
公共布尔应用(最终WebDriver输入){
布尔ajax=false;
布尔jquerydefine=executeboleanjavascript(输入,JS_JQUERY_定义);
如果(jQueryDefined){
ajax |=executeboleanjavascript(输入,JS_JQUERY_ACTIVE);
}
布尔就绪=executeboleanjavascript(输入,JS_DOC_就绪);
布尔块=executeBooleanJavascript(输入,JS_块);
ajax |=就绪;
ajax |=块;
//如果已处理所有ajax请求,则继续
返回!ajax;
}
});
}
私有静态布尔executeBooleanJavascript(最终WebDriver输入,最终字符串javascript){
返回(布尔值)((JavascriptExecutor)输入);
}
感谢您的建议,我正在考虑尝试这个选项,但对此并不确定。假设存在链接的ajax请求,在这种情况下,jQuery.active
可能会降到零,即使会有其他请求在进行?此外,它真的可以用于检查GET
image请求吗?我相信如果使用Ajax进行交互,那么该代码可以帮助您。这真的取决于你试图刮的网站。。。关于你的问题,据我所知,如果有一个活动的ajax调用,jQuery.active将不会为零。嗯,根据我的测试,如果我们为$添加服务员,它实际上没有什么区别。active==0
Selenium等待所有ajax在默认情况下完成。你确定吗?您在Selenium文档中看到了吗?据我所知,Selenium具有可配置的默认超时的隐式等待,但我不知道有关ajax交互的这种行为。链接会很棒!