2

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

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

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

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

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

它不起作用。然后,我使用以下代码创建了一个 Web 请求:

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

由于这也失败了,我打印了这个 url 的请求对象,以检查是否正在设置这些标头。

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

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

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

 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 并在 webclient 中设置 BrowserVersion.CHROME

谢谢。

4

1 回答 1

3

关于您的第一个问题,以特定语言请求网页的清晰/简单(/仅?)方式是,正如您所说,将 HTTPAccept-Language请求标头设置为您想要的语言环境。这就对了。

现在,您请求特定语言的页面这一事实并不意味着您实际上会获得该语言的页面。必须设置服务器以处理该 HTTP 标头并做出相应的响应。即使一个站点有一整个部分都是西班牙语,但这并不意味着该站点正在响应 HTTP 标头。

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

因此,您可能会认为页面通过请求参数处理语言环境。但是,情况并非(仅)如此。因为如果您随后再次打开主页(不带 locale 参数),您将再次看到西班牙语版本。这显然是它们被存储在其他地方的证据,很可能是在会话中,这很可能由 cookie 处理。

这可以通过打开私人会话或清除 cookie 并确认此行为来轻松确认(我刚刚做过)。

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

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

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

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

于 2013-10-18T03:41:14.737 回答