NodeJS的图像下载问题

时间:2018-08-12 08:26:04

标签: javascript node.js http google-books

我正在尝试使用axios通过以下代码下载Google图书页面:

const response = await axios({
        method: 'GET',
        url: url,
        responseType: 'stream'
    })

这适用于某些图像(例如this one),但不适用于某些其他图像(例如this one)。 Google不会提供实际的图片,而是提供默认的“图片不可用”文件。

两个请求都可以在浏览器中运行,但是第二个请求在NodeJS中失败。

我比较了两个请求的请求和响应头,但看不到任何相关信息;请注意,两个图像都是PNG。到目前为止,我不记得要用JPEG面对这个问题。

为什么Google不能正确提供第二张图片

请使用以下代码在家中尝试:

const axios = require('axios');
const fs = require('fs');

(async function () {
    const response = await axios({
        method: 'GET',
        url: 'https://books.google.fr/books/content?id=DvGApMzEJmQC&hl=fr&pg=PA61&img=1&zoom=3&sig=ACfU3U3IPtY0MOIxgMR8rJTxt9YYGPUl1Q&w=1025',
        responseType: 'stream'
    })
    response.data.pipe(fs.createWriteStream('result.png'))

    return new Promise((resolve, reject) => {
        response.data.on('end', () => {
            resolve();
        })
        response.data.on('error', () => {
            reject();
        })
    })
})();

1 个答案:

答案 0 :(得分:2)

我终于找到了一个解释,尽管它并不能解决整个谜团。

除非请求随附 NID cookie ,否则Google不提供第二个文件。 每Google's policies

  

NID cookie 包含Google用来记住您的偏好设置和其他信息(例如您的首选语言(例如英语),每页希望显示多少搜索结果(例如))的唯一ID 10或20),以及您是否希望启用Google的SafeSearch过滤器。

现在我想知道两件事:

  • 为什么这是必需的,作为浏览自定义cookie?用于安全搜索吗?
  • 为什么只需要几个文件?

无论如何,这是我的问题的解决方案:

const initialRequest = await axios({
        method: 'GET',
        url: 'https://google.com'
    })

    const response = await axios({
        method: 'GET',
        url: 'https://books.google.com/books/content?id=DvGApMzEJmQC&pg=PA61&img=1&zoom=3&sig=ACfU3U3IPtY0MOIxgMR8rJTxt9YYGPUl1Q&w=1025',
        responseType: 'stream',
        headers:{
            'Cookie' : initialRequest.headers['set-cookie']
        }
    })