vault backup: 2026-11-06 20:27:00
This commit is contained in:
1 parent
f7d1bff65f
commit
856d0203da
2 files changed
+235
No files matched your search
@@ -0,0 +1,63 @@
|
||||
// 抓取内容分析页:作品列表 + 单篇数据
|
||||
import { connect, attachPage, evaluate, saveJson, listPages } from './lib.mjs';
|
||||
|
||||
const cdp = await connect();
|
||||
|
||||
// 直接在百家号标签页内导航到内容分析
|
||||
const hit = await attachPage(cdp, 'baijiahao.baidu.com');
|
||||
if (!hit) { console.log('NO_TAB'); process.exit(1); }
|
||||
const { sessionId } = hit;
|
||||
|
||||
// 先看内容分析页有哪些数据接口,装 XHR 钩子
|
||||
await cdp.send('Page.enable', {}, sessionId).catch(() => {});
|
||||
await cdp.send('Runtime.enable', {}, sessionId).catch(() => {});
|
||||
|
||||
await evaluate(cdp, sessionId, `(() => {
|
||||
window.__CAP = window.__CAP || [];
|
||||
if (!window.__HOOKED) {
|
||||
window.__HOOKED = true;
|
||||
const origOpen = XMLHttpRequest.prototype.open;
|
||||
const origSend = XMLHttpRequest.prototype.send;
|
||||
XMLHttpRequest.prototype.open = function(m, u) { this.__u = u; this.__m = m; return origOpen.apply(this, arguments); };
|
||||
XMLHttpRequest.prototype.send = function() {
|
||||
this.addEventListener('load', () => {
|
||||
try {
|
||||
const ct = this.getResponseHeader('content-type') || '';
|
||||
if (ct.includes('json')) {
|
||||
window.__CAP.push({ url: this.__u, body: this.responseText.slice(0, 200000) });
|
||||
}
|
||||
} catch (e) {}
|
||||
});
|
||||
return origSend.apply(this, arguments);
|
||||
};
|
||||
const origFetch = window.fetch;
|
||||
window.fetch = function(...args) {
|
||||
return origFetch.apply(this, args).then(res => {
|
||||
try {
|
||||
const u = (typeof args[0] === 'string') ? args[0] : args[0].url;
|
||||
res.clone().text().then(t => {
|
||||
if (t && (t[0] === '{' || t[0] === '[')) window.__CAP.push({ url: u, body: t.slice(0, 200000) });
|
||||
}).catch(() => {});
|
||||
} catch (e) {}
|
||||
return res;
|
||||
});
|
||||
};
|
||||
}
|
||||
return 'hooked';
|
||||
})()`);
|
||||
|
||||
// 导航到内容分析页
|
||||
await evaluate(cdp, sessionId, `location.href = 'https://baijiahao.baidu.com/builder/rc/analysiscontent'`);
|
||||
await new Promise(r => setTimeout(r, 9000));
|
||||
|
||||
const state = await evaluate(cdp, sessionId, `(() => ({
|
||||
url: location.href,
|
||||
title: document.title,
|
||||
text: (document.body ? document.body.innerText : '').slice(0, 6000),
|
||||
captured: (window.__CAP || []).map(x => x.url)
|
||||
}))()`);
|
||||
|
||||
saveJson('out/analysis-content.json', state);
|
||||
console.log('URL=' + String(state.url).replace(/[^\x20-\x7E]/g, '?'));
|
||||
console.log('CAPTURED=' + (state.captured || []).length);
|
||||
process.exit(0);
|
||||
Reference in new issue
Block a user