簡體   English   中英

Jsoup登錄抓取游戲數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM