[英]Jsoup login to scrape game data
問題是我可以使用 Jsoup 發布由 javascript 控制的登錄數據嗎? 這是目前為止的信息
該網站的登錄網址:
http://www.cybernations.net/login.asp
(他們確實有禁止機器人的政策,但我給管理員發了電子郵件,並有權自動登錄以下載游戲數據文件)
存儲文件的 URL
http://www.cybernations.net/stats_downloads.asp
我使用 Jsoup 解析登錄頁面的 html 以顯示腳本的代碼行...
Elements scriptTags = doc.getElementsByTag("script");
循環遍歷元素列表的輸出...
<!--
function FrontPage_Form1_Validator(theForm)
{
if (theForm.Username.value == "")
{
alert("Please enter a value for the \"Username\" field.");
theForm.Username.focus();
return (false);
}
if (theForm.Username.value.length > 40)
{
alert("Please enter at most 40 characters in the \"Username\" field.");
theForm.Username.focus();
return (false);
}
if (theForm.Validate_Password.value == "")
{
alert("Please enter a value for the \"Password\" field.");
theForm.Validate_Password.focus();
return (false);
}
if (theForm.Validate_Password.value.length < 1)
{
alert("Please enter at least 1 characters in the \"Password\" field.");
theForm.Validate_Password.focus();
return (false);
}
if (theForm.Validate_Password.value.length > 50)
{
alert("Please enter at most 50 characters in the \"Password\" field.");
theForm.Validate_Password.focus();
return (false);
}
return (true);
}
//-->
編輯 1:編輯連接代碼當前登錄代碼如下所示,返回登錄頁面。
Connection.Response loginForm = Jsoup.connect( loginURL )
.method(Connection.Method.GET)
.execute();
Document document = Jsoup.connect( loginURL )
.data("Login", "Login")
.data("Username", user )
.data("Validate_Password", pass )
.cookies(loginForm.cookies() )
.post();
我覺得我在這里遺漏了一些非常簡單的東西,我應該引導 connect() 方法跟隨重定向嗎?
編輯 2:感謝您的所有幫助,我想我將切換到 Apache 的 http 客戶端,因為它(希望)可以讓我更好地控制連接。 謝謝你們!
您發布的那個函數只是為了驗證輸入,您可以忽略它,因為服務器可能不允許不符合標准的用戶名和密碼。
如果你想像網頁一樣發送登錄信息,你只需要POST到“/login.asp”。 看看他們 HTML 中的表單:
<form action="/login.asp" method="POST" name="FrontPage_Form1" .....
您必須自己處理登錄。 您可能需要從響應頭中讀取 cookie 並在某處記住它們,然后將它們與您向服務器發出的每個后續請求一起發送回(就像 Web 瀏覽器那樣)。 看看this了解更多信息。
此外,您可能需要考慮如何處理驗證碼。 似乎他們的網站強制您在訪問該頁面兩次后傳遞驗證碼,這將阻止您的程序登錄。
您可以查看此答案以獲取有關如何自動登錄的更多信息。 要回答您關於保存 cookie 的問題,您將它們保存在哪里並不重要,只要您在向服務器發出其他請求時可以訪問它們即可。 我剛剛鏈接的那個答案有代碼來訪問您登錄時從服務器返回的 cookie(用您的變量修改):
Connection.Response res = Jsoup.connect("http://www.cybernations.net/login.asp")
.data("Username", "myUsername", "Validate_Password", "myPassword")
.method(Method.POST)
.execute();
Document doc = res.parse();
String sessionId = res.cookie("ASPSESSIONIDAAACSTQB");
同樣的答案向您展示了如何使用 jsoup 在后續請求中發送 cookie:
Document doc2 = Jsoup.connect("http://www.cybernations.net/stats_downloads.asp")
.cookie("ASPSESSIONIDAAACSTQB", sessionId)
.get();
現在,您需要確切地保存哪些cookie 是您需要弄清楚的。 嘗試使用 Google Chrome 中的開發人員選項。 登錄該站點,然后查看該站點用於存儲您的會話的 cookie 的名稱(有幾個)。 然后嘗試用上面的代碼模擬這一點。
我應該提一下,我還沒有為這個網站測試過這段代碼。 這需要時間和耐心,但這是工作的一部分。
表單 HTML 元素是最重要的。 您必須檢查什么是表單方法和參數名稱。
<form action="/login.asp" method="POST" name="FrontPage_Form1" onsubmit="return FrontPage_Form1_Validator(this)" language="JavaScript" >
...
<input value="" name="Username" id="Username" type="text" class="displayFieldIE" size="30" maxlength="40">
...
<input value="" name="Validate_Password" id="Validate_Password" type="password" class="displayFieldIE" size="30" maxlength="50">
...
</form>
因此,您必須使用參數 Username 和 Validate_Password 將數據發布到 login.asp。
您鏈接的 Javascript 用於驗證用戶輸入。 沒必要處理那個。
我認為你的方法沒有任何問題。 可能是該網站正在檢查來源。 嘗試將引用設置為
String loginURL = "http://www.cybernations.net/login.asp";
Connection.Response loginForm = Jsoup.connect(loginURL)
.method(Connection.Method.GET).execute();
Document document = Jsoup.connect(loginURL)
.data("Login", "Login")
.data("Username", user)
.data("Validate_Password", pass)
.header("Host", "www.cybernations.net")
.header("Origin", "http://www.cybernations.net")
.referrer(loginURL)
.cookies(loginForm.cookies())
.post();
第一次嘗試失敗后,該站點使用驗證碼。 所以一定要傳遞正確的憑據。 ;)
如果這不起作用,請嘗試通過apache http 客戶端連接並將響應傳遞給 jsoup 進行解析
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.