爬虫过程中,使用http模块获取图片,无法完整获取,只能获取图片部分,请问该如何完整获取到图片
发布于 7 年前 作者 cuijinyu 4940 次浏览 来自 问答

爬虫是一个自己写的爬取青果教务系统的爬虫,这是地址 青果教务系统爬虫 一直到登陆都完全正常,可是当向服务器发送请求获取成绩却只能获取半张图片,用浏览器完全正常,尝试了多个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))
});

正常得到的结果应为 Stu_MyScore_Drawimg_htm.jpg 可是通过上述请求得到的结果为 score.jpg 希望大家可以帮我指出症结所在,万分感谢 那个get请求中param的x和h应该为长宽比,w为宽度,xnxq为学年学期,xn为学年,rpt为是否为有效成绩。

6 回复

使用 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就会只能接收一半

回到顶部