当前位置 : 主页 > 网络推广 > seo >

使用Puppeteer检索JavaScript呈现的HTML

来源:互联网 收集:自由互联 发布时间:2021-06-16
我试图从 this NCBI.gov page中删除html.我需要包含#see-all URL片段,这样我才能保证获得搜索页而不是从错误的基因页面 https://www.ncbi.nlm.nih.gov/gene/119016中检索HTML. URL片段不会传递到服务器,而是
我试图从 this NCBI.gov page中删除html.我需要包含#see-all URL片段,这样我才能保证获得搜索页而不是从错误的基因页面 https://www.ncbi.nlm.nih.gov/gene/119016中检索HTML.

URL片段不会传递到服务器,而是由页面客户端的javascript使用(在本例中)创建完全不同的HTML,这是您在浏览器中转到页面时获得的“查看”页面源“,这是我想要检索的HTML. R readLines() ignores url tags followed by #

我首先尝试使用phantomJS,但它刚刚返回了ReferenceError: Can’t find variable: Map中描述的错误,而且似乎是由于phantomJS不支持NCBI正在使用的某些功能,因此消除了这种解决方案.

我使用以下使用node.js评估的Javascript在Puppeteer上取得了更多成功:

const puppeteer = require('puppeteer');
(async() => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(
    'https://www.ncbi.nlm.nih.gov/gene/?term=AGAP8#see-all');
  var HTML = await page.content()
  const fs = require('fs');
  var ws = fs.createWriteStream(
    'TempInterfaceWithChrome.js'
  );
  ws.write(HTML);
  ws.end();
  var ws2 = fs.createWriteStream(
    'finishedFlag'
  );
  ws2.end();
  browser.close();
})();

然而,这返回了似乎是预渲染的html.我如何(以编程方式)获取我在浏览器中获得的最终html?

你可以尝试改变这个:

await page.goto(
  'https://www.ncbi.nlm.nih.gov/gene/?term=AGAP8#see-all');

进入这个:

await page.goto(
    'https://www.ncbi.nlm.nih.gov/gene/?term=AGAP8#see-all', {waitUntil: 'networkidle'});

或者,您可以创建一个函数listenFor()来侦听页面加载时的自定义事件:

function listenFor(type) {
  return page.evaluateOnNewDocument(type => {
    document.addEventListener(type, e => {
      window.onCustomEvent({type, detail: e.detail});
    });
  }, type);
}`

await listenFor('custom-event-ready'); // Listen for "custom-event-ready" custom event on page load.

LE:

这也可能派上用场:

await page.waitForSelector('h3'); // replace h3 with your selector
网友评论