当前位置: 首页 > 科技观察

如何使用Lightrun在生产环境中调试jsoup Java代码

时间:2023-03-15 08:23:23 科技观察

如何在生产环境中使用Lightrun调试jsoupJava代码人们经常使用服务器来解决,而调试和解决这些问题是非常困难的,至少目前是这样。使用现代浏览器构建的爬网网站比十年前更具挑战性。jsoup是一个方便的API,它通过DOM遍历、CSS选择器、类似JQuery的方法等使抓取网站变得简单。但这并非没有挑战,因为每个被抓取的API都可能是一颗定时炸弹。真实世界的HTML是脆弱的。由于它不是文档化的API,因此如有更改,恕不另行通知。当一个Java程序在抓取时失败,它可能会遇到更多的麻烦。在某些情况下,这是在本地复制和部署的简单问题。但在本地测试用例中,DOM树的一些细微变化可能更难观察到。在这些情况下,有必要在推送更新之前了解解析树中的问题。否则,可能会损坏开发的软件产品。什么是jsoup?在深入调试jsoup的细节之前,JavaHTML解析器回答了上述问题并讨论了jsoup背后的核心概念。jsoup网站将其定义为:jsoup是一个用于操作真实世界HTML的Java库。它提供了一个非常方便的API,用于使用HTML5DOM方法和CSS选择器获取URL以及提取和操作数据。jsoup实现了WHATWGHTML5规范,并将HTML解析为与现代浏览器相同的DOM。考虑到这一点,可以直接从同一个网站上取一个简单的例子:Java1Documentdoc=Jsoup.connect("https://en.wikipedia.org/").get();2log(doc.title());3元素newsHeadlines=doc.select("#mp-itnba");4for(Elementheadline:newsHeadlines){5log("%s\n\t%s",6headline.attr("title"),headline.absUrl("href"));7}此片段摘自维基百科标题。在上面的代码中,可以看到几个有趣的特性:与URL的连接实际上是无缝的——只需将字符串URL传递给连接方法。某些子元素有特殊情况。例如。Title公开为一个简单的方法,该方法返回一个字符串而无需从DOM树中进行选择。可以使用非常复杂的选择器语法来选择项目。简单的jsoup测试为了演示调试,创建了一个简单的演示。XML12org.jsoup3jsoup41.14.35可以使用以下Maven依赖项安装jsoup到任何Java程序中。Maven将无缝下载jsoupjar:Java1publicSetlistLinks(Stringurl,booleanincludeMedia)throwsIOException{2Documentdoc=Jsoup.connect(url).get();3Elementslinks=doc.select("a[href]");4Elementsimports=doc.select("link[href]");56Setresult=newTreeSet<>(String.CASE_INSENSITIVE_ORDER);7if(includeMedia){8Elementsmedia=doc.select("[src]");9for(Elementsrc:media){10result.add(src.absUrl("src"));11//result.add(src.attr("abs:src"));12}13}1415for(Elementlink:imports){16result.add(link.absUrl("abs:href"));17}1819for(Elementlink:links){20result.add(link.absUrl("abs:href"));21}2223returnresult;24}这段代码可以得到输入字符串的URL。也可以使用输入流,但这在解析相对URL时稍微复杂一些(无论如何都需要一个基本URL)。然后搜索具有src属性的链接和对象。最后,代码将它们全部添加到一个集合中,使条目保持有序和唯一。我们使用以下代码将其公开为Web服务:1@RestController2publicclassParseLinksWS{3privatefinalParseLinksparseLinks;45publicParseLinksWS(ParseLinksparseLinks){6this.parseLinks=parseLinks;7}89@GetMapping("/parseLinks")10publicSetlistLinks(@RequestParamStringurl,@RequestParam(required=false)BooleanincludeMedia)throwsIOException{11returnparseLinks.listLinks(url,includeMedia==null?true:includeMedia);12}13}一次运行应用程序,你可以用一个简单的curl命令来使用它:Java1curl-H"Content-Type:application/json""http://localhost:8080/parseLinks?url=https%3A%2F%2Flightrun.com"这个将打印出Lightrun主页中引用的URL列表。调试内容失败元素对象更改时典型的字符串抓取问题。例如,维基百科可以改变它的页面结构,上面的选择方法就会失败。在处理嵌套节点元素和文档间依赖关系时,这通常是一个微妙的失败。例如在Java对象层次结构中缺少DOM元素,这可能会触发select方法的失败。大多数开发人员通过记录大量数据来解决这个问题。出现此问题的原因有以下三个:日志很大-它们难以阅读且非常昂贵。违反隐私/GDPR-被抓取的网站可能包含特定用户的私人信息。初始爬网后,爬网站点可能会更改为包含私人信息。记录此私人信息可能会违反各种隐私法。如果您没有足够的日志并且无法在本地重现问题,那么您将陷入添加日志、构建、测试、部署、重现的迭代循环。Lightrun提供了一种更好的方法。只需直接在生产中跟踪特定故障、验证问题并为一个部署创建修复程序。注意:本文假定已安装Lightrun并了解其背后的基本概念。如果没有,您可以查看文档。在浏览器DOM中找到自己的方式如果您不知道从哪里开始,那么jsoupAPI是一个很好的起点。它可以带回用户代码。很酷的是,无论代码如何,它都能正常工作。通过深入研究API调用,可以找到快照的正确行/文件。在此处按ctrl(在Mac上按Meta-click)选择方法调用:Java1Elementslinks=doc.select("a[href]");这会将您带到Element类。在其中,按住ctrl键单击选择器“select”方法,您可以放一张条件快照以查看“a[href]”查询的每次执行:这可以显示执行查询的方法/行:这很有用用于缩小文档对象层次结构中的一般问题区域有很大帮助。有时拍摄快照可能还不够,可能需要日志。日志记录的优点是可以生成大量信息,但仅限于特定情况和按需生成。日志的价值在于它们可以以非常类似于单步执行代码的方式跟踪问题。在哪里放置快照对于日志来说是有问题的。我们知道查询已发送,但还没有返回值。使用日志可以轻松解决此问题。首先,添加一个包含以下文本的日志:“Executingquery{query}”然后,要找出返回了多少条目,只需转到调用者(我们知道这一点要感谢快照中的堆栈)并在那里添加以下内容日志:链接查询返回{links.size()}这会产生以下日志,让我们看到有147个a[href]链接。这样做的好处是额外的日志与场景中预先存在的日志交错:2022年2月2日上午11:25:27org.jsoup.select.SelectorselectINFO:LOGPOINT:Executingquerya[href]Feb02,202211:25:27AMcom.lightrun.demo.jsoupdemo.service.ParseLinkslistLinksINFO:LOGPOINT:Linksqueryreturned147Feb02,202211:25:27AMorg.jsoup.select.SelectorselectINFO:LOGPOINT:Executingquerylink[href]Feb02,202211:25:27AMorg.jsoup.select.SelectorselectINFO:LOGPOINT:Executingquery[src]避免安全和GDPR问题GDPR和安全问题可能是将用户信息泄露到日志中的问题。这可能是一个主要问题,而Lightrun可以帮助显着降低这种风险。Lightrun提供了两种可能的解决方案,可以在适用的情况下串联使用。(1)日志管道GDPR最大的问题是日志摄取。如果你把用户的隐私数据记录下来,然后传到云端,那么它会长期存在,之后很难找到和修复。Lightrun提供了将Lightrun的所有注入日志直接通过管道传输到IDE的能力。这样做的好处是可以消除可能正在使用日志的其他开发人员的干扰。它还可以跳过摄取(可选)。如果你只发送日志到一个插件,你需要选择管道模式为“插件”。(2)PII减少/黑名单个人身份信息(PII)是GDPR法规的核心,也是一个主要的安全风险。企业中的恶意开发人员可能希望使用Lightrun窃取用户信息。阻止列表可防止开发人员将操作放入特定文件中。验证个人身份信息(PII)可以减少从日志中隐藏符合特定模式(例如信用卡格式等)的信息的需要。这可以由管理员角色在LightrunWeb界面中定义。结论对于Java内容爬取,jsoup显然是领导者。使用jsoup进行开发远远超出了字符串操作,甚至在处理连接方面也是如此。除了获取文档对象之外,它还处理DOM元素和脚本所需的复杂方面。报废是一项有风险的业务。当一个网站发生轻微变化时,它可能会在眨眼之间崩溃。更糟糕的是,它可能会以无法在本地复制的奇怪方式影响某些用户。借助Lightrun,您可以直接在生产环境中调试此类故障并快速发布工作版本。原标题:DebuggingjsoupJavaCodeinProductionUsingLightrun,作者:ShaiAlmog