如何获取第三方延迟加载页面的内容?

时间:2017-10-29 12:12:43

标签: javascript ajax

通过Chrome扩展程序,我试图获取并修改第三方网页的内容。一切都适用于在初始页面加载时立即可见的内容部分。

问题是此页面具有延迟加载/ ajax分页。 要获取所有内容,我必须点击"查看全部" (ajax链接)(我认为这与延迟加载的工作方式基本相同,这就是为什么我将该关键字放在标题中)。

点击该链接后(在该第三方网站上),所有内容都会被加载并且对用户可见,但是当我查看源时,仍然只有源代码中存在的最初加载的内容< / strong>即可。即,在我加载新内容后查看页面源时,没有任何新加载的内容可以在任何地方找到。内容对最终用户可见,但在检查源代码时对我不可见。

最初,我试图通过使用setInteval并每秒检查一次页面内容来解决这个问题,但由于这不起作用我检查了源代码,果然,在源代码中没有看到新加载的内容码。难怪我的Chrome扩展程序无法获取该内容。

在这里输入时我刚刚意识到的另一个令人困惑的事情: 当我查看源代码时,我的Chrome扩展程序检测/加载甚至是初始HTML内容实际上并未出现在源代码中! 它实际上位于JavaScript数组。因此,不知何故,我的Chrome扩展程序正确地获取了从该JS数组构建的初始H​​TML内容。但是,在点击&#34;查看全部&#34;之后,它没有获得加载的内容。该页面上的ajax链接(即使我使用setInteval并每秒检查新内容)。

有哪些可行的解决方案?

我无法将链接发布到该页面,因为它是我的证书&#34;我的证书&#34; Lynda.com上的页面,我不知道具有相同行为的可公开访问的网站/页面。

1 个答案:

答案 0 :(得分:1)

当发生延迟加载时,您应该找到在网络面板中运行的实际服务,然后按照以下代码

   //recursively make calls and gatther responses. cb is callback to run on response, end is end page-no (end of recursion condition) , pageId is the attribute changing in every subsequent lazy-loading call.
var callIfRequiredConfigured = ({cb,end,step=1,pageURL,pageId})=>callIfRequired = ()=>{
    currentCounter = currentCounter + step;
    if (currentCounter > end) {
        return;
    }
    (async(currentCounter)=>{

        queueCounter++;
        //modify this as needed
        const r = await fetch(pageURL+currentCounter,{credentials:"same-origin"});
          //queueCounter to not make more than 6 calls at once
        if (queueCounter > 6) {
            return;
        }
        var response = await r.text();
        cb(response);
        queueCounter--;
        callIfRequired();
    }
    )(currentCounter);

};

var call = (config)=>{
    const callIfRequired = callIfRequiredConfigured(config);
    callIfRequired();
}


call({
    cb: (response)=>{
        //do somrthing with response
    }
    ,
    end: 50,
    step: 1,
    pageId: 'PageNumber=',
    pageURL: `https://www.lynda.com/home/CertificateOfCompletion/GetCertificatesByFilter?Start=0&Limit=99999&SortBy=CompletionDate&SortByOrder=1&_=[my_personal_id]&PageNumber=`
});

因此,主要工作是在此处推断服务端点以及它在子请求请求中的变化方式。我已更新注释中给出的url,但查看fetch调用是否成功。此网址也应该在网址中提供[my_personal_id]