目錄
    采集GET請求和POST請求中的數據
    視頻教程:模板下載:
     l 采集場景

    在使用ForeSpider集數據時,我們有時會遇到使用定位過濾、地址過濾、定位取值等采集不出來的情況。這種情況一般是由于數據在其他的請求中導致的。


    網站請求一般分為兩種,分別是GET請求和POST請求,本教程將分別介紹兩種請求的配置采集方法。在開始配置之前需要先掌握,如何精準找到數據所在的請求,并判斷請求類型。


    我們以東方財富網頁面中圖表數據為例進行演示。

    1. 打開需要采集頁面,點擊F12,打開Network界面,然后刷新網頁,發現多了很多請求。

     



    2. 需要采集表格中的數據,復制任意一個數據值,在搜索框進行搜索,就會把數據所在的請求篩選出來。

     


    3. 雙擊鏈接即可找到對應請求返回的內容,可查看是否包含所有表格中的數據。

     


    4.打開該請求的請求頭,觀察是哪種請求,如下圖所示,表示該數據在get請求中。

     

     

    以下為post請求示例:

     


    GET請求和POST請求最直觀的區別就是:

    GET把參數包含在URL中,POST通過request body傳遞參數。

     

    采集GET請求中的數據

    【原理】

    找到GET請求鏈接規律,然后用腳本拼寫請求鏈接,打開請求獲取請求中所需要的鏈接/數據。


    【腳本講解】

    采集微博熱搜某熱搜數據頁


    1. 查找數據所在請求

     


    2. 拼請求并打開請求


    var link=URL.urlname.ReplaceAll("#","%23");//拼寫為請求網址
    var doc = EXTRACT.OpenDoc(CHANN,link,"",);//打開請求
    if(doc){
     
    }
    EXTRACT.CloseDoc(doc);//關閉請求,固定搭配




    3. 觀察請求內數據位置并用腳本提取出所需要的數據

     


    根據數據結構,用腳本抽取數據并返回,數據抽取全部腳本如下所示:


    var link=URL.urlname.ReplaceAll("#","%23");
    var doc = EXTRACT.OpenDoc(CHANN,link,"",);
    if(doc){
    var a=doc.GetDom();
    var b = a.FindClass("m-note");
    var c=b.next.child;
    while(c){
    var d=a.FindClass("card",div,c);
    record re;
    re.id = c.mid;
    re.pubname= a.GetTextAll(d.child.child.next.child.child.next.child);
    re.pubtime = a.GetTextAll(d.child.child.next.child.next.child);
    re.text = a.GetTextAll(d.child.child.next.child.next.next);
    re.transmit=a.GetTextAll(d.child.next.child.child.child);
    re.comment_=a.GetTextAll(d.child.next.child.child.next.child);
    re.click=a.GetTextAll(d.child.next.child.child.next.next.child.child);
    RESULT.AddRec(re,this.schemaid);
    c=c.next;
    }
    }
    EXTRACT.CloseDoc(doc);




    微博熱搜完整教程:

    【從零開始學爬蟲】采集微博熱搜數據

    完整視頻教程:

    采集微博熱搜數據視頻教程


    采集POST請求中的數據

    【原理】

    找到POST請求鏈接規律,然后用腳本拼寫請求鏈接及request body傳遞參數,打開請求獲取請求中所需要的鏈接/數據。


    【腳本講解】

    采集百度翻譯數據頁


    1.找到數據所在請求

    觀察數據請求鏈接方法同上,找到請求查看header,發現該請求為post請求。


    request head找到Cookie、refer,request body找到FormData,如下圖所示:



    觀察發現,不同的翻譯請求鏈接,cookie和refer不變,FormData中的query內容變化,而且query參數即為需要翻譯的英文文本。


    2.用腳本拼出這個post請求并打開請求

     


    腳本文本:


    var table = DATADB.Open("news"); //打開數據表
    newsvar recs = table.Query(""); //查詢條件為空
    for(k in recs each v)//調用每個數據
    {  record re;//定義一個返回值,返回數據固定搭配  
    var transid = v.id;//調用news中的id  
    var trans = v.content;//調用news中的content  
    var con=trans;//待翻譯的文字  
    var link="https://fanyi.baidu.com/transapi";//link為請求鏈接  var header;//定義一個請求頭  
    header.cookie = "";////定義請求頭的cookie,與網頁上的cookie一致  
    header.refer = "";//定義請求頭的refer,與網頁上的refer一致  
    var post="from=en&to=zh&query="+con+"&source=txt";//定義post,將FormData拼出來  
    var doc = EXTRACT.OpenDoc(CHANN,link,post,header);//打開post請求  
    if(doc){
     
      EXTRACT.CloseDoc(doc);//關閉請求,固定搭配  
    }
    }




    3.觀察數據所在位置,并用腳本提取數據

    打開這個請求的preview預覽界面,觀察翻譯后的數據位置,


    根據數據所在位置,編寫腳本提取數據并返回。



    腳本文本:


    var table = DATADB.Open("news"); //打開數據表
    newsvar recs = table.Query(""); //查詢條件為空
    for(k in recs each v)//調用每個數據
    {  record re;//定義一個返回值,返回數據固定搭配  
    var transid = v.id;//調用news中的id  
    var trans = v.content;//調用news中的content  
    var con=trans;//待翻譯的文字  
    var link="https://fanyi.baidu.com/transapi";//link為請求鏈接  
    var header;//定義一個請求頭  
    header.cookie = "";////定義請求頭的cookie,與網頁上的cookie一致  
    header.refer = "";//定義請求頭的refer,與網頁上的refer一致  
    var post="from=en&to=zh&query="+con+"&source=txt";//定義post,將FormData拼出來  
    var doc = EXTRACT.OpenDoc(CHANN,link,post,header);//打開post請求  
    if(doc){
    var str = doc.GetDom().GetSource().ToStr();//打開請求后,將獲取請求源碼并轉為字符串格式  
    JScript js;//定義一個js  var obj = js.RunJson(str);//跑一下js  var a="";//定義一個變量a   for(i=0;i<obj.data.length;i++){    
    var search=obj.data[i].dst;//取obj中的data中的第i個對象的dst值    
    var ttt=search.ReplaceAll("u","\\u");//將search文本中的u用\\u替換    
    ttt=ttt.ToStr();//轉為字符串    
    var trans_con=doc.GetDom().UnEscape(ttt);//unicode轉中文    
    a+=trans_con;//a為a+trans_con  
    }  
    re.id=transid;//返回id  
    re.trans_con=a;//返回翻譯后內容   RESULT.AddRec(re,this.schemaid);//返回一個數據
       EXTRACT.CloseDoc(doc);//關閉請求,固定搭配  
    }
    }




    百度翻譯完整教程:

    【從零學爬蟲】一文學會批量翻譯


    l知識點總結

    1.OpenDoc

    方法OpenDoc(item,addr_or_keyForm,postData="",header=0)

    說明用當前采集節點打開一個文檔(必須與CloseDoc成對使用)

    【參數說明】

    item:一個采集器的頻道節點[channel],頻道腳本用this,其它地方用CHANN

    addr_or_keyForm:打開地址或者class="vartypestd">keyForm對象

    postData:post數據(如果為Post)[keyForm對象時,postData參數忽略]

    header:寫入http協議頭數據[該參數為一個對象{refer:"指定refer地址",cookie:"cookie數據"},對象全部可用成員見下方]


    2.CloseDoc

    方法CloseDoc(doc)

    說明關閉打開的采集文檔

    參數說明doc表示打開的文檔


    3.OpenDoc方法的參數header對象的全部可用成員


     

    *本教程僅供教學使用,嚴禁用于商業用途!


    圖片

    ForeSpider免費版本下載地址


    l 前嗅簡介

    前嗅大數據,國內領先的研發型大數據專家,多年來致力于為大數據技術的研究與開發,自主研發了一整套從數據采集、分析、處理、管理到應用、營銷的大數據產品。前嗅致力于打造國內第一家深度大數據平臺!


    女人个人私人电话联系杭州的|热久久久久香蕉无品码|爱情岛亚洲永久自拍品质|国产丶欧美丶日本不卡