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