Не удается очистить первую страницу поиска Google с помощью Jsoup с AsyncTask? - PullRequest
0 голосов
/ 01 октября 2019

Я использовал Jsoup для того, чтобы получить определенные слова из поиска Google, но это не в моем понимании в процессе запроса Jsoup.

Он успешно попадает в метод doInBackground, но не выводит заголовок и тело каждой ссылки в поиске.

Я предполагаю, что список, который я получаю из doc.select (ссылки), пуст. что приводит к проблеме синтаксиса запроса

значение - это поиск по ключевым словам, в моем случае, это штрих-код, который на самом деле работает. Вот ссылка

Вот асинхронный вызов из другого класса:

String url = "https://www.google.com/search?q=";

     if (!value.isEmpty())
     {
         url = url + value + " price" + "&num10";
         Scrape_Asynctasks task = new Scrape_Asynctasks();
         task.execute(url);
     }

, а вот сама асинхронная задача:

public class Scrape_Asynctasks extends AsyncTask<String, Integer, String>
{
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... strings) {
        try
        {
            Log.i("IN", "ASYNC");

            final Document doc = Jsoup
                .connect(strings[0])
                .userAgent("Jsoup client")
                .timeout(5000).get();

            Elements links = doc.select("li[class=g]");

            for (Element link : links)
            {
                Elements titles = link.select("h3[class=r]");
                String title = titles.text();

                Elements bodies = link.select("span[class=st]");
                String body = bodies.text();

                Log.i("Title: ", title + "\n");
                Log.i("Body: ", body);
            }
        }

        catch (IOException e)
        {
            Log.i("ERROR", "ASYNC");
        }
        return "finished";
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }
}

1 Ответ

2 голосов
/ 01 октября 2019
  1. Не используйте «Jsoup client» в качестве строки вашего пользовательского агента. Используйте ту же строку, что и ваш браузер, например. "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0". Некоторым сайтам (включая Google) это не нравится.
  2. Ваш первый селектор должен быть .g: Elements links = doc.select(".g");
  3. На сайтах используется javascript, поэтому вы не получите все результаты, так какВы получаете в своем браузере.
    Вы можете отключить JS в своем браузере и увидеть разницу.
...