Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Selenium PhantomJS等待图像可用_Python_Selenium_Web Crawler_Phantomjs_Wait - Fatal编程技术网

Python Selenium PhantomJS等待图像可用

Python Selenium PhantomJS等待图像可用,python,selenium,web-crawler,phantomjs,wait,Python,Selenium,Web Crawler,Phantomjs,Wait,我正在编写一个基于SeleniumPhantomJS的通用蜘蛛来访问和抓取网页。 程序的输入包括需要爬网的模板(css选择器),输出应根据模板生成数据。 如果我们试图从web站点抓取图像,有时可能会得到空图像(如果执行时的页面源不包括图像,就是这种情况),这可以通过 然而,当网页为图像提供占位符时,会出现更具挑战性的问题,这些占位符随后会通过ajax请求被真实图像URL替换 问题是,如何确保selenium只在图像的真实URL包含到页面中后才对其进行爬网。我想检查图像的src属性是否有变化,只有

我正在编写一个基于SeleniumPhantomJS的通用蜘蛛来访问和抓取网页。 程序的输入包括需要爬网的模板(css选择器),输出应根据模板生成数据。 如果我们试图从web站点抓取图像,有时可能会得到空图像(如果执行时的页面源不包括图像,就是这种情况),这可以通过 然而,当网页为图像提供占位符时,会出现更具挑战性的问题,这些占位符随后会通过
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交互的这种行为。链接会很棒!