2013-10-16 49 views
2

我正在尋找一種乾淨/簡單的方式在HtmlUnit中以特定語言從服務器請求網頁。HtmlUnit:從特定語言的服務器請求網站

要做到這一點,我一直在試圖申請「bankofamerica.com」的西班牙語而不是英文的主頁。

這是我迄今所做的:

我試圖設置「接受語言」在HTTP請求頭「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>] 

所以被請求的服務器是爲西班牙頁面,但在響應其發送的英文網頁(響應報頭包含內容語言設置爲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中是否有一個乾淨的方式來完成這個任務。

(如果cookies確實是一個解決方案,然後在htmlunit中創建它們,您需要指定域名,然後必須爲100個站點中的每個站點創建cookie,據我所知沒有辦法要的HtmlUnit做這樣的事情:

曲奇langCookie =新的Cookie( 「全域」, 「LANG_COOKIE」, 「es_US」); myWebClient.getCookieManager()的addCookie(langCookie);)

注意:我使用HtmlUnit 2.12並在webclient中設置BrowserVersion.CHROME

謝謝。

回答

3

關於你提到的第一個備受關注的清/ SIMPLE(/只?)在特定的語言請求網頁的方式是,如你所說,在HTTP Accept-Language請求頭設置爲你想要的區域(一個或多個)。這就對了。

現在,您以特定語言請求頁面的事實並不意味着您將實際獲得該語言的頁面。服務器必須設置爲處理該HTTP標頭並作出相應的響應。即使一個網站有西班牙文的整個部分,但並不意味着該網站正在響應HTTP標頭。

一個明顯的例子就是您提供的頁面。我對它進行了快速測試,發現它明顯不響應我設置的Accept-Language(這是es)。使用es擊中主頁導致英文結果。但是,該頁面有一個鏈接,指出En Español這意味着In Spanish頁面切換爲西班牙語,並且您將重定向到https://www.bankofamerica.com?request_locale=es_US

因此,您可能會想,該頁面通過請求參數來處理區域設置。但是,這不是(僅)的情況。因爲如果您再次打開主頁(沒有區域設置參數),您將再次看到西班牙語版本。這顯然證明了他們被存儲在其他地方,很可能在會話中,這很可能由cookie來處理。

這可以通過打開私人會話或清除cookie並確認此行爲(我剛剛完成)輕鬆確定。

我認爲這解釋了西班牙語存在的網頁的奧祕,但被英文讀取。 (請注意,大多數銀行網頁不符合基本標準,例如響應簡單的HTTP請求......並且他們正在處理我們的資金!)

關於第二個問題,它會問如10什麼是配方沒有生病過?。它只是不依賴於你。還請注意,您的第一個使用單詞請求而您的第二個關注使用單詞檢索。我認爲現在應該清楚,你只能100%確定你所要求的,而不是你所檢索的東西。

關於手動設置cookie中的值,這在技術上是可行的。但是,這就像在獲取請求中添加另一個參數:http://domain.com?login=yes。只有服務器期待它才能處理該參數。否則,它將被忽略。這就是你的cookie中的價值會發生什麼。

摘要:有標準要遵循。你可以嘗試使用它們,但是如果另一方不這樣做,那麼你不會得到你期望的結果。你最好的選擇:盡你所能並遵循標準。