Android web-scraping: подождите, пока скрипт полностью раздувает страницу / желаемый элемент обнаруживается - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть следующий код:

MainActivity:

public class MainActivity extends AppCompatActivity {

    private final Handler uiHandler = new Handler();
    private ArrayList<String> entries = new ArrayList<>();

    private class JSHtmlInterface {
        @android.webkit.JavascriptInterface
        public void showHTML(String html) {
            final String htmlContent = html;

            uiHandler.post(
                    new Runnable() {
                        @Override
                        public void run() {
                            Document doc = Jsoup.parse(htmlContent);
                            Elements elements = doc.select("div.app > div.app__explosion-wrap > div.explosion > div > div.app > div.app__inner > div.app__content > div > div.list");
                            entries.clear();
                        }
                    }
            );
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        try {
            final WebView browser = new WebView(this);
            browser.setVisibility(View.INVISIBLE);
            browser.setLayerType(View.LAYER_TYPE_NONE,null);
            browser.getSettings().setJavaScriptEnabled(true);
            browser.getSettings().setBlockNetworkImage(true);
            browser.getSettings().setDomStorageEnabled(false);
            browser.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
            browser.getSettings().setLoadsImagesAutomatically(false);
            browser.getSettings().setGeolocationEnabled(false);
            browser.getSettings().setSupportZoom(false);

            browser.addJavascriptInterface(new JSHtmlInterface(), "JSBridge");

            browser.setWebViewClient(
                    new WebViewClient() {

                        @Override
                        public void onPageStarted(WebView view, String url, Bitmap favicon) {
                            super.onPageStarted(view, url, favicon);
                        }

                        @Override
                        public void onPageFinished(WebView view, String url) {
                            browser.loadUrl("javascript:window.JSBridge.showHTML('<html>'+document.getElementsByTagName('html')[0].innerHTML+'</html>');");
                        }


                    }
            );

            browser.loadUrl("https://www.myurl/search/123");
            if(getSupportActionBar()!=null) getSupportActionBar().setTitle(browser.getUrl());

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

Проблема в том, что после загрузки страницы все еще изменяются элементы, и от линии doc.select("div.app > div.app__explosion-wrap > div.explosion > div > div.app > div.app__inner > div.app__content > div > div.list") У меня только все до div.app__content. Это потому, что после выполнения JavaScript на странице div.app__content не существует. Вопрос: как ждать полной загрузки? Может быть div.class=loader с двумя состояниями (готово / запущено) на странице может как-то помочь?

Обновление: Получили результат с помощью следующего кода:

browser.setWebChromeClient(new WebChromeClient() {
            @Override
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                String s = consoleMessage.message();
                if (consoleMessage.message().equals("inflate finished")) {
                    // do something
                }
                return super.onConsoleMessage(consoleMessage);
            }
        });

Где "inflate finished" - это консольное сообщение, напечатанное после полного заполнения страницы JS. Тем не менее, это обходной путь, который, вероятно, не является оптимальным. Все еще жду хорошего ответа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...