gpt4 book ai didi

java - HtmlUnit:以特定语言从服务器请求网站

转载 作者:行者123 更新时间:2023-11-30 08:29:29 24 4
gpt4 key购买 nike

我正在 HtmlUnit 中寻找一种干净/简单的方法来以特定语言从服务器请求网页。

为此,我一直在尝试为他们的主页请求“bankofamerica.com”,而不是英语。

这是我到目前为止所做的:

我试图在 Http 请求中将“Accept-Language” header 设置为“es”。我这样做使用:

myWebClient.addRequestHeader("Accept-Language" , "es");

它没有用。然后我使用以下代码创建了一个网络请求:

URL myUrl = new URL("https://www.bankofamerica.com/");
WebRequest myRequest = new WebRequest(myUrl);
myRequest.setAdditionalHeader("Accept-Language", "es");
HtmlPage aPage = myWebClient.getPage(myRequest);

因为这也失败了,所以我打印了这个 url 的请求对象,以检查是否设置了这些 header 。

[<url="https://www.bankofamerica.com/", GET, EncodingType[name=application/x-www-form-urlencoded], [], {Accept-Language=es, Accept-Encoding=gzip, deflate, Accept=*/*}, null>]

所以服务器被请求一个西类牙语页面,但作为响应它发送英文主页(响应 header 的 Content-Language 值设置为 en-US)

我确实找到了一个用西类牙语检索 BOA 页面的技巧。我访问了此页面并使用 chrome 开发人员工具从请求中获取 cookie 值 header 。我使用此值执行以下操作:

 myRequest.setAdditionalHeader("Cookie", "TLTSID= ........._LOCALE_COOKIE=es-US; CONTEXT=es_US; INTL_LANG=es_US; LANG_COOKIE=es_US; hp_pf_anon=anon=((ct=+||st=+||fn=+||zc=+||lang=es_US));..........1870903; throttle_value=43");

我猜答案就在这里。

这是我的下一个问题。如果我正在编写一个脚本来检索 100 个不同的西类牙语网站(即假设它们都有西类牙语的页面)。 HtmlUnit 中是否有一种干净的方法来完成此任务。

(如果 cookie 确实是一种解决方案,那么要在 htmlunit 中创建它们,您需要指定域名。然后必须为 100 个站点中的每一个创建 cookie。据我所知,在 HtmlUnit 中没有办法做类似的事情:

Cookie langCookie = new Cookie("所有域","LANG_COOKIE","es_US");myWebClient.getCookieManager().addCookie(langCookie);)

注意:我正在使用 HtmlUnit 2.12 并在网络客户端中设置 BrowserVersion.CHROME

谢谢。

最佳答案

关于您的第一个问题,如您所说,以特定语言请求网页的清晰/简单(/仅?)方式是将 HTTP Accept-Language 请求 header 设置为语言环境(s) 你想要的。就是这样。

现在,您请求特定语言的页面并不意味着您实际上会获得该语言的页面。服务器必须设置为处理该 HTTP header 并做出相应响应。即使网站的整个部分都是西类牙语,也不意味着该网站正在响应 HTTP header 。

一个明显的例子就是您提供的页面。我对其进行了快速测试,发现它显然没有响应我设置的 Accept-Language(即 es)。使用 es 点击主页会得到英文结果。但是,该页面有一个链接,说明 En Español 这意味着 In Spanish 页面确实切换到西类牙语,您将被重定向到 https://www.bankofamerica .com?request_locale=es_US

因此您可能会认为页面通过请求参数处理语言环境。然而,情况并非(仅)如此。因为如果您随后再次打开主页(没有区域设置参数),您将再次看到西类牙语版本。这显然证明它们存储在其他地方,很可能在 session 中,这很可能由 cookie 处理。

这可以通过打开私有(private) session 或清除 cookie 并确认此行为(我刚刚这样做)来轻松确认。

我认为这解释了以西类牙语存在的网页却以英语获取的神秘之处。 (请注意,大多数银行网页如何不符合基本标准,例如响应简单的 HTTP 请求……而他们正在处理我们的钱!)

关于你的第二个问题,这就像问永远不生病的秘诀是什么?。它只是不取决于你。另请注意,您的第一个问题使用的是请求,而您的第二个问题使用的是检索。我想现在应该很清楚了,您只能 100% 确定您请求的内容,而不是您检索的内容。

关于手动设置 cookie 中的值,这在技术上是可行的。但是,这就像在 get 请求中添加另一个参数:http://domain.com?login=yes。该参数只有在服务器需要时才会被服务器处理。否则,它将被忽略。这就是您的 cookie 中的值会发生的情况。

总结:有标准可循。您可以尝试使用它们,但如果另一侧没有使用它们,那么您将无法获得预期的结果。您最好的选择:尽力而为并遵循标准。

关于java - HtmlUnit:以特定语言从服务器请求网站,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19413917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com