首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何修复木偶戏刮擦失败

如何修复木偶戏刮擦失败
EN

Stack Overflow用户
提问于 2019-04-12 17:57:41
回答 1查看 875关注 0票数 0

我想用node.js和木偶剧演员保存网页的HTML代码。当我使用'headless-browser: false‘启动程序时,我可以看到页面完全加载,所有数据都在那里。但是如果我尝试保存HTML,我只能得到这样的结果:

代码语言:javascript
复制
<!DOCTYPE html><html><head>
<meta name="ROBOTS" content="NOINDEX, NOFOLLOW">
<meta http-equiv="cache-control" content="max-age=0">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="refresh" content="10; url=/distil_r_captcha.html?requestId=16a-84c6-42b6-9023-a45b3854e34c&amp;httpReferrer=%2Fli">
<script type="text/javascript">
        (function(window){
                try {
                        if (typeof sessionStorage !== 'undefined'){
                                sessionStorage.setItem('distil_referrer', document.referrer);
                        }
                } catch (e){}
        })(window);
</script>
<script type="text/javascript" src="/elrhculcipoedjwh.js" defer=""></script><style type="text/css">#d__fFH{position:absolute;top:-5000px;left:-5000px}#d__fF{font-family:serif;font-size:200px;visibility:hidden}#xaqctssquudxqdqxzveurrreayw{display:none!important}</style></head>
<body>
<div id="distilIdentificationBlock">&nbsp;</div>
</body></html>

所以我有点困惑:如果网页知道请求来自机器人(=所以我只能下载这个被阻止的HTML代码),那么为什么内容会显示出来?或者从另一个角度来看:如果网页不知道请求来自机器人(=因此内容显示),那么为什么我只能下载这个被阻止的HTML?

我的代码:

代码语言:javascript
复制
const puppeteer = require('puppeteer');

(async () => {

    const browser = await puppeteer.launch({ headless: false });
    const context = await browser.createIncognitoBrowserContext();
    const page = await context.newPage();

    await page.evaluateOnNewDocument(() => {
        Object.defineProperty(navigator, 'webdriver', {
            get: () => false,
        });
    });

    await page.evaluateOnNewDocument(() => {
        window.navigator.chrome = {
            runtime: {},
        };
    });

    await page.evaluateOnNewDocument(() => {
        const originalQuery = window.navigator.permissions.query;
        return window.navigator.permissions.query = (parameters) => (
            parameters.name === 'notifications' ?
                Promise.resolve({
                    state: Notification.permission
                }) :
                originalQuery(parameters)
        );
    });

    await page.evaluateOnNewDocument(() => {
        Object.defineProperty(navigator, 'plugins', {
            get: () => [1, 2, 3, 4, 5],
        });
    });

    await page.evaluateOnNewDocument(() => {
        Object.defineProperty(navigator, 'languages', {
            get: () => ['en-EN', 'en'],
        });
    });

    await page.setViewport({
        'width': 1024,
        'height': 768,
        'deviceScaleFactor': 1,
        'isMobile': false,
        'hasTouch': false,
        'isLandscape': false
    });

    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36');
    await page.goto(url, { waitUntil: 'load' });
    const html = await page.content();
    console.log(html);
    await browser.close();
})();

我怎样才能解决这个问题?也许我尝试过早地保存HTML代码?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-14 00:23:09

我想我找到解决方案了。由于目标网页有一些反机器人系统,当它加载时,它首先呈现一个只有一个div的“空”页面。在此之后,它将重定向到内容。所以我不得不加上

代码语言:javascript
复制
await page.waitFor(5000)

以等待页面完全加载。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55649085

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档