七叶笔记 » golang编程 » 「从零学爬虫」采集GET请求和POST请求中的数据

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

l 采集场景

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

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

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

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

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

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

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

以下为post请求示例:

GET请求和POST请求最直观的区别就是:

GET把参数包含在URL中,POST通过 request body传递参数。

l 采集GET请求中的数据

【原理】

找到GET请求链接规律,然后用脚本拼写请求链接,打开请求获取请求中所需要的链接/数据。

【脚本讲解】

采集 微博 热搜某热搜数据页

1. 查找数据所在请求

2. 拼请求并打开请求

 var link=URL.urlname. Replace All("#","%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. GetText All(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);  

微博热搜完整教程:

【从零开始学 爬虫 】采集微博热搜数据

完整视频教程:

采集微博热搜数据视频教程

l 采集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="#34;;//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"); //打开数据表news
var 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="#34;;//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 前嗅简介

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

相关文章