使用 jsoup 解析更新 html

Parsing an updating html using jsoup

我们有问题(我们是一个团队)。

我们必须在 java 中使用 jsoup 进行大学项目。我们可以用它来解析 Html。但问题是我们必须解析一个 html,它会在您单击按钮 (https://www.bundestag.de/services/opendata) 时更新。

First Slide

Second Slide

我们想访问“Wahlperiode 20”中的所有 xml。但是,当您单击滑动按钮时,html 代码会更新,但 html url 保持不变。但是您永远无法访问 html 中的所有 xml,因为 html 正在通过滑动按钮进行更新。

另一个想法是找出我们想要访问的 xml 的 url 是如何构建的,这样我们就不必处​​理滑动按钮而只访问 xml url秒。但是它们的构造都不一样。

所以我们都很绝望如何继续下去。希望大家能帮帮我们:)

相当讽刺的是,您正试图从一个开放数据网站中破解1一些数据。肯定有一个API!!

问题是网站不是静态资源;他们有 javascript,并且 javascript 可以获取更多数据以响应例如用户单击 'next page' 按钮。

您正在做的事情叫做 'scraping':使用自动化工具尝试通过通信渠道(即:本网站)查询数据,绝对不是为了那个。本网站不适合使用软件阅读。它应该用眼球来阅读。例如,如果有人决定更改此页面的设计并且您确实有一个可用的抓取工具,那么它会在设计更新后失败。

概括地说,您有 3 个选择:

放弃这个计划,这太疯狂了

这个数据肯定是公开的,而且公开的数据往往都带有API;应该通过软件而不是眼球查询的东西。去寻找它,然后打电话给德国政府,我相信他们会帮助你的!如果他们真的接受了 REST 设计原则,那么发送一个包含例如application/jsonapplication/xml 并且不包括 text/html 并查看该站点是否仅以 JSON 或 XML 格式响应数据。

强烈建议您在继续下一个选项之前完全用尽这些选项,因为下一个选项真的很糟糕:大量工作和代码将非常脆弱(联邦议院网站的任何更新都会破坏它)。

使用浏览器的网络检查工具

几乎每个浏览器都有 'dev tools'。例如,在 Vivaldi 中,它位于“工具”菜单下,称为“开发人员工具”。您通常也可以右键单击网页上的任意位置,然后会有 'Inspect'、'Inspector' 或 'Development Tools' 的选项。现在打开它,找到 'network' 选项卡。当您(重新)加载此页面时,您会看到 所有 加载的资源(因此,图像,HTML 本身,CSS,作品).浏览它,找到有趣的东西。在这种特定情况下,wahlperioden.json 的加载特别令人感兴趣。

让我们试试这个:

curl 'https://www.bundestag.de/static/appdata/filter/wahlperioden.json'

[{"value":"20","label":"WP 20: seit 2021"},{"value":"19","label":"WP 19: 2017 - 2021"},(rest omitted - there are a lot of these)]

这听起来很有用,因为它 JSON 您可以使用 json 解析器阅读这些内容。无需使用 JSoup(JSoup 是一个很棒的库,但它是一个当所有其他选项都失败时可以使用的库,并且使用 JSoup 编写的任何代码都是脆弱和复杂的,仅仅是因为抓取网站是脆弱和复杂的)。

然后,点击'load new data'的按钮,检查网络流量是否随之而来。确实如此,当您这样做时,您会注意到有一个电话打出去了。就是这样!我看到这个 URL 正在加载:

https://www.bundestag.de/ajax/filterlist/de/services/opendata/866354-866354?limit=10&noFilterSet=true&offset=10

格式比较明显。 offset=10 表示:从第 10 个元素开始(因为我刚刚单击 'next page')并且 limit=10 表示:不超过 10 页。

这个 html 也是 非常基础的 这是个好消息,因为它很容易被抓取。只写一个for循环,不断调用这个URL,修改offset=10部分(第一个循环:没有偏移量。第二个,偏移量=10,第三个:偏移量=20。继续直到HTML 你回来是空白,然后你就明白了)。

供将来参考:浏览器仿真

Javascript 也可以自己生成整个 HTML; jsoup 永远无法为你做的事情:获得这样的 HTML 的唯一方法是让 javascript 完成它的工作,这意味着你需要 整个浏览器 . selenium 之类的工具将启动一个真正的浏览器,但允许您使用 JSoup-like 构造从页面检索信息(而不是浏览器通常所做的,即将呈现的数据传输到您的眼球)。这往往总能奏效,但是令人难以置信复杂且相当慢(你是运行一个完整的浏览器并真正呈现网站,即使你看不到它 -那是在引擎盖下发生的!)。

Selenium 并不是一种抓取工具;它的意思是 front-end 测试工具。但是你可以用它来抓取东西,如果它生成 HTML 就必须这样做。幸运的是,你在这里很幸运。

选项 1 大大 优于选项 2,选项 2 大大 优于选项 3,至少在这种情况下如此。祝你好运!

[1] 我使用的定义是:使用工具或网站来完成显然不是为之设计的事情。 'I bought half an ikea cupboard and half of an ikea bookshelf that are completely unrelated, and put them together anyway, look at how awesome this thingie is' 的意义——'hack' 的意义。不是'illegal'.

的感觉