【问题标题】:Parsing web javascript content to string using android使用android将Web javascript内容解析为字符串
【发布时间】:2020-11-03 19:36:38
【问题描述】:

我想把一个网站的内容读成一个字符串。

我开始使用jsoup,如下所示:

private void getWebsite() {
    new Thread(new Runnable() {
        @Override
        public void run() {
            final StringBuilder builder = new StringBuilder();

            try {

                String query = "https://merhav.nli.org.il/primo-explore/search?tab=default_tab&search_scope=Local&vid=NLI&lang=iw_IL&query=any,contains,הארי פוטר";

                Document doc = Jsoup.connect(query).get();
                String title = doc.title();
                Elements links = doc.select("div");

                builder.append(title).append("\n");

                for (Element link : links) {
                    builder.append("\n").append("Link : ").append(link.attr("href"))
                            .append("\n").append("Text : ").append(link.text());
                }
            } catch (IOException e) {
                builder.append("Error : ").append(e.getMessage()).append("\n");
            }

            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    tv_result.setText(builder.toString());

                }
            });
        }
    }).start();
}

但是,问题在于,在这个站点中,当我使用 chrome 等网络浏览器时,它会在其中一行中显示:

window.appPerformance.timeStamps['index.html']= Date.now();</script><primo-explore><noscript>JavaScript must be enabled to use the system</noscript><style>.init-message {

所以我读到jsoup 没有针对这种情况的好的解决方案。 有没有什么好的方法来获取这个页面的元素,即使它使用了javascript?

编辑:

尝试了下面的建议后,我使用webView加载了url,然后使用jsoap解析如下:

wb_result.getSettings().setJavaScriptEnabled(true);
MyJavaScriptInterface jInterface = new MyJavaScriptInterface();
wb_result.addJavascriptInterface(jInterface, "HtmlViewer");

wb_result.setWebViewClient(new WebViewClient() {
    @Override
    public void onPageFinished(WebView view, String url) {
        wb_result.loadUrl("javascript:window.HtmlViewer.showHTML ('<head>'+document.getElementsByTagName('html')[0].innerHTML+'</head>');");
    }
 });

它完成了工作,并且确实向我展示了元素。但是,与浏览器不同,它仍然将某些行显示为函数而不是结果。例如:

ng-href="{{::$ctrl.getDeepLinkPath()}}"

有没有办法像在浏览器中一样解析和显示结果?

谢谢

【问题讨论】:

  • 看起来没有直截了当的方式,但有this post
  • 我可以在这个网站上为您提供帮助。我喜欢翻译外国新闻网站...这个(点击翻译后)似乎是一个带有电子书的网站。我想先问一下你想做什么。此页面包含 Java-Script,通过static-page HTML Scrape 可能无法为您提供您在网络浏览器中看到的内容。 您需要做更多的事情.你想从这个网站得到什么?

标签: javascript java android jsoup


【解决方案1】:

我建议查看 chrome 开发人员工具中的网络选项卡,然后提交加载 URL 的请求……你会看到很多请求来回。

似乎包含相关内容的两个是:

https://merhav.nli.org.il/primo_library/libweb/webservices/rest/primo-explore/v1/pnxs?blendFacetsSeparately=false&getMore=0&inst=NNL&lang=iw_IL&limit=10&newspapersActive=false&newspapersSearch=false&offset=0&pcAvailability=true&q=any,contains,%D7%94%D7%90%D7%A8%D7%99+%D7%A4%D7%95%D7%98%D7%A8&qExclude=&qInclude=&refEntryActive=false&rtaLinks=true&scope=Local&skipDelivery=Y&sort=rank&tab=default_tab&vid=NLI

这需要一个令牌来访问令牌,它来自:

https://merhav.nli.org.il/primo_library/libweb/webservices/rest/v1/guestJwt/NNL?isGuest=true&lang=iw_IL&targetUrl=https%253A%252F%252Fmerhav.nli.org.il%252Fprimo-explore%252Fsearch%253Ftab%253Ddefault_tab%2526search_scope%253DLocal%2526vid%253DNLI%2526lang%253Diw_IL%2526query%253Dany%252Ccontains%252C%2525D7%252594%2525D7%252590%2525D7%2525A8%2525D7%252599%252520%2525D7%2525A4%2525D7%252595%2525D7%252598%2525D7%2525A8&viewId=NLI

.. 这可能需要来自的 JSessoinId:

https://merhav.nli.org.il/primo_library/libweb/webservices/rest/v1/configuration/NLI

.. 因此,为了复制调用链,您可以使用 JSoup 发出这些(以及任何其他相关的)HTTP GET 请求,提取相关的 HTTP 标头(通常:会话、引用者、接受和一些其他 cookie 值可能)

这不会是直截了当的,但您实际上是在来自网络请求之一的 JSON 响应之一中寻找页面上的 url:

一旦您知道要重新创建哪个请求,您只需备份请求列表并尝试重新创建它们。

这不是一件容易的事,并且需要大量时间来重新创建 - 我的建议是,如果您要尝试它,请忘记尝试解析 HTML,尝试重建/重新创建 3 个左右的 HTTP 请求链到后端获取相关的 JSON 并解析它。您通常可以挑选网站,但这是一项艰巨的工作

【讨论】:

  • 这就像一个哈利波特有声读物列表(希伯来语)......不过,这是一个相当不错的工作(顺便说一句)。
  • @Rob Evans,感谢 fo4 的详细答案。会试一试的。
  • 您能否解释一下,例如从您发布的图片中,您如何理解到令牌的第二个链接?就像您在哪里看到它需要令牌一样?
  • 您可以在其中看到“预览”选项卡,也可以看到“标题”选项卡。在标头中,您可以看到发送的请求标头和接收的响应标头。在这些标头中,您将看到发送到服务器的各种值以及返回的另一组值。这些帮助跟踪会话,并设置各种其他 HTTP/请求信息。大多数情况下,会在打开网站时设置会话 cookie(以跟踪用户的浏览会话)和各种其他详细信息,例如用于防止自动访问的引荐来源和令牌。如果您知道要寻找什么,这些很容易复制。一段时间以来,我一直在构建这样的服务。
  • 如果您跟踪对服务器的请求并返回响应,您将看到一个 Cookie: 标头集。最初,这些在标头响应中使用Set-Cookie 发送到浏览器。这些是浏览会话的一部分,用于验证浏览器是否正在尝试访问网站或机器人。如果您想以人类用户的身份出现,您通常需要复制请求中的标头、任何 Referer 集、cookie 集、会话 ID(如果已设置)、HTTP 方法类型。它都是 HTTP 协议的一部分,本质上是 WWW 的工作原理。
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多