node.js - 使用 Node.js 抓取和存储 Shopify 电子商务网站
问题描述
我使用 node.js 中的 website- scraper npm 模块编写了一个代码来抓取一系列 Shopify 电子商务网站,但它显示 403 错误,但相同的代码适用于其他网站。
我们怎样才能解决这个问题?
我的 scraperTest.js 文件是:
var scrape = require('website-scraper');
let test = require('./test')
let urls = [];
urlList = ['1500.academy'];
urlList.forEach(url =>{
test.checkRedirect(url)
.then(domain =>{
urls.push('https://' + domain);
console.log(urls);
var options = {
urls: urls,
directory: './autochat/',
'User-Agent': 'request',
};
// with promise
scrape(options).then((result) => {
/* some code here */
}).catch((err) => {
/* some code here */
});
// or with callback
scrape(options, (error, result) => {
/* some code here */
});
})
})
和 test.js 文件是
const request = require('request');
const extractDomain = require('extract-domain');
//var link = 'oneplustwocase.com';
function checkRedirect(link) {
return new Promise((resolve, reject) => {
var url = "http://" + link;
var options = {
url: url,
headers: {
'User-Agent': 'request'
}
};
request(options, function (error, response, body) {
let redirectedDomain = extractDomain(response.request.uri.href);
if(response !== undefined){
extractDomain(response.request.uri.href);
if (response.statusCode === 200 && link !== redirectedDomain) {
resolve(redirectedDomain);
} else {
resolve(link);
}
} else {
resolve(link);
}
});
});
}
module.exports.checkRedirect = checkRedirect;
解决方案
如果网站http://1500.academy不喜欢用户代理标头,它似乎会返回 403。我建议尝试看起来像浏览器的用户代理
根据
website-scraper
文档https://www.npmjs.com/package/website-scraper#request您应该在属性中传递请求的标头request
,而不是在根级别
所以选项应该是这样的:
const options = {
urls:[{url: 'http://1500.academy/'}],
directory: './autochat/',
request: {
headers: {
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36',
}
}
}
顺便说一下website-scraper
,默认情况下遵循重定向,因此您可以跳过检查重定向
推荐阅读
- javascript - 如何使用javascript存储屏幕值?
- android - 为什么服务没有启动
- objective-c - 有没有办法从 Objective-C 的块中返回一个值?
- python - 如何在运行 flake8 时自动格式化包含要传递的长字符串的 Python 文件?
- javascript - NodeJS ES6 模块和“默认”导出/导入
- javascript - 如何在 angulajs 脚本端仅重新加载 asp.net 部分视图?
- json - NIFI:为什么 nifi 会自动将数字转换为科学计数法
- python - Django Listview 类方法
- python - 如何在 Python Dash 中的两个 dcc 组件之间留出空间?
- vue.js - 如何使用 v-for 显示背景图像?