6k6g-v3 / src /lib /crawler /engine.ts
fanyubo
fix: 移除 puppeteer-extra-plugin-stealth — 修复 HF Space 滥用标记
f4ea5e1
Raw
History Blame Contribute Delete
2.24 kB
// hf-space/src/lib/crawler/engine.ts
import puppeteer from 'puppeteer';
import { extractTapTap } from './sites/taptap';
import { extractSteam } from './sites/steam';
import { extractGeneric } from './sites/generic';
import type { ExtractedContent } from './extractor';
import * as crypto from 'crypto';
export interface CrawlResult {
url: string;
title: string;
content: string;
contentHash: string;
success: boolean;
error?: string;
}
function getSiteName(url: string): string {
if (url.includes('taptap.cn') || url.includes('taptap.io')) return 'taptap';
if (url.includes('store.steampowered.com')) return 'steam';
return 'generic';
}
function createHash(content: string): string {
return crypto.createHash('sha256').update(content).digest('hex');
}
export async function crawlPage(url: string): Promise<CrawlResult> {
const browser = await puppeteer.launch({
headless: true,
args: ['--no-sandbox', '--disable-setuid-sandbox', '--disable-dev-shm-usage'],
});
try {
const page = await browser.newPage();
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36');
await page.goto(url, { waitUntil: 'networkidle2', timeout: 30000 });
// 等待内容渲染
await new Promise<void>((r) => setTimeout(r, 2000));
const html = await page.content();
const siteName = getSiteName(url);
let extracted: ExtractedContent;
switch (siteName) {
case 'taptap':
extracted = extractTapTap(html, url);
break;
case 'steam':
extracted = extractSteam(html, url);
break;
default:
extracted = extractGeneric(html, url);
}
if (!extracted.content || extracted.content.length < 100) {
return { url, title: extracted.title, content: '', contentHash: '', success: false, error: 'Content too short' };
}
return {
url,
title: extracted.title,
content: extracted.content,
contentHash: createHash(extracted.content),
success: true,
};
} catch (err) {
return { url, title: '', content: '', contentHash: '', success: false, error: String(err) };
} finally {
await browser.close();
}
}