Javascript 噩梦JS`.goto(url)`循环

Javascript 噩梦JS`.goto(url)`循环,javascript,loops,web-scraping,nightmare,Javascript,Loops,Web Scraping,Nightmare,我正在编写一个噩梦JS脚本,它登录到一个网站,根据表中的结果构建一个链接列表,然后打开每个链接。在每个打开的链接上,一些信息会被删除并添加到最终结果中 我在打开每个链接的循环中遇到了很多麻烦。由于网站的限制,此过程必须同步 下面是一个非常简单的例子,说明到目前为止我所拥有的,以及我得到的回报 我是这个图书馆的新手,在阅读文档的同时,我发现它非常混乱 关于让.goto()循环工作有什么建议吗 const Nightmare = require('nightmare') const moment =

我正在编写一个噩梦JS脚本,它登录到一个网站,根据表中的结果构建一个链接列表,然后打开每个链接。在每个打开的链接上,一些信息会被删除并添加到最终结果中

我在打开每个链接的循环中遇到了很多麻烦。由于网站的限制,此过程必须同步

下面是一个非常简单的例子,说明到目前为止我所拥有的,以及我得到的回报

我是这个图书馆的新手,在阅读文档的同时,我发现它非常混乱

关于让
.goto()
循环工作有什么建议吗

const Nightmare = require('nightmare')
const moment = require('moment')

const opts = {
  show: true,
  openDevTools: { mode: 'detach' },
  pollInterval: 250,
  waitTimeout: 10000,
  webPreferences: {
    webSecurity: false
  }
}

const nightmare = Nightmare(opts)

nightmare
  .goto('https://www.google.co.nz/')
  .evaluate(links => {
    var allHrefs = document.querySelectorAll('#fbar #fsl a')
    var allLinks = []
    allHrefs.forEach(function(a) {
      allLinks.push(a.href)
    })

    console.log('allLinks:', allLinks)

    return allLinks
  }, '.what')
  .end()
  .then(result => {
    console.log('result:', result)
    let titles = []
    result.forEach(link => {
      return nightmare
        .goto(link)
        .wait('#navheader')
        .evaluate(getTitle => {
          var thisTitle = document.title
          console.log('this title:', thisTitle)
          titles.push(thisTitle)
        })
    })
    console.log('titles:', titles)
    return titles
  })
在这里,运行脚本后控制台将显示以下结果:

$ node scripts/nm_test.js 
result: [ 'https://www.google.co.nz/intl/en/ads/?fg=1',
  'https://www.google.co.nz/services/?fg=1',
  'https://www.google.co.nz/intl/en/about.html?fg=1' ]
titles: []

由于网站的限制,必须是同步的。为什么网站会关心对它的请求是同步的还是异步的?它如何区分两者之间的区别?你确定你没有混淆速率限制和同步性吗?好问题-这个网站对登录进行速率限制:如果你使用相同的详细信息登录两次,第一次登录就会被淘汰。但是,如果你甚至在同一时间从网站上打开了多个链接,它似乎也很讨厌:我不知道他们是如何/为什么这么做的!使用承诺,这样你就不会同时多次连接到网站。您仍然可以异步执行。