javascript - 使用Node服务器发起HTTP请求无法抓取百度上的图片
黄舟
黄舟 2017-04-11 12:09:08
[JavaScript讨论组]

目标

在Node.js环境下,想完成一个通过url将对应图片下载到服务器的功能,思路就是用http.request对url发起请求,将请求到的图片文件存到服务器某个目录下。

问题

但是在对百度图片上的一个图片url进行请求时,即使我设置了各种请求头,依然怎么都没法请求到正确的文件,总是返回一个内容写着forbidden的html文件。

新问题

刚发现下面那个链接在别的电脑上打开就是403。然而!很神奇!我自己的电脑清除缓存,更换浏览器都依然能打开!这是为何!?而且可以排除ip的因素,因为我同一部电脑,在家里和公司两个地方都能打开! (╯‵□′)╯︵┻━┻

图片链接是:http://img1.imgtn.bdimg.com/i...
(图片有点土鳖,随手选的)

附上浏览器请求信息


代码

图片链接是:http://img1.imgtn.bdimg.com/i...
(图片有点土鳖,随手选的)

我的请求代码

// 请求图片地址
let imgRequest = http.request(requestOption,(resImg) => {
    let imgData = "";
    resImg.setEncoding("binary");
    resImg.on("data",function(chunk) {
        imgData += chunk;
    });
    resImg.on("end",function(){
        console.log('end');
        fs.writeFile(filePathName,imgData,"binary",function(err){
            if(err){
                //图片写入失败
                res.status(500).send({error:'Can\'t download image by URL: '+imgURL});
                console.log("down fail");
            }else{
                res.send('Dowload suceess!');
            }
        })
    })
});
imgRequest.on("error",function(e){
    //图片下载失败
    res.status(500).send({error:'Can’t download image by URL: '+imgURL});
    console.log(e);
});
imgRequest.end();

我的请求配置内容

let requestOption = {
    method: 'get',
    hostname: "img1.imgtn.bdimg.com",
    port: 80,
    path: "/it/u=1794894692,1423685501&fm=23&gp=0.jpg",
    timeout: 5000,
    header: {
        "Upgrade-Insecure-Requests": 1,
        "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
        "Accept-Encoding": "gzip, deflate, sdch",
        "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4",
        "Referer" : "http://img1.imgtn.bdimg.com/it/u=1794894692,1423685501&fm=23&gp=0.jpg",
        "Host": "img1.imgtn.bdimg.com"
    }
};

下载下来的文件内容


403 Forbidden

403 Forbidden


JSP3/2.0.14

求指教

求大神指教,出现这种问题的原因是啥?有办法解决吗?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
天蓬老师

图片链接不正确。

PHP中文网

header 正确拼写 headers

怪我咯

你代码里面,“res”,这个变量都没有在必须的function入口传入。。。
试了一下,按照你的代码,出错运行的结果就是一个403的页面。。。

尝试:

var http = require("http");

var options = {
  "method": "GET",
  "hostname": "img1.imgtn.bdimg.com",
  "port": 80,
  "path": "/it/u=1794894692,1423685501&fm=23&gp=0.jpg",
  "headers": {
    "accept-encoding": "gzip, deflate, sdch",
    "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "accept-language": "zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4",
    "cache-control": "no-cache",
    "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36",
    "connection": "keep-alive",
    "pragma": "no-cache",
    "host": "img1.imgtn.bdimg.com"
  }
};

var req = http.request(options, function (res) {
  var chunks = [];

  res.on("data", function (chunk) {
    chunks.push(chunk);
  });

  res.on("end", function () {
    var body = Buffer.concat(chunks);
    //console.log(body.toString());
    require('fs').writeFileSync("./aaaa.jpg", body, 'binary');
  });
});

req.end();
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号