gpt4 book ai didi

javascript - Puppeteer,阻止 window.location 并返回页面内容?

转载 作者:行者123 更新时间:2023-12-05 00:38:44 26 4
gpt4 key购买 nike

我正在尝试使用 puppeteer 获取页面的全部内容,这适用于普通页面,但如果它执行 window.location重定向我想阻止该重定向并只获取原始内容:
前任。如果 https://example.com/thisredirects返回

<html>
<body>
<p>Page not found - Please wait while we redirect you home...</p>
<script type="text/javascript" language="javascript">
window.location = "//example.com";
</script>
</body>
</html>
我想获取该 html 并阻止位置重定向。如果我尝试使用 setRequestInterception 阻止/中止位置更改response 返回 null 并且它实际上并没有完全阻止重定向(它适用于重定向状态代码,但不适用于返回 200 然后使用 window.location 重定向的页面):
const puppeteer = require('puppeteer');

(async () => {
const browser = await puppeteer.launch({ headless: false });
const pageUrl = "https://example.com/thisredirects";

const page = await browser.newPage();
await page.setCacheEnabled(false);
await page.setRequestInterception(true);

const requests = [];
page.on('request', async request => {
let isNavRequest = request.isNavigationRequest() && request.frame() === page.mainFrame();
if (!isNavRequest) {
request.continue();
return;
}
requests.push(request);
if (requests.length == 1) {
console.log("Load initial page: " + request.url());
request.continue();
return;
}
console.log("Block redirect to: " + request.url());
request.abort();
});

let response;
try {
console.log(`Request: ${pageUrl}`);
response = await page.goto(pageUrl, { waitUntil: 'domcontentloaded' });
const content = await response.text();
console.log(content);
await page.close();
await browser.close();
}
catch (err) {
console.log(err);
}
})()
有没有办法阻止 window.location并在不完全禁用 javascript 的情况下获取原始 HTML(如上)?
即使我听取了所有回复:
  page.on('response', async response => {
if (response.ok && response.url() === pageUrl) {
console.log(await response.text());
}
});
它无法获取原始 HTML。它抛出 Could not load body for this request. This might happen if the request is a preflight request. .

最佳答案

@GrafiCode 关于 page.setJavascriptEnabled(false) 的提示很好:稍后,您可以通过将其值设置为 true 来将其转回.
要解决此问题,您可以按照以下步骤操作:

  • 禁用 JavaScript 以防止 window.location立即重新分配
  • 导航到(功能失调的)页面
  • 删除 <script>试图操纵位置的标签(page.$$evalpage.evaluate puppeteer 方法可用于执行 Element.remove())
  • 在清理后保存 HTML - 无重定向 - 标记 ( page.content )。
  • 启用 JavaScript
  • 在页面上设置保存的 HTML ( page.setContent )
  • 您将无法访问 response.text()与您在上面尝试的方式相同(因为 setContent 返回的方式与 goto 不同),但您可以使用 page.$evalinnerText<body>

  • const page = await browser.newPage()
    await page.setJavaScriptEnabled(false)
    await page.goto(pageUrl)

    await page.$$eval('script', scripts =>
    scripts.forEach(src => {
    if (src.innerHTML.includes('window.location')) src.remove()
    })
    )

    const html = await page.content()
    await page.setJavaScriptEnabled(true)
    await page.setContent(html)

    const text = await page.$eval('body', el => el.innerText)
    console.log(text)
    输出( <p> 的内容):
    Page not found - Please wait while we redirect you home...

    关于javascript - Puppeteer,阻止 window.location 并返回页面内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73173966/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com