前嗅网络发表于2022年1月19日11:56最后回复于2022年1月19日11:56

【从零学爬虫】采集GET请求和POST请求中的数据

439浏览量

0评论

 l 采集场景

在使用ForeSpider集数据时,我们有时会遇到使用定位过滤、地址过滤、定位取值等采集不出来的情况这种情况一般是由于数据在其他的请求中导致的。


网站请求一般分为两种,分别是GET请求和POST请求,本教程将分别介绍两种请求的配置采集方法。在开始配置之前需要先掌握,如何精准找到数据所在的请求,并判断请求类型。


我们以东方财富网页面中图表数据为例进行演示。

1. 打开需要采集页面,点击F12,打开Network界面,然后刷新网页,发现多了很多请求。

 

图片


2. 需要采集表格中的数据,复制任意一个数据值,在搜索框进行搜索,就会把数据所在的请求筛选出来。

 

图片


3. 双击链接即可找到对应请求返回的内容,可查看是否包含所有表格中的数据。

 

图片


4.打开该请求的请求头,观察是哪种请求,如下图所示,表示该数据在get请求中。

 

图片

 

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;//定义一个请求头    
 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 前嗅简介

前嗅大数据,国内领先的研发型大数据专家,多年来致力于为大数据技术的研究与开发,自主研发了一整套从数据采集、分析、处理、管理到应用、营销的大数据产品。前嗅致力于打造国内第一家深度大数据平台!


私信

举报