深入PyWebCopy配置系统:ConfigHandler与get_config的10个关键参数详解
【免费下载链接】pywebcopyLocally saves webpages to your hard disk with images, css, js & links as is.项目地址: https://gitcode.com/gh_mirrors/py/pywebcopy
PyWebCopy 是一款免费的 Python 网站复制工具,能把包含图片、CSS、JS 和链接的网页完整保存到你的本地硬盘,实现离线浏览。它的每一项行为都由配置系统驱动——核心就是get_config工厂函数和ConfigHandler配置容器。搞懂这 10 个关键参数,你就掌握了 PyWebCopy 网站的完整控制能力 🎯
一、为什么先搞懂 PyWebCopy 配置系统?
PyWebCopy 的工作流程非常直观:读取配置 → 创建抓取器 → 扫描网页 → 下载资源 → 重写链接。
其中第一步"读取配置"就藏在 pywebcopy/configs.py 里。官方两个最常用入口save_webpage(存单页)和save_website(存整站),本质上都是这样工作的:
from pywebcopy import save_website save_website( url="https://httpbin.org/", project_folder="E://savedpages//", project_name="my_site", bypass_robots=True, debug=True, delay=None, threaded=False, )你传入的每个参数,都会被转交给get_config处理,最终生成一个ConfigHandler实例,再从中创建 Session(网络会话)、Context(路径上下文)和 Crawler(爬虫)。想理解"我传的参数到底影响了什么",这篇指南就是最好的入口。
二、get_config 的10个关键参数逐个详解
get_config的定义位于 pywebcopy/configs.py,它的完整签名如下:
def get_config(project_url, project_folder=None, project_name=None, bypass_robots=False, debug=False, delay=None, threaded=None):直接暴露的有 7 个参数,另外 3 个(overwrite、tree_type、http_headers)则通过default_config内置提供。下面逐一详解。
1️⃣ project_url —— 复制任务的起点(必填)
这是唯一没有默认值的参数,也是整个项目的"种子"。所有后续下载都以它为基准 URL 展开。
- 必须是字符串,否则抛出
ConfigError(见 configs.py L266-L267) - 它会被
get_host解析,用来自动生成项目名
💡新手提示:传首页 URL 会爬整站,传具体文章页则主要保存该页及其资源。
2️⃣ project_folder —— 文件保存到哪
指定下载文件存放的目录路径。关键点:
- 不传时默认使用系统临时目录(
tempfile.gettempdir()),见 configs.py L271-L273 - 内部会调用
setup_paths做路径规范化:转换成绝对路径、统一分隔符,并自动创建目录(configs.py L151-L189)
3️⃣ project_name —— 项目文件夹命名
用来区分不同抓取项目的目录名。不传时,PyWebCopy 会从 URL 自动生成,例如http://localhost:5000会生成http_localhost_5000(可参考测试用例 test_configs.py L52-L57)。最终存储路径是project_folder/project_name。
4️⃣ bypass_robots —— 是否遵守 robots.txt
False(默认):遵守网站的 robots.txt 爬虫规则True:绕过限制,抓取被禁止的路径
它的实现原理很巧妙:在 session.py 的 from_config 中,ans.follow_robots_txt = not config.get('bypass_robots')——也就是说 Session 会实时检查每个请求是否被允许,被禁止的请求直接抛出UrlDisallowed异常。
⚠️礼貌抓取建议:除非有正当理由,否则保持默认值,尊重目标网站的爬虫协议。
5️⃣ debug —— 打开深度调试日志
设为True时,setup_config会调用add_stderr_logger向标准错误流输出 DEBUG 级别日志(configs.py L213-L218),你会看到每一次请求的 URL、被 robots 拦截的记录等细节。排查"为什么没抓到某个页面"时,这是第一件要做的事。
6️⃣ delay —— 请求间隔防过载
数值表示两次并发请求同一服务器之间的延迟秒数。它直接赋给 Session 的delay属性(session.py L219)。
- 爬大站时建议设为
0.5~2,避免给目标服务器造成压力 - 配合多线程使用时,
delay能有效平滑请求频率
7️⃣ threaded —— 多线程加速下载
启用后,WebPage和Crawler会以线程池方式并行下载资源(core.py 的 from_config)。
⚡注意:源码注释明确指出 "it can break some site"——部分网站对并发敏感,可能返回不完整内容。且开启线程后不支持"完成后自动打开浏览器"(会触发警告,见init.py L109-L113)。
8️⃣ overwrite —— 是否覆盖已存在的文件
位于default_config中(configs.py L88),默认False。当本地已存在同名文件时:
False:跳过下载,节省流量(增量更新利器)True:重新下载并覆盖
二次爬取同一站点时,默认行为会自动跳过已保存的资源。
9️⃣ tree_type —— 本地目录树结构
控制下载文件的目录组织方式,取值为HIERARCHY(层级结构,默认)或LINEAR(扁平结构),定义在 urls.py L391。
- HIERARCHY:镜像原始网站的 URL 路径层级,
/css/style.css就存到css/style.css - LINEAR:所有文件平铺在根目录,按内容类型归类
想修改它?拿到 config 对象后直接赋值:
config = get_config('https://example.com') config['tree_type'] = 'LINEAR'🔟 http_headers —— 自定义 HTTP 请求头
默认值来自safe_http_headers(configs.py L70-L75),包含一个伪装成 Firefox 浏览器的User-Agent和Accept-Language。
典型用途是携带 Cookie 登录后再抓取(session.py L217 中 headers 会直接应用到 Session):
config = get_config('https://example.com') config['http_headers'] = { 'Cookie': 'session=abc123', 'User-Agent': 'Mozilla/5.0 ...' }顺带一提,default_config里还有http_cache(开启 HTTP 缓存适配器)和thread_join_timeout两个进阶开关,日常使用可忽略。
三、ConfigHandler 的魔法:get_xxx 与 set_xxx
ConfigHandler继承自CaseInsensitiveDict(键名不区分大小写),但真正的亮点是getattribute方法:它动态为每个配置键生成get_键名和set_键名方法。
这意味着访问配置有等价三种写法:
config.get('project_url') # 字典方式 config['project_url'] # 下标方式 config.get_project_url() # 属性方法方式(动态生成) config.set_delay(1) # 动态 setterConfigHandler还提供了一组"配置到对象"的工厂方法(configs.py L220-L242):
| 工厂方法 | 创建的对象 | 典型用途 |
|---|---|---|
create_context() | Context | URL ↔ 本地路径转换 |
create_session() | Session | 带 robots 检查的 HTTP 会话 |
create_page() | WebPage | 保存单个网页 |
create_crawler() | Crawler | 爬取整个网站 |
所有方法都会先校验is_set()——即project_url、project_name、project_folder三项必填齐全,否则抛出ConfigError。
四、新手快速上手:从配置到成品
完整的调用链路只有三步,以保存单页为例(init.py L68-L113):
from pywebcopy.configs import get_config # 第1步:创建配置对象 config = get_config('https://httpbin.org/', project_folder='E://savedpages//', project_name='my_site', debug=True) # 第2步:由配置创建页面抓取器 page = config.create_page() # 第3步:执行抓取并保存,完成后自动打开浏览器 page.get(config['project_url']) page.save_complete(pop=True)更复杂的场景(登录、填表单)也能基于同一套配置完成,README 中有现成示例可参考(README.md 认证章节)。
五、常见问题 FAQ 🧩
Q1:不写 project_folder 时文件去哪了?A:系统临时目录(Windows 上是C:\Users\你\AppData\Local\Temp)。建议始终显式指定,避免文件"失踪"。
Q2:为什么有些页面没被抓下来?A:按顺序排查——① 是否被 robots.txt 拦截(开debug=True看日志);② 链接是否由 JavaScript 动态生成(PyWebCopy 不执行 JS,无法发现这类链接);③ 目标服务器是否限流。
Q3:二次抓取会重复下载吗?A:不会。默认overwrite=False时,已存在的文件会被跳过,实现增量更新。
Q4:如何查看完整的配置项列表?A:直接查看default_config字典(configs.py L78-L99),这是所有可用键的"总表"。
写在最后
PyWebCopy 的配置系统把"存哪、叫什么、怎么爬、爬多快"全部收敛到 10 个参数里,get_config负责组装,ConfigHandler负责分发,设计简洁而完整。建议配合 pywebcopy/tests/test_configs.py 中的测试用例对照阅读,能帮助你直观看到每个参数的实际效果。祝离线归档愉快!📚
【免费下载链接】pywebcopyLocally saves webpages to your hard disk with images, css, js & links as is.项目地址: https://gitcode.com/gh_mirrors/py/pywebcopy
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考