|
|
发表于 2025-11-5 11:01:30
|
显示全部楼层
- import asyncio
- import re
- from pyppeteer import launch
- def clean_filename(url):
- """清理URL中的非法字符,生成合法文件名"""
- # 匹配Windows/Linux/Mac中不允许的文件名字符(/ : ? * " < > | \)
- illegal_chars = r'[\/:*?"<>|\\]'
- # 用下划线替换非法字符,连续多个特殊字符合并为一个下划线
- cleaned = re.sub(illegal_chars, '_', url)
- # 移除首尾多余的下划线
- cleaned = cleaned.strip('_')
- # 限制文件名长度
- return cleaned[:100] # 保留前100个字符
- async def process_single_url(browser, url):
- """处理单个URL:生成PDF + 截取logo(用URL路径作为文件名)"""
- page = None
- try:
- # 清理URL生成合法文件名前缀
- file_prefix = clean_filename(url)
-
- # 创建新页面
- page = await browser.newPage()
- await page.setViewport({'width': 1280, 'height': 800})
-
- # 访问URL并等待加载
- print(f"\n开始处理:{url}")
- await page.goto(url, timeout=30000, waitUntil='networkidle0')
- await page.waitForSelector('body', timeout=10000)
-
- # 生成PDF(用清理后的URL作为文件名)
- pdf_path = f"{file_prefix}_page.pdf"
- await page.pdf({
- 'path': pdf_path,
- 'format': 'A4',
- 'printBackground': True,
- 'displayHeaderFooter': False,
- 'margin': {'top': '1cm', 'right': '1cm', 'bottom': '1cm', 'left': '1cm'}
- })
- print(f"✅ PDF生成成功:{pdf_path}")
-
- # 截取logo
- logo_selector = 'body .hdc a img'
- logo_path = f"{file_prefix}_logo.png"
- await page.waitForSelector(logo_selector, timeout=10000)
- logo_element = await page.querySelector(logo_selector)
- await logo_element.screenshot({'path': logo_path})
- print(f"✅ Logo截图成功:{logo_path}")
-
- except Exception as e:
- print(f"❌ 处理{url}失败:{str(e)}")
- finally:
- if page:
- await page.close()
- async def main():
- # 批量处理的URL列表
- urls = [
- 'https://fishc.com.cn',
- 'https://fishc.com.cn/forum.php?mod=collection', # 淘帖
- 'https://fishc.com.cn/forum.php?mod=guide' # 导读
- ]
-
- browser = None
- try:
- browser = await launch(
- headless=True,
- executablePath=r'C:\Program Files\Google\Chrome\Application\chrome.exe',
- )
-
- for url in urls:
- await process_single_url(browser, url)
-
- except Exception as e:
- print(f"浏览器启动错误:{e}")
- finally:
- if browser:
- await browser.close()
- print("\n批量处理完成!")
- if __name__ == '__main__':
- asyncio.run(main())
复制代码 |
|