【问题标题】:Scrape and store Shopify ecommerce websites using Node.js使用 Node.js 抓取和存储 Shopify 电子商务网站
【发布时间】:2023-06-02 09:22:01
【问题描述】:

我使用 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;

【问题讨论】:

  • 我很欣赏这个大胆的问题。现实是 - Shopify 可能会以各种原因和方式拒绝您的请求,并在不告诉您原因的情况下直接返回 403。
  • 有什么办法可以解决这个问题。就像虚张声势说请求来自浏览器一样。我尝试使用用户代理标头,但这也不起作用。

标签: node.js web-scraping shopify


【解决方案1】:

我得到了解决方案。 我们可以使用 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
  })*/

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      所以选项应该是这样的:

      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 默认会跟随重定向,所以你可以跳过检查重定向

      【讨论】:

        最近更新 更多