爬虫是一个自己写的爬取青果教务系统的爬虫,这是地址 青果教务系统爬虫 一直到登陆都完全正常,可是当向服务器发送请求获取成绩却只能获取半张图片,用浏览器完全正常,尝试了多个ua头,都没有什么效果,自己判断可能问题出在异步获取返回的信息上,因为使用浏览器获取这个图片也是一点点刷新出来的。 下面是获取成绩的函数代码
spider.prototype.getRealScore=function (year,term,cab) {
var option=qs.stringify({
sel_xn:year,
sel_xq:term,
SJ:"1",
btn_search:"¼ìË÷",
SelXNXQ:"2",
zfx_flag:"0",
zxf:"0"
});
option=iconv.encode(option,"gbk");
var req=http.request({
hostname:'bkjw.sxu.edu.cn',
port:'80',
path:'/xscj/Stu_MyScore_rpt.aspx',
method:'POST',
headers:{
'Accept':'image/webp,image/apng,image/*,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.8',
'Cache-Control':'no-cache',
'Content-Type':"application/x-www-form-urlencoded",
'Connection':'keep-alive',
'Cookie':`${this.theCookie}`,
'Host':'bkjw.sxu.edu.cn',
'Pragma':'no-cache',
'Referer':'http://bkjw.sxu.edu.cn/xscj/Stu_MyScore_rpt.aspx',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
}
},(res)=>{
//console.log(res);
var $=cheerio.load(res);
fs.writeFile("res.txt",res.body,(err)=>{
console.log(err);
})
});
req.on('err',(err)=>{
console.log(err);
});
req.write(option);
req.end();
return new Promise((resolve,reject)=>{
resolve();
})
};
以下是调用该函数的代码
spiderListener.on("getRealScore",function(){
spiderForSXU.getRealScore(2016,1)
.then(setTimeout(function() {
console.log("````````````````````````````````````````")
var req=http.request({
hostname:'bkjw.sxu.edu.cn',
port:'80',
path:'/xscj/Stu_MyScore_Drawimg.aspx?x=1&h=2&w=867&xnxq=20161&xn=2016&xq=1&rpt=1&rad=2&zfx=0',
method:'GET',
headers:{
'Accept':'image/webp,image/apng,image/*,*/*;q=0.8',
'Accept-Encoding':'gzip, deflate',
'Accept-Language':'zh-CN,zh;q=0.8',
'Cache-Control':'no-cache',
'Connection':'keep-alive',
'Cookie':`${spiderForSXU.getAttr("theCookie")}`,
'Host':'bkjw.sxu.edu.cn',
'Pragma':'no-cache',
'Referer':'http://bkjw.sxu.edu.cn/xscj/Stu_MyScore_rpt.aspx',
'User-Agent':' Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko'
}
},(res)=>{
var imageData='';
console.log(res);
console.log(`状态码: ${res.statusCode}`);
res.setEncoding("binary");
res.on("data",(chunk)=>{
imageData+=chunk;
});
res.on("end",()=>{
fs.writeFile('score.jpg',imageData,"binary",(err)=>{
if(err){
console.log(err);
}
});
console.log("OK SUCCESSFUL");
})
});
req.on('err',(err)=>{
console.log(err);
});
req.end();
console.log("获取成绩数据成功");
},1000))
});
正常得到的结果应为 可是通过上述请求得到的结果为 希望大家可以帮我指出症结所在,万分感谢 那个get请求中param的x和h应该为长宽比,w为宽度,xnxq为学年学期,xn为学年,rpt为是否为有效成绩。
使用 buffer , 而不是字符串拼接。
var chunks = [];
res.on("data", function (chunk) {
chunks.push(chunk);
});
res.on("end", function () {
var body = Buffer.concat(chunks);
console.log(body.toString());
});
对于 http 部分,非常建议使用 node-fetch,axios,request 等 http 库
对于下载图片,建议使用 stream pipe ,一步到位
request.get(url).pipe(fs.createWriteStream(imgPath))
@Lizhooh 非常感谢建议,我去试试,希望可以成功
@bsdragon 感谢建议, 我去试试用request,还不是很熟悉request带cookie的请求,希望可以成功
@Lizhooh 我尝试了用buffer,可是还是只能获得半张图片,
,(res)=>{
var chunks=[];
// console.log(res);
console.log(`状态码: ${res.statusCode}`);
//res.setEncoding("binary");
res.on("data",(chunk)=>{
chunks.push(chunk);
});
res.on("end",()=>{
var body=Buffer.concat(chunks);
fs.writeFile('./score.jpg',body,"binary",(err)=>{
if(err){
console.log(err);
}
});
console.log("OK SUCCESSFUL");
})
});
发现问题是当我请求的图片宽度超过600px就会只能接收一半