如何用Wget的--accept-regex参数镜像GitHub PR页面
问题分析与解决方法
核心问题原因
- 正则锚定过严:你的正则使用
$锚定URL结尾,但GitHub页面中的链接可能包含额外参数(如排序参数)或参数顺序与预设不同,导致匹配失败。 - 参数顺序不固定:GitHub的分页链接参数顺序可能变化(如
q=...&page=2而非page=2&q=...),原正则仅匹配固定顺序的参数,导致漏抓。 - 正则引擎差异:Wget使用POSIX扩展正则(ERE),与regex101默认的PCRE语法存在差异,部分转义规则处理不同。
修正后的脚本
调整正则规则,放宽锚定限制,兼容参数顺序变化,并适配Wget的ERE语法:
#!/usr/bin/env python3 import subprocess accept_regex = "|".join([ # 匹配开放PR列表页(含第一页及所有分页) r'\/pulls(?:\?page=\d+)?$', # 匹配关闭PR列表页(含第一页及任意分页,兼容参数顺序) r'\/pulls\?(?:q=is%3Apr\+is%3Aclosed(?:&page=\d+)?|page=\d+&q=is%3Apr\+is%3Aclosed)$', # 匹配单个PR页面(允许URL末尾带额外参数) r'\/pull\/\d+', ]) subprocess.run( [ "wget", "--verbose", "--mirror", f"--accept-regex={accept_regex}", "--wait=1", "--random-wait", "--tries=inf", "--waitretry=3600", "--retry-connrefused", "--retry-on-host-error", "--retry-on-http-error=429", "--convert-links", "--adjust-extension", # 若不需要页面依赖资源(如CSS/JS),可移除--page-requisites "--page-requisites", "--xattr", "--directory-prefix=site", "--append-output=wget_logfile", "--backups=99", "https://github.com/seanh/oatcake", ] )
额外优化建议
- 测试正则匹配:用Wget的
--spider模式验证单条URL是否被匹配,避免依赖regex101的PCRE结果:wget --accept-regex="YOUR_REGEX" --spider --verbose "https://github.com/seanh/oatcake/pulls?page=2&q=is%3Apr+is%3Aclosed" - 减少无关请求:若不需要页面样式、脚本等资源,删除
--page-requisites参数,避免抓取无关内容。 - 限制域名范围:添加
--domains=github.com,防止Wget抓取页面中指向其他域名的链接。
内容的提问来源于stack exchange,提问作者Sean Hammond
相关产品推荐
相关产品推荐

