3

我試圖從this NCBI.gov page刮掉html。我需要包含#see-all URL片段,這樣我才能保證獲得搜索頁面,而不是從不正確的基因頁面檢索HTML頁面https://www.ncbi.nlm.nih.gov/gene/119016檢索JavaScript使用Puppeteer呈現HTML

URL片段不會傳遞到服務器,而是被頁面客戶端的JavaScript用來(在這種情況下)創建完全不同的HTML,這是您在頁面中訪問時獲得的瀏覽器和「查看頁面源」,這是我想要檢索的HTML。 R readLines() ignores url tags followed by #

我第一次嘗試使用phantomJS,但它只是回到這裏ReferenceError: Can't find variable: Map描述的錯誤,似乎從phantomJS不支持該NCBI使用某些功能,從而消除了解決這一路線造成的。

我使用Node.js的使用評價以下JavaScript曾與木偶更大的成功:

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?

回答

1

也許嘗試等待

await page.waitForNavigation(5); 

let html = await page.content(); 
4

你可以嘗試改變這一點:這個

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