
1. 为什么需要爬取Flbook文档图片最近在技术社区看到不少人在讨论Flbook这个在线文档平台很多朋友遇到一个共同痛点明明可以免费阅读的文档却找不到下载按钮。我上周刚好帮同事解决类似问题他们需要批量保存某行业报告作为参考资料但手动截图效率太低。这种场景下用Selenium自动化工具就能完美解决需求。Flbook的文档展示方式比较特殊它把每页内容渲染成图片形式呈现。这种设计虽然保证了版式统一但也给需要离线阅读的用户带来不便。我测试过几种常见方案发现直接爬取图片再合成PDF是最稳定的方法。相比传统爬虫抓取文本这种方式能100%保留原始排版效果特别适合需要保持文档原貌的场景。2. 环境准备与基础配置2.1 安装必要的软件包首先需要准备Python环境我推荐使用3.8版本。核心依赖库就三个pip install selenium pillow PyPDF2其中Pillow用来处理图片PyPDF2负责最终合并PDF。这里有个容易踩的坑不同版本的Pillow对图片格式支持有差异建议用最新版。浏览器驱动方面实测ChromeDriver兼容性最好。下载时要注意与本地Chrome版本匹配我电脑装的Chrome 114就对应114.x.x版本的驱动。把解压后的chromedriver.exe放在项目目录下或者添加到系统PATH环境变量里。2.2 初始化Selenium配置建议创建浏览器实例时就加上这些参数能避免很多后续问题from selenium import webdriver from selenium.webdriver.chrome.options import Options options Options() options.add_argument(--headless) # 无头模式 options.add_argument(--disable-gpu) # 避免GPU渲染问题 options.add_argument(--window-size2560,1440) # 设置高分辨率 driver webdriver.Chrome(optionsoptions)特别注意窗口尺寸设置这直接关系到截图清晰度。我测试发现15360x3600这个夸张的尺寸虽然能获得超清图片但会显著增加内存占用折中方案是用2560x1440。3. 精准定位与截图技巧3.1 元素定位的实战经验Flbook的页面结构比较规整文档内容通常包含在特定class的div里。通过开发者工具分析我发现大多数文档都放在class为shadow的容器内。用XPath定位时建议这样写content driver.find_element_by_xpath(//div[contains(class,shadow)])这里用contains而不是直接等于能提高容错性。如果页面有多个shadow类元素可以加上父级限制//*[idviewer]//div[contains(class,shadow)]3.2 高质量截图的关键参数很多人反映截图模糊其实有几个技巧先执行JavaScript确保文档完全加载driver.execute_script(window.scrollTo(0, document.body.scrollHeight)) time.sleep(1) # 留出滚动时间截图时指定元素而非全屏content.screenshot(page.png) # 直接对元素截图如果还是不够清晰可以尝试缩放页面driver.execute_script(document.body.style.zoom1.5)4. 自动化流程优化方案4.1 智能翻页处理Flbook的翻页有两种形式页码直接跳转和左右箭头。更可靠的方式是直接构造URLbase_url https://flbook.com.cn/c/ZvzVFHIeih#page/ for page in range(1, total_pages1): driver.get(f{base_url}{page}) time.sleep(1.5) # 适当等待等待时间很关键太短可能导致页面未加载完。我建议配合显式等待from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.CLASS_NAME, shadow)) )4.2 图片转PDF的完整流程获取所有图片后用这个函数合并成PDFfrom PIL import Image from PyPDF2 import PdfMerger def images_to_pdf(image_folder, output_pdf): images [img for img in os.listdir(image_folder) if img.endswith(.png)] images.sort(keylambda x: int(x.split(.)[0])) # 按数字排序 merger PdfMerger() for img in images: img_path os.path.join(image_folder, img) image Image.open(img_path) pdf_path img_path.replace(.png, .pdf) image.save(pdf_path, PDF, resolution100.0) merger.append(pdf_path) merger.write(output_pdf) merger.close()这个方案先用Pillow把每张图转成单页PDF再用PyPDF2合并。相比其他方法能更好地保持图片质量。5. 常见问题与解决方案5.1 反爬机制应对策略最近Flbook增加了简单的反爬措施我的应对方案是随机User-Agentoptions.add_argument(fuser-agent{random.choice(user_agents)})请求间隔随机化time.sleep(random.uniform(1, 3))使用代理IP需自行准备可靠代理服务5.2 提升处理效率的技巧当文档页数较多时超过50页建议启用多线程处理但要注意线程数不要超过5个复用浏览器实例而不是每页新建图片压缩与PDF优化image image.convert(RGB) # 减少颜色通道 image.save(pdf_path, PDF, quality85) # 适当压缩6. 进阶优化方向对于需要频繁使用的场景可以考虑这些增强功能自动识别总页数通过解析页面底部的页码元素异常自动重试机制网络波动时的自动恢复日志记录系统记录成功/失败的页面生成书签目录利用PyPDF2添加PDF导航我最近在项目中加入了自动邮件发送功能当PDF生成完成后自动发送到指定邮箱。这些扩展都能基于现有代码轻松实现让整个工具更加实用。