使用 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/json
和 application/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'.
的感觉
我们有问题(我们是一个团队)。
我们必须在 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/json
和 application/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'.
的感觉