【问题标题】:How do I retrieve Youtube's autocomplete results using Jsoup (Java)?如何使用 Jsoup (Java) 检索 Youtube 的自动完成结果?
【发布时间】:2020-02-06 15:05:27
【问题描述】:

如图所示,我想使用 Jsoup 检索自动完成搜索结果。我已经在使用视频 ID 检索视频 URL、视频标题和缩略图,但我无法从搜索结果中检索它们。

我必须在不使用 Youtube 的 Data Api 并且仅使用 Jsoup 的情况下完成此操作。

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

【问题讨论】:

  • Youtube 使用 javascript(在您的浏览器中禁用 javascript 并检查网站) - jsoup 无法做到这一点。

标签: java web-scraping webview youtube jsoup


【解决方案1】:

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

YouTube 的自动完成搜索结果来自网络服务(由 Google 提供)。每次我们在搜索栏中添加一个字母时,都会在后台向该服务发出请求,并在页面上呈现响应。我们可以使用浏览器的开发者工具发现这些 API。例如,我通过以下过程找到了这个 API:

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

响应是一个 JavaScript sn-p,其中包含我们在数组中的数据,并且可以使用正则表达式对其进行解析。 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;
}

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

【讨论】:

  • 我有一个问题。我们可以使用您通过不同 URL 提供的这种方法获取所有内容吗?
  • 恐怕我听不懂。此功能专为 YouTube 自动填充结果而设计,不适用于任何其他 URL。如果您想为其他站点编写类似的函数,那么您将更改 URL 和解析部分 - 大多数 API 返回 JSON,因此您将使用 JsonObject。但请注意,并非总是有 API,大多数时候您必须使用 HTML 解析器。
  • 我遇到了一个真正的麻烦@t.m.adam。如果您查看this post 以提供任何解决方案,我将非常高兴。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 2012-07-01
  • 2012-11-12
  • 2016-01-21
相关资源
最近更新 更多