Javascript 在Puppeter中使用XPath获取所有链接(暂停或不工作)?

Javascript 在Puppeter中使用XPath获取所有链接(暂停或不工作)?,javascript,node.js,xpath,google-chrome-devtools,puppeteer,Javascript,Node.js,Xpath,Google Chrome Devtools,Puppeteer,我需要使用XPath来选择页面上的所有链接,然后我的木偶应用程序才能点击进入并执行一些操作。我发现这个方法(下面的代码)有时会卡住,我的爬虫程序会暂停。是否有更好/不同的方法从XPath获取所有链接?或者我的代码中是否有不正确的地方,可能会暂停我的应用程序的进程 try { links = await this.getLinksFromXPathSelector(state); } catch (e) { console.log("error getting links"); ret

我需要使用XPath来选择页面上的所有链接,然后我的木偶应用程序才能点击进入并执行一些操作。我发现这个方法(下面的代码)有时会卡住,我的爬虫程序会暂停。是否有更好/不同的方法从XPath获取所有链接?或者我的代码中是否有不正确的地方,可能会暂停我的应用程序的进程

try {
  links = await this.getLinksFromXPathSelector(state);
} catch (e) {
  console.log("error getting links");
  return {...state, error: e};
}
这要求:

async getLinksFromXPathSelector(state) {
 const newPage = state.page
 // console.log('links selector');
 const links = await newPage.evaluate((mySelector) => {
   let results = [];
   let query = document.evaluate(mySelector,
     document,
     null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
   for (let i=0, length=query.snapshotLength; i<length; ++i) {
     results.push(query.snapshotItem(i).href);
   }
   return results;
 }, state.linksSelector);
  return links;
}
异步getLinksFromXPathSelector(状态){
const newPage=state.page
//log('links selector');
const links=wait newPage.evaluate((mySelector)=>{
让结果=[];
让query=document.evaluate(mySelector,
文件,
null,XPathResult.ORDERED\u节点\u快照\u类型,null);
对于(设i=0,length=query.snapshotLength;i),您可以使用来计算XPath表达式并获取数组。事先使用可以确保将XPath字符串指定的元素添加到DOM中

然后可以通过将数组元素传递到页面上下文,并返回一个包含每个元素的属性值的数组

const xpath_expression = '//a[@href]';
await page.waitForXPath(xpath_expression);
const links = await page.$x(xpath_expression);
const link_urls = await page.evaluate((...links) => {
  return links.map(e => e.href);
}, ...links);

console.log(link_urls);

这段代码绝对更干净,更容易阅读。谢谢你,但是,程序仍然被困在这个方法中-并且只在生产环境中,这是在一个停靠的容器中仅供参考。原来主要的问题是上游,但这段代码肯定有帮助。谢谢!