使用带有 AsyncTask 的 Jsoup 抓取 google 搜索第一页失败?

Scraping google search first page using Jsoup with AsyncTask fails?

我一直在使用 Jsoup 来从 google 搜索中获取某些词,但我无法理解 Jsoup 查询过程。

它已成功进入 doInBackground 方法,但它不会在搜索中打印每个 link 的标题和 body。

我猜我从 doc.select (links) 得到的列表是空的。 这带来了查询语法问题

value - 这是关键字搜索,在我的例子中,它是一个实际有效的条形码。这是 link

这是来自另一个 class:

的异步调用
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. 不要使用 "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 并查看差异。