我正在尝试使用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();
})
})
})();
答案 0 :(得分:2)
我终于找到了一个解释,尽管它并不能解决整个谜团。
除非请求随附 NID cookie ,否则Google不提供第二个文件。 每Google's policies:
NID cookie 包含Google用来记住您的偏好设置和其他信息(例如您的首选语言(例如英语),每页希望显示多少搜索结果(例如))的唯一ID 10或20),以及您是否希望启用Google的SafeSearch过滤器。
现在我想知道两件事:
无论如何,这是我的问题的解决方案:
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']
}
})