使用 nightmare.js 发出各种请求

若昂·维克多

我正在使用 nightmarejs 来抓取网站。首先,我请求获取一些链接,这会导致另一个页面,其中包含我也想要的更多信息。我把它分成两个功能:

const { csvFormat } = require('d3-dsv');
const Nightmare = require('nightmare');
const { writeFileSync } = require('fs');

const url = 'https://lojaonline.claro.com.br/celular';

function getUrls (){
    console.log('Extraindo Links...');
    const nightmare = new Nightmare({show: true});
    var p1 = '51030';
    var p2 = '560';
    try{
        nightmare.goto(url).wait('input[id="edit-cep-part1"]')
                           .type('input[id="edit-cep-part1"]', p1)
                           .wait('input[id="edit-cep-part2"]')
                           .type('input[id="edit-cep-part2"]', p2)
                           .click('input[value="Confirmar"]')
                           .wait('#products-container .products-list').evaluate(function(){

            return Array.from(document.querySelectorAll('.offer')).map(element => element.href);            

        }).end()
        .then(function(result){

            var listaUrls = Object.values(result);

            return listaUrls;

        })
        .then(function(listaUrls){
            listaUrls.forEach(function(link){
                console.log('Pegando preços de ' + link);
                getPrecos(link);
            });
        });
    }catch(e){
        console.error(e);
    }
};

function getPrecos(endereco) {
    console.log('Extraindo preços...');
    const nightmare = new Nightmare({gotoTimeout: 999999999});
    var p1 = '51030';
    var p2 = '560';
    try{

         nightmare.goto(endereco).wait('input[id="edit-cep-part1"]')
                                .type('input[id="edit-cep-part1"]', p1)
                                .wait('input[id="edit-cep-part2"]')
                                .type('input[id="edit-cep-part2"]', p2)
                                .click('input[value="Confirmar"]')
                                .wait('#plans-tab').evaluate(function(){

            return Array.from(document.querySelectorAll('tr.body')).map(element => element.innerText);          

        }).end()
        .then(function(result){

            var listaPrecos = Object.values(result);

            console.log(listaPrecos);
        });
    }catch(e){
        console.error(e);
    }
};

getUrls();

它在大多数情况下都有效。有些请求是成功的,我能够获取信息,但有些请求在 30 秒后超时:

 UnhandledPromiseRejectionWarning: Error: .wait() for #plans-tab timed out after 30000msec.

我必须等待、输入和点击,因为这个特定的网站在显示数据之前要求提供邮政编码。如果我确实在 getPrecos 函数中显示 : true ,则会弹出 20 个电子实例。我在这里做错了什么?

有没有办法只在前一个请求完成后触发请求?

医学博士 阿布·塔赫

您正在使用 forEach 循环遍历列表,如果您希望它们一个一个地获取数据,那么您应该使用for...ofasync await或一些具有并发支持的承诺库。

listaUrls.forEach(function(link) {
  console.log("Pegando preços de " + link);
  getPrecos(link);
});

上面的代码片段可以用 async await 和 for 循环转换,如下所示。

// other part of code
.then(async function(listaUrls) { // <-- async function
  for(const link of listaUrls){
      console.log("Pegando preços de " + link);
      await getPrecos(link); // <-- go thru the link one by one
  }
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用reduce和Promises在Nightmare js中循环

来自分类Dev

Nightmare.js与Docker

来自分类Dev

如何在 Nightmare.js 中使用 npm 包 selenium-standalone 而不是下载 selenium jar?

来自分类Dev

如何使用包含选项的request.js发出POST请求

来自分类Dev

使用sails.io.js从前端发出的API请求

来自分类Dev

使用node.js向API发出请求

来自分类Dev

如何使用 Node.JS 向 Ghostbin 发出 POST 请求?

来自分类Dev

为什么在使用Nightmare.js或phantom.js抓取网站时显示phantom std out错误

来自分类Dev

为什么在使用Nightmare.js或phantom.js抓取网站时显示phantom std out错误

来自分类Dev

清除Nightmare.js(电子)中的缓存

来自分类Dev

javascript 变量上的 Nightmare.js wait()

来自分类Dev

导出/导入 Nightmare.js 函数

来自分类Dev

无法使用node.js和“请求”模块向UTF-8链接发出请求

来自分类Dev

使用$ httpBackend捕获各种请求

来自分类Dev

使用$ httpBackend捕获各种请求

来自分类Dev

使用 js 中的自签名证书发出请求(使用来自 npm 的 request-promise)

来自分类Dev

Javascript-Nightmare.JS无限滚动动作

来自分类Dev

如何在Nightmare.js中设置电子大小?

来自分类Dev

为什么nightmare.js示例不起作用?

来自分类Dev

如何在nightmare.js中运行多个评估方法?

来自分类Dev

在Nightmare.js中循环访问URL时的异步挑战

来自分类Dev

在Nightmare.js中无法读取null的属性“模糊”

来自分类Dev

解释错误代码 -102 Nightmare.js 抓取

来自分类Dev

未定义表示 querySelector 类的变量 Nightmare.js

来自分类Dev

在Node.js中发出请求时提示要使用的URL

来自分类Dev

如何使用Azure Functions和node.js在module.exports之外发出axios请求?

来自分类Dev

尝试使用Chart.js时是否需要发出http请求?

来自分类Dev

在Express.js上使用Axios向Spotify API发出POST请求时出现错误400

来自分类Dev

是否可以使用Nightmare.js(v2 Electron)将信息从浏览器传递到Node作用域?

Related 相关文章

  1. 1

    使用reduce和Promises在Nightmare js中循环

  2. 2

    Nightmare.js与Docker

  3. 3

    如何在 Nightmare.js 中使用 npm 包 selenium-standalone 而不是下载 selenium jar?

  4. 4

    如何使用包含选项的request.js发出POST请求

  5. 5

    使用sails.io.js从前端发出的API请求

  6. 6

    使用node.js向API发出请求

  7. 7

    如何使用 Node.JS 向 Ghostbin 发出 POST 请求?

  8. 8

    为什么在使用Nightmare.js或phantom.js抓取网站时显示phantom std out错误

  9. 9

    为什么在使用Nightmare.js或phantom.js抓取网站时显示phantom std out错误

  10. 10

    清除Nightmare.js(电子)中的缓存

  11. 11

    javascript 变量上的 Nightmare.js wait()

  12. 12

    导出/导入 Nightmare.js 函数

  13. 13

    无法使用node.js和“请求”模块向UTF-8链接发出请求

  14. 14

    使用$ httpBackend捕获各种请求

  15. 15

    使用$ httpBackend捕获各种请求

  16. 16

    使用 js 中的自签名证书发出请求(使用来自 npm 的 request-promise)

  17. 17

    Javascript-Nightmare.JS无限滚动动作

  18. 18

    如何在Nightmare.js中设置电子大小?

  19. 19

    为什么nightmare.js示例不起作用?

  20. 20

    如何在nightmare.js中运行多个评估方法?

  21. 21

    在Nightmare.js中循环访问URL时的异步挑战

  22. 22

    在Nightmare.js中无法读取null的属性“模糊”

  23. 23

    解释错误代码 -102 Nightmare.js 抓取

  24. 24

    未定义表示 querySelector 类的变量 Nightmare.js

  25. 25

    在Node.js中发出请求时提示要使用的URL

  26. 26

    如何使用Azure Functions和node.js在module.exports之外发出axios请求?

  27. 27

    尝试使用Chart.js时是否需要发出http请求?

  28. 28

    在Express.js上使用Axios向Spotify API发出POST请求时出现错误400

  29. 29

    是否可以使用Nightmare.js(v2 Electron)将信息从浏览器传递到Node作用域?

热门标签

归档