Javascript 木偶演员-测试页面的不同选择器

Javascript 木偶演员-测试页面的不同选择器,javascript,puppeteer,Javascript,Puppeteer,我正试图让我的木偶剧脚本通过选择器进行迭代 原因是——根据我通过脚本查询的内容,我可以在页面上获得稍微不同的元素 本质上,我有一个page.evaluate方法,可以像这样进行刮片 while (currentPage <= pagesToScrape) { let newProducts = await page.evaluate(({identified}) => { let results = []; let

我正试图让我的木偶剧脚本通过选择器进行迭代

原因是——根据我通过脚本查询的内容,我可以在页面上获得稍微不同的元素

本质上,我有一个page.evaluate方法,可以像这样进行刮片

    while (currentPage <= pagesToScrape) {

        let newProducts = await page.evaluate(({identified}) => {
          let results = [];

          let items = document.querySelectorAll(
            identified
          );
console.log(items)


          items.forEach((item) => {
            var prod, price;
            if (identified == selectors[0]) {
              prod = item.querySelector("div>div>div>div>div>a>h3").innerText;
              price = item.querySelector("div>div>div>div>div>div>span>span")
                .innerText;
            } else {
              prod = item.querySelector("div>a>h4").innerText;
              price = item.querySelector("div>div>div>div>span>span").innerText;
            }
            results.push({
              Product: prod !== "" ? prod : "",
              Price: price !== "" ? price : "",
            });
          });
          console.log("results");
          console.log(results.length);
          return results;
        });
        product_GSH = product_GSH.concat(newProducts);
        if (currentPage < pagesToScrape) {
          console.log(identified)
          await Promise.all([
            await page.click(buttonSelector),
            await page.waitForSelector(identified),
          ]);
        }
console.log(已识别)

我遇到的问题是,从page.evaluate中,我可以轻松运行标识符并找到要使用的正确标识符。但我需要在查询结束时再次对其进行解析,以便刮取下一页。当我尝试将变量名重新分配给page.evaluate中的正确标识符时,它不会解析它

当我运行此命令时,代码会运行,但我无法使用page.waitfor更改底部promise中的选择器(因此它适用于某些页面,但当它是错误的页面时,我无法替换所选的选择器)。这是完整的代码供参考

        product_GSH = product_GSH.concat(newProducts);
        if (currentPage < pagesToScrape) {
          await Promise.all([
            await page.click(buttonSelector),

            page.waitForNavigation()
          ]);
        }
        currentPage++;
      }
      browser.close();

      return res.send(product_GSH);
    } catch (e) {
      return res.send(e);
    }
  });
});
product\u GSH=product\u GSH.concat(新产品);
如果(当前页面
我在想解决这个问题的一个办法就是看看承诺 功能,并用稍有不同的内容替换它

感谢您在这个问题上的帮助

最后一个问题,如果你能帮忙的话-我如何确保当我选择5页,并且只有3页的结果时,它会发送3页。我发现,如果我说有更多的页面,它不会发送任何响应

理想情况下,我试图让这段代码能够遍历不同的选择器。我尝试了很多不同的方法,除了CORS错误和其他错误,我非常迷茫。这将是很好的得到某种明确的错误,从木偶演员以及


感谢您的帮助:)

承诺。所有这些看起来都是解决问题的地方。虽然我不是promise函数的最佳人选,但promise.all似乎是解决这一问题的最佳选择。我不是promise函数的最佳选择,不过您必须与
页面一起使用。单击(buttonSelector)
promises。此外,要使用,您必须传递实际承诺和未解决承诺,就像您正在做的那样:

if(当前页面
例如,您可以简化选择器

div[class=“sh-dlr\uu list-result”
可能是

div.sh-dlr\u列表结果
选择器

const buttonSelector=“a[id='pnnext']>span[style='display:block;左边距:53px']”;
是错误的;您永远不应该依赖样式来查询选择器;这可以很容易地动态更改;相反,您可以这样定义它

    while (currentPage <= pagesToScrape) {

        let newProducts = await page.evaluate(({identified}) => {
          let results = [];

          let items = document.querySelectorAll(
            identified
          );
console.log(items)


          items.forEach((item) => {
            var prod, price;
            if (identified == selectors[0]) {
              prod = item.querySelector("div>div>div>div>div>a>h3").innerText;
              price = item.querySelector("div>div>div>div>div>div>span>span")
                .innerText;
            } else {
              prod = item.querySelector("div>a>h4").innerText;
              price = item.querySelector("div>div>div>div>span>span").innerText;
            }
            results.push({
              Product: prod !== "" ? prod : "",
              Price: price !== "" ? price : "",
            });
          });
          console.log("results");
          console.log(results.length);
          return results;
        });
        product_GSH = product_GSH.concat(newProducts);
        if (currentPage < pagesToScrape) {
          console.log(identified)
          await Promise.all([
            await page.click(buttonSelector),
            await page.waitForSelector(identified),
          ]);
        }
const buttonSelector=“a#pnnext”;
进行这些更改后,我们将得到正确的结果,例如,它将输出:

product_GSH.length 100
product_GSH [...]
更新

如果要处理少于
pagesToScrape
页面的结果,则必须先查找
buttonSelector
,然后才能按如下方式单击:

if(currentPage
您必须与
页面一起使用。单击(buttonSelector)
承诺。此外,要使用,您必须传递实际承诺和未解决承诺,就像您正在做的那样:

if(当前页面
例如,您可以简化选择器

div[class=“sh-dlr\uu list-result”
可能是

div.sh-dlr\u列表结果
选择器

const buttonSelector=“a[id='pnnext']>span[style='display:block;左边距:53px']”;
是错误的;您永远不应该依赖样式来查询选择器;这可以很容易地动态更改;相反,您可以这样定义它

    while (currentPage <= pagesToScrape) {

        let newProducts = await page.evaluate(({identified}) => {
          let results = [];

          let items = document.querySelectorAll(
            identified
          );
console.log(items)


          items.forEach((item) => {
            var prod, price;
            if (identified == selectors[0]) {
              prod = item.querySelector("div>div>div>div>div>a>h3").innerText;
              price = item.querySelector("div>div>div>div>div>div>span>span")
                .innerText;
            } else {
              prod = item.querySelector("div>a>h4").innerText;
              price = item.querySelector("div>div>div>div>span>span").innerText;
            }
            results.push({
              Product: prod !== "" ? prod : "",
              Price: price !== "" ? price : "",
            });
          });
          console.log("results");
          console.log(results.length);
          return results;
        });
        product_GSH = product_GSH.concat(newProducts);
        if (currentPage < pagesToScrape) {
          console.log(identified)
          await Promise.all([
            await page.click(buttonSelector),
            await page.waitForSelector(identified),
          ]);
        }
const buttonSelector=“a#pnnext”;
进行这些更改后,我们将得到正确的结果,例如,它将输出:

product_GSH.length 100
product_GSH [...]
更新

如果要处理少于
pagesToScrape
页面的结果,则必须先查找
buttonSelector
,然后才能按如下方式单击:

if(currentPage
谢谢。我想你可能是对的,但由于某些原因,当我在promise函数周围使用不同的if语句时,它不会通过正确的标识符进行解析。谢谢。我认为你可能是对的,但由于某些原因,当我在promise函数周围使用不同的if语句时,它不会通过c进行解析正确的标识符。@Christolsystras非常感谢,waitfornav工作得非常好><。如果你能解决另外一件事,那么我已经完成了我开始做的事情,我如何确保当我选择5页,并且只有3页结果时,它会发送3页。我发现,如果我说有更多的页面,它不会发送任何信息响应。你必须先检查
按钮选择按钮
是否存在,然后再单击它;如果它不存在,这意味着我们在最后一页,而我们没有单击它。我已经更新了我的答案,请检查它。很高兴你让它工作了;不确定你为什么会得到向下投票,向上投票。如果可能的话,如果你能删除完整的工作,那就太好了木偶剧脚本部分。可能是偏执狂,但不是所有的都在线。我刚刚删除了木偶剧脚本。检查答案是否为O