Как сделать переход на сайт с поисковой страницы браузера?

у меня возникла проблема с реализацией перехода на сайт с поисковой страницы браузера в Android studio. Подробнее: имеется браузер, в котором осуществляется поиск по запросам, например "Авто". Каким образом можно осуществить переход на первый сайт, выданный по запросу на странице поиска именно с самой страницы поиска. Именно так, чтобы можно было зафиксировать, что на этот сайт перешли со страницы поиска yandex.ru, например. Язык: Java. Буду рад любой помощи. Огромное вам спасибо


Ответы (2 шт):

Автор решения: nogard

Как я бы попробовал это реализовать навскидку, при условии, что надо именно дать пользователю возможность открывать поисковик в моём приложении и вручную вбивать запрос:

  1. Получать адрес страницы запроса пользователя webView.getUrl()
  2. Парсером, например, Jsoup получал бы исходный код страницы
  3. Парсером же извлекал бы адрес первого сайта в результате поиска
  4. Загружал страницу в webview через public void loadUrl (String url, Map additionalHttpHeaders), где в additionalHttpHeaders уже вкладываются необходимые данные о user-agent или, в вашем случае, о "referrer" -> "http://www.yandex.ru"

Способ немного костыльный, но навскидку ничего проще не придумал. Пункты 2 и 3 сам сейчас в одном проекте использую - парсю первый результат в картинках из разных поисковиков. У яндекса, к сожалению, там есть блокировка, которая со временем срабатывает, если часто такое проворачивать на одном устройстве. Но поскольку вы открываете страницу в WebView то эта блокировка будет сниматься вводом капчи пользователя там же, если вдруг возникнет. Либо использовать API яндекса, оно у них вроде тоже есть, но я заморачиваться не стал. У гугла оно вообще платное.

→ Ссылка
Автор решения: Вася Воронцов

С помощью ответов на этот, этот, этот и этот вопросы, а также с помощью просмотра разметки страницы результата поиска yandex.ru я, надеюсь, смог решить вопрос довольно просто.

  1. Основной класс деятельности
String request = "zapros";
/*Строка, содержащая запрос*/
WebView web = (WebView) findViewById(R.id.web);
web.setWebViewClient(new MyWebViewClient());
web.getSettings().setJavaScriptEnabled(true);
web.loadUrl("https://yandex.ru/search/touch/?text=" + request);

  1. MyWebViewClient
import android.net.http.SslError;
import android.webkit.SslErrorHandler;
import android.webkit.WebView;
import android.webkit.WebViewClient;

public class MyWebViewClient extends WebViewClient {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    };

    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        handler.proceed();
    };
    @Override
    public void onPageFinished(WebView view, String url) {
        String javascript = "var elems = document.body.getElementsByTagName('*');" +
                            "var num = elems.length;" +
                            "for (var i = 0; i < num; i++) {" +
                                "var name = String(elems[i].className);" +
                                "if (typeof name !== 'undefined' && name.includes('link link_theme_normal organic__url') && name.includes('i-bem')) {" +
                                    "document.location.href = elems[i].getAttribute('href');" +
                                    "break;" +
                                "}" +
                            "}";
        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.KITKAT) {
            view.evaluateJavascript(javascript, null);
        } else {
            view.loadUrl("javascript:(function(){" + javascript + "})()");
        };
    };
}

"link link_theme_normal organic__url" - класс первой ссылки, но иногда открывались "Коллекции", что и было решено добавлением проверки на содержание "i-bem".

Способ, я считаю, несложный, не надо ничего самому искать, находить, извлекать. Из вопроса неясно, нужно ли отображение результата поиска, поэтому если нужно до поры до времени скрыть их, то можно сделать размеры самого WebView нулевыми (предлагаю, в таком случае запрос будет введён через какой-нибудь EditText).

По моему мнению, здесь говорится, что такой способ укажет верный document.referrer, а следовательно, можно будет зафиксировать, что на этот сайт перешли со страницы поиска.

→ Ссылка