Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. const { chromium } = require("playwright");
  2. const path = require("path");
  3. const fs = require("fs").promises;
  4. /**
  5. * 基础爬虫类
  6. * 提供所有爬虫共用的基础功能
  7. */
  8. class BaseCrawler {
  9. constructor(config) {
  10. this.config = config;
  11. this.browser = null;
  12. this.context = null;
  13. this.page = null;
  14. }
  15. /**
  16. * 初始化浏览器
  17. * @returns {Promise<void>}
  18. */
  19. async initBrowser() {
  20. // 获取截图配置
  21. const screenshotConfig = this.config?.common?.screenshot || {};
  22. const viewportConfig = screenshotConfig.viewport || { width: 1920, height: 1080 };
  23. this.browser = await chromium.launch({
  24. headless: false,
  25. args: ["--no-sandbox", "--disable-setuid-sandbox"],
  26. });
  27. this.context = await this.browser.newContext({
  28. locale: "ja-JP",
  29. userAgent:
  30. "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
  31. // 使用配置中的视口尺寸
  32. viewport: viewportConfig
  33. });
  34. this.page = await this.context.newPage();
  35. }
  36. /**
  37. * 关闭浏览器
  38. * @returns {Promise<void>}
  39. */
  40. async closeBrowser() {
  41. if (this.browser) {
  42. await this.browser.close();
  43. this.browser = null;
  44. this.context = null;
  45. this.page = null;
  46. }
  47. }
  48. /**
  49. * 创建截图目录
  50. * @returns {Promise<string>} 截图目录路径
  51. */
  52. async createScreenshotDir() {
  53. const dir = path.join(process.cwd(), "screenshots");
  54. await fs.mkdir(dir, { recursive: true });
  55. return dir;
  56. }
  57. }
  58. module.exports = BaseCrawler;