Golddata如何採集須要登陸/會話的數據?

概要

本文將介紹使用GoldData半自動登陸功能,來採集須要登陸網站的數據。GoldData半自動登陸功能,就是指經過腳原本執行登陸,若是須要驗證碼或者其它內容須要人工輸入時,能夠經過收發郵件來執行登陸流程。javascript

下載例子

爲了講解方便,咱們以採集mydict的單詞數據來說解採集須要登陸的網站數據。這個mydict例子程序能夠從開源網站下載到( https://github.com/TheGoldData/mydict/releases ,或 https://gitee.com/golddata/mydict/attach_files )。html

下載以後,打開命令行,運行下面的命令就能夠啓動例子程序。java

java -jar mydict.war

啓動以後,打開瀏覽器,輸入網址http://localhost:8080/打開一個登陸頁面。以下圖所示:node

a mydict login example for golddata

輸入用戶名和密碼(都是admin),就能夠打開首頁單詞列表。git

編寫登陸和檢查會話腳本

點擊「採集管理》網站管理」,點擊「添加」按扭,添加名爲mydict的站點。以下所示:github

golddata_site_add

接下來配製登陸和檢查會話腳本,點擊「設置半自動登陸」,會打開站點半自動登陸配製頁面,以下圖所示:ajax

golddata_auto_login_conf

登陸腳本以下:shell

//發送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

檢查腳本以下:json

var ret=true;
if(html.contains("個人單詞-登陸")){
ret=false
}
ret;

配製好以後,咱們回到網站管理頁面,點擊「啓動登陸」,則會開始執行「自動登陸」,這以後,點擊「查詢」按扭來刷新頁面,能夠看到「等待輸入」的狀態。以下圖所示:瀏覽器

golddata_wait_for_input

此時,您設置的通知郵箱,也應該同時收到了郵件。點開郵件,或者點擊頁面上的「錄入等待輸入」按扭,將會看到以下內容:
golddata_autologin_mailbox

golddata_autologin_dialog

依據郵件內容,回覆郵件「{{qcxe}}」,就可讓程序繼續執行。在golddata頁面裏輸入"qcxe",效果是同樣的。程序將會回到「waitForInput()」,而且返回輸入的內容。

回覆以後,咱們將在golddata頁面裏,點擊「查詢」刷新頁面,mydict的登陸狀態會變爲「已登陸」。以下圖所示:

golddata_has_login

接下來,咱們能夠定義抓取規則。

定義抓取規則

在添加規則以前,咱們還須要定義相似於表結構的數據集。以下圖所示:

golddata_define_dataset

接下來,點擊「採集管理》規則管理」,添加規則,打開添加規則頁面,以下圖所示:
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

配製抓取器抓取

這和以前是同樣的,將抓取器設置抓取站點「mydict」.而後點擊開始抓取。而後會在數據管理裏面查看抓取的數據。

結論

GoldData半自動登陸實質是提供了一個能夠人工介入來異步獲取會話的框架,既能夠調用AI接口作到徹底自動登陸;也能夠將相似於驗證碼須要複雜識別須要提供輸入時,直接將cookie或者token信息經過郵件收發到GoldData平臺(這樣能夠無論CAPTCHA多複雜 ),均可以讓GoldData抓取數據的動做持續進行下去。

相關文章
相關標籤/搜索