Golddata如何採集需要登入/會話的網站資料?

takemefly發表於2019-04-05

概要

本文將介紹使用GoldData半自動登入功能,來採集需要登入網站的資料。GoldData半自動登入功能,就是指通過指令碼來執行登入,如果需要驗證碼或者其它內容需要人工輸入時,可以通過收發郵件來執行登入流程。

下載例子

為了講解方便,我們以採集mydict的單詞資料來講解採集需要登入的網站資料。這個mydict例子程式可以從開源網站下載到( github.com/TheGoldData… ,或 gitee.com/golddata/my… )。

下載之後,開啟命令列,執行下面的命令就可以啟動例子程式。

java -jar mydict.war
複製程式碼

啟動之後,開啟瀏覽器,輸入網址http://localhost:8080/開啟一個登入頁面。如下圖所示:

a mydict login example for golddata

輸入使用者名稱和密碼(都是admin),就可以開啟首頁單詞列表。

編寫登入和檢查會話指令碼

點選“採集管理》網站管理”,點選“新增”按扭,新增名為mydict的站點。如下所示:

golddata_site_add
golddata_site_add

接下來配製登入和檢查會話指令碼,點選“設定半自動登入”,會開啟站點半自動登入配製頁面,如下圖所示:

golddata_auto_login_conf
golddata_auto_login_conf

登入指令碼如下:

//傳送ajax請求驗證碼
var va=$ajax('http://localhost:8080/code/vcode?timestamp=1554001708730',{encoding:false});

var arg_={
label:site.name+"驗證碼",
type:1,
content:va.content
}
//waitForInput內建函式將傳送郵件,並等待輸入
//(回覆郵件,或者goldData平臺輸入),
//並把輸入內容當作驗證碼返回。
var code=waitForInput(arg_);

var data="username=admin&password=admin&vcode="+code

var m=new  Map()
m.put('Cookie',va.cookie)
//傳送ajax請求執行登入
var content=$ajax('http://localhost:8080/doLogin',{method:'POST',headers:m,data:data})

//如果正確,將返回狀態1(登入成功),和headers資訊給GoldData,
//否則返回0(登入失敗)!
if(content.headers){
m.putAll(content.headers)
}

var ret={status:1,headers:m}

if(content.status!=200){
    ret.status=0
}
ret
複製程式碼

檢查指令碼如下:

var ret=true;
if(html.contains("我的單詞-登入")){
ret=false
}
ret;
複製程式碼

配製好之後,我們回到網站管理頁面,點選“啟動登入”,則會開始執行“自動登入”,這之後,點選“查詢”按扭來重新整理頁面,可以看到“等待輸入”的狀態。如下圖所示:

golddata_wait_for_input
golddata_wait_for_input

此時,您設定的通知郵箱,也應該同時收到了郵件。點開郵件,或者點選頁面上的“錄入等待輸入”按扭,將會看到如下內容:

golddata_autologin_mailbox
golddata_autologin_mailbox

golddata_autologin_dialog
golddata_autologin_dialog

依據郵件內容,回覆郵件“{{qcxe}}”,就可以讓程式繼續執行。在golddata頁面裡輸入"qcxe",效果是一樣的。程式將會回到“waitForInput()”,並且返回輸入的內容。

回覆之後,我們將在golddata頁面裡,點選“查詢”重新整理頁面,mydict的登入狀態會變為“已登入”。如下圖所示:

golddata_has_login
golddata_has_login

接下來,我們可以定義抓取規則。

定義抓取規則

在新增規則之前,我們還需要定義類似於表結構的資料集。如下圖所示:

golddata_define_dataset
golddata_define_dataset

接下來,點選“採集管理》規則管理”,新增規則,開啟新增規則頁面,如下圖所示:

golddata_define_rule
golddata_define_rule

抓取規則指令碼如下:

[
  {
    __sample: http://localhost:8080/word/index?pageNum=2
    match0: http\:\/\/localhost\:8080\/word\/index(\?pageNum=\d+)?
    fields0:
    {
      __model: true
      __dataset: word
      __node: "#content  ul >li"
      sn:
      {
        expr: ""
        attr: ""
        js: md5(item.name)
        __label: ""
        __showOnList: false
        __type: ""
        down: "0"
        accessPathJs: ""
        uploadConf: s1
      }
      name:
      {
        expr: h5
        attr: ""
        js: ""
        __label: ""
        __showOnList: true
        __type: ""
        down: "0"
        accessPathJs: ""
        uploadConf: s1
      }
      uk:
      {
        expr: li span.uk
        attr: ""
        js: source.replace("uk: ",'')
        __label: ""
        __showOnList: false
        __type: ""
        down: "0"
        accessPathJs: ""
        uploadConf: s1
      }
      us:
      {
        expr: li span.us
        attr: ""
        js: source.replace("us: ",'')
        __label: ""
        __showOnList: false
        __type: ""
        down: "0"
        accessPathJs: ""
        uploadConf: s1
      }
    }
    fields1:
    {
      __node: .pagination a
      href:
      {
        expr: a
        attr: abs:href
        js: ""
        __label: ""
        __showOnList: false
        __type: ""
        down: "0"
        accessPathJs: ""
        uploadConf: s1
      }
    }
  }
]
複製程式碼

然後點選測試,將會進行測試抓取。我們發現資料的確被抓取到了,如下圖所示:

golddata_test_result
golddata_test_result

配製抓取器抓取

這和之前是一樣的,將抓取器設定抓取站點“mydict”.然後點選開始抓取。然後會在資料管理裡面檢視抓取的資料。

結論

GoldData半自動登入實質是提供了一個可以人工介入來非同步獲取會話的框架,既可以呼叫AI介面做到完全自動登入;也可以將類似於驗證碼需要複雜識別需要提供輸入時,直接將cookie或者token資訊通過郵件收發到GoldData平臺(這樣可以不管CAPTCHA多複雜 ),都可以讓GoldData抓取資料的動作持續進行下去。

相關文章