抓取和存储 Shopify 电子商务网站使用 Node.js



我编写了一个代码来抓取一系列 Shopify 电子商务网站 在节点中使用网站抓取器npm模块.js但它显示403错误,但相同的代码适用于其他网站。

我们如何解决这个问题?

我的刮板测试.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 */
});
})
})

和测试.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;

我得到了解决方案。 我们能够使用 request(( 获取域的 html 数据; response.body 包含 html 数据

我使用以下代码得到的解决方案:

const request = require('request');
const extractDomain = require('extract-domain');
let fs = require('fs');
function checkRedirect(link) {
var url = "http://" + link;
var options = {
url: url,
headers: {
'User-Agent': 'request'
}
};
request(options, function (error, response, body) {
if(response !== undefined){
let redirectedDomain = extractDomain(response.request.uri.href);
let writeStream = fs.createWriteStream(redirectedDomain + '.html');
writeStream.write(response.body)
writeStream.end();
});
}
module.exports.checkRedirect = checkRedirect;
//checkRedirect('oneplustwocase.com')
/*
var r = request(url, function (e, resp) {
r.uri
resp.request.uri
})*/

由于您对数据感兴趣,因此无需抓取的麻烦,只需下载站点XML文件即可。它包含所有产品和有趣的信息,就像谷歌或任何其他搜索引擎一样。

  • 如果网站 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默认遵循重定向,因此您可以跳过检查重定向

最新更新