如何使用Jsoup(Java)检索Youtube的自动完成结果?

raj*_*dia 4 java youtube webview web-scraping jsoup

YouTube自动完成

如此图所示,我想使用Jsoup检索自动完成的搜索结果。我已经在使用视频ID检索视频URL,视频标题和缩略图,但是我一直坚持从搜索结果中删除它们。

我必须不使用Youtube的Data Api而仅使用Jsoup来完成此操作。

任何可以指出正确方向的建议将不胜感激。

t.m*_*dam 7

搜索结果是通过JavaScript动态生成的。这意味着Jsoup无法解析它们,因为Jsoup仅“看到”嵌入在页面中的静态代码。但是,我们可以直接从API获取结果。

YouTube的自动完成搜索结果是通过网络服务(由Google提供)获得的。每当我们在搜索栏中在后台添加一个字母时,就会对该服务进行请求,并在页面上呈现响应。我们可以使用浏览器的开发人员工具发现此类API。例如,我通过以下过程找到了该API:

  • 在浏览器中打开YouTube。
  • 打开开发者控制台。(Ctrl + Shift + I)。
  • 转到Network标签。在这里,我们可以找到有关浏览器与Web服务器连接的详细信息。
  • 在YouTube的搜索栏中添加字母。此时,我们可以看到对的新GET请求https://clients1.google.com/complete/search
  • 单击该请求,然后转到右侧的框,我们可以在其中更仔细地检查请求响应。在Headers标签中,我们看到该URL包含我们的搜索查询;在Response选项卡中,响应正文包含自动完成结果。

响应是一个JavaScript代码段,其中将我们的数据包含在一个数组中,并且可以使用正则表达式进行解析。Jsoup可以用于HTTP请求,但是任何HTTP客户端都可以。

public static ArrayList<String> autocompleteResults(String query) 
        throws IOException, UnsupportedEncodingException, PatternSyntaxException {
    String url = "https://clients1.google.com/complete/search?client=youtube&hl=en&gs_rn=64&gs_ri=youtube&ds=yt&cp=10&gs_id=b2&q=";
    String re = "\\[\"(.*?)\",";

    Response resp = Jsoup.connect(url + URLEncoder.encode(query, "UTF-8")).execute();
    Matcher match = Pattern.compile(re, Pattern.DOTALL).matcher(resp.body());

    ArrayList<String> data = new ArrayList<String>();
    while (match.find()) {
        data.add(match.group(1));
    }
    return data;
}
Run Code Online (Sandbox Code Playgroud)

提供的代码是在VScode,Java8,Windows上创建和测试的,但它也应在Android Studio上运行。