通过Chrome扩展程序,我试图获取并修改第三方网页的内容。一切都适用于在初始页面加载时立即可见的内容部分。
问题是此页面具有延迟加载/ ajax分页。 要获取所有内容,我必须点击"查看全部" (ajax链接)(我认为这与延迟加载的工作方式基本相同,这就是为什么我将该关键字放在标题中)。
点击该链接后(在该第三方网站上),所有内容都会被加载并且对用户可见,但是当我查看源时,仍然只有源代码中存在的最初加载的内容< / strong>即可。即,在我加载新内容后查看页面源时,没有任何新加载的内容可以在任何地方找到。内容对最终用户可见,但在检查源代码时对我不可见。
最初,我试图通过使用setInteval并每秒检查一次页面内容来解决这个问题,但由于这不起作用我检查了源代码,果然,在源代码中没有看到新加载的内容码。难怪我的Chrome扩展程序无法获取该内容。
在这里输入时我刚刚意识到的另一个令人困惑的事情: 当我查看源代码时,我的Chrome扩展程序检测/加载的甚至是初始HTML内容实际上并未出现在源代码中! 它实际上位于JavaScript数组。因此,不知何故,我的Chrome扩展程序正确地获取了从该JS数组构建的初始HTML内容。但是,在点击&#34;查看全部&#34;之后,它没有获得加载的内容。该页面上的ajax链接(即使我使用setInteval并每秒检查新内容)。
有哪些可行的解决方案?
我无法将链接发布到该页面,因为它是我的证书&#34;我的证书&#34; Lynda.com上的页面,我不知道具有相同行为的可公开访问的网站/页面。
答案 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]
。