使用jsoup解析更新的html



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

对于一个大学项目,我们必须使用java中的jsoup。我们可以用它来解析Htmls。但问题是,我们必须解析一个当你点击按钮时会更新的html(https://www.bundestag.de/services/opendata)。

第一张幻灯片

第二张幻灯片

我们希望从";Wahlperiode 20〃;。但当你点击幻灯片按钮时,html代码会更新,但html url保持不变。但是您永远无法访问html中的所有xml,因为html正在通过幻灯片按钮进行更新。

另一个想法是找出我们想要访问的xml的url是如何构建的,这样我们就不必处理幻灯片按钮,只访问xml url。但它们都是不同的。

所以我们都很绝望。我希望你们能帮助我们:)

具有讽刺意味的是,您正试图从opendata网站中破解1的一些数据。肯定有API!!

问题是网站不是静态资源;他们有javascript,javascript可以获取更多的数据来响应,例如用户点击"下一页"按钮。

你正在做的事情被称为"抓取":使用自动化工具试图通过通信渠道(即:本网站)查询数据,而绝对不是这样做的。本网站不允许使用软件阅读。它是要用眼球来阅读的。例如,如果有人决定更改此页面的设计,而您确实有一个正在工作的scraper,那么它将在设计更新后失败。

大致来说,你有三种选择:

中止这个计划,这太疯狂了

这些数据肯定是开放的,开放数据往往带有API;要通过软件而不是眼球来查询的东西。去找它,打电话给德国政府,我相信他们会帮你的!如果他们真的接受了REST设计原则,那么发送一个包含application/jsonapplication/xml但不包含text/html的accept头,看看站点是否只是用JSON或XML格式的数据进行响应。

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

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

几乎每个浏览器都有"开发工具"。例如,在《维瓦尔第》中;工具;菜单,并被称为"菜单";开发者工具";。您通常也可以右键单击网页上的任何位置,然后会有"Inspect"、"Inspector"或"Development Tools"选项。现在打开它,找到"网络"选项卡。当你(重新)加载此页面时,你会看到所有加载的资源(图像、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编写的任何代码都是脆弱和复杂的,因为抓取站点是脆弱和复杂性的)。

然后,点击"加载新数据"按钮,检查是否会出现网络流量。事实的确如此,当你这样做的时候,你会注意到一个电话响了。事实就是这样!我看到这个URL正在加载:

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

格式相当明显。offset=10的意思是:从第10个元素开始(就像我刚刚点击"下一页"一样),limit=10的意思是不超过10页。

这个html也是非常基本的,这是个好消息,因为它很容易抓取。只需编写一个for循环,不断调用该URL,修改offset=10部分(第一个循环:无偏移。第二个循环:偏移=10,第三个循环:偏置=20。继续,直到您返回的HTML为空,然后您就获得了所有内容)。

供将来参考:浏览器模拟

Javascript还可以自己生成整个HTML;jsoup永远无法为您做的事情:获得这种HTML的唯一方法是让javascript来完成它的工作,这意味着您需要整个浏览器。像selenium这样的工具将启动一个真正的浏览器,但允许您使用类似JSoup的结构从页面中检索信息(而不是浏览器通常所做的,即将渲染的数据传输到您的眼球)。这往往总是有效的,但非常复杂且相当缓慢(你正在运行整个浏览器并真正渲染网站,即使你看不到它——这是在幕后发生的!)。

硒并不是一种刮擦工具;它是一个前端测试工具。但你可以用它来抓取东西,如果它生成了HTML,你就必须这样做。幸运的是,你在这里很幸运。

选项1远远优于选项2,选项2远远优于选项3,至少在这种情况下是这样。祝你好运

[1] 我使用的定义是:使用一个工具或网站来完成一些显然不是为之设计的事情。那种"我买了半个宜家橱柜和半个宜家书架,它们完全无关,无论如何都放在一起,看看这个东西有多棒"的感觉——那种"黑客"的感觉。不是"非法"的意思。

最新更新