我想要完成的是進入這個網站https://www.discoverpermaculture.com/permaculture-masterclass-video-1等到它加載,從 disqus 加載所有評論(點擊“加載更多評論”按鈕,直到它不再存在)并將頁面另存為 mhtml 以供離線使用。
我在這里找到了類似的問題Puppeteer / Node.js 只要一個按鈕存在就點擊它——當它不再存在時,開始操作,但不幸的是,由于某種原因,試圖檢測“加載更多評論”按鈕不起作用。
似乎 WaitForSelector('a.load-more__button') 不起作用,因為它列印出來的所有內容都是“不可見的”。
這是我的代碼
const puppeteer = require('puppeteer');
const url = "https://www.discoverpermaculture.com/permaculture-masterclass-video-1";
const isElementVisible = async (page, cssSelector) => {
let visible = true;
await page
.waitForSelector(cssSelector, { visible: true, timeout: 4000 })
.catch(() => {
console.log('not visible');
visible = false;
});
return visible;
};
async function run () {
let browser = await puppeteer.launch({
headless: true,
defaultViewport: null,
args: [
'--window-size=1920,10000',
],
});
const page = await browser.newPage();
const fs = require('fs');
await page.goto(url);
await page.waitForNavigation();
await page.waitForTimeout(4000)
const selectorForLoadMoreButton = 'a.load-more__button';
let loadMoreVisible = await isElementVisible(page, selectorForLoadMoreButton);
while (loadMoreVisible) {
console.log('load more visible');
await page
.click(selectorForLoadMoreButton)
.catch(() => {});
await page.waitForTimeout(4000);
loadMoreVisible = await isElementVisible(page, selectorForLoadMoreButton);
}
const cdp = await page.target().createCDPSession();
const { data } = await cdp.send('Page.captureSnapshot', { format: 'mhtml' });
fs.writeFileSync('page.mhtml', data);
browser.close();
}
run();
uj5u.com熱心網友回復:
您只是在等待處理 ajax 請求。您可以簡單地保存評論總數(DISQUS 插件的左上角),并在陣列等于總數后將其與評論陣列進行比較,然后您就檢索到了所有評論。
我已經發布了一些關于等待 ajax 請求的內容,您可以在這里看到它:https : //stackoverflow.com/a/66092889/3645650。
或者,一種更簡單的方法是僅使用 DISQUS api。
評論是公開的。您可以只使用網站上的 api 密鑰:
https://disqus.com/api/3.0/threads/listPostsThreaded?limit=50&thread=7187962034&forum=pdc2018&order=popular&cursor=1:0:0&api_key=E8Uh5l5fHZ6gD8U3Kycj6AiAk8U3Kycj6AiAk8U3Kycj6AiAk8U3Kycj6AiAk2F
| 范圍 | 選項 |
|---|---|
limit |
默認為50. 最大值是100。 |
thread |
執行緒數。例如:7187962034。 |
forum |
論壇ID。例如:pdc2018。 |
order |
desc, asc, popular. |
cursor |
大概是頁碼。格式為1:0:0. 例如:第 2 頁將是2:0:0。 |
api_key |
平臺 API 密鑰。這里的 api 密鑰是E8Uh5l5fHZ6gD8U3KycjAIAk46f68Zw7C6eW8WSjZvCLXebZ7p0r1yrYDrLilk2F. |
如果您必須遍歷不同的頁面,則需要攔截xhr回應以檢索執行緒號。
uj5u.com熱心網友回復:
原來問題是disqus評論在iframe內
//needed to add those 2 lines
const elementHandle = await page.waitForSelector('iframe');
const frame = await elementHandle.contentFrame();
//and change 'page' to 'frame' below
let loadMoreVisible = await isElementVisible(frame, selectorForLoadMoreButton);
while (loadMoreVisible) {
console.log('load more visible');
await frame
.click(selectorForLoadMoreButton)
.catch(() => {});
await frame.waitForTimeout(4000);
loadMoreVisible = await isElementVisible(frame, selectorForLoadMoreButton);
}
進行此更改后,它可以完美運行
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/387390.html
