主题
找资源不用开浏览器
我以前找片子/找文件是"打开一个资源站 → 搜索 → 翻列表 → 复制链接"。这动作一天做三次,就值得自动化了。
第一反应是上浏览器自动化(无头 Chrome 驱动点击)。这是个陷阱:慢、脆、还容易被反爬。大多数资源站其实一个 curl 就够。
判断标准:需不需要浏览器
先花 30 秒判断,能省半天:
bash
curl -s -o /tmp/page.html -w '%{http_code}\n' "https://<站点>/search?q=test"
grep -c "magnet:\?xt=urn:btih" /tmp/page.html- HTML 里直接有结果 → 用 HTTP + 正则,别开浏览器
- HTML 是空壳(只有
<div id="app">) → 内容是 JS 渲染的,要么找它的 JSON 接口,要么只能上浏览器 - 返回 403 / 人机验证页 → 需要 cookie 或者过验证,浏览器更省事
我遇到的磁力站基本都是第一种:服务端渲染,结果直接在 HTML 里。这种站用浏览器自动化是纯浪费——启动 Chrome 十秒,一个 curl 20 毫秒。
找 URL 模式的通用方法
资源站的搜索页几乎都是"路径 + 查询参数"这种结构,几个常见形态:
/search?q=<关键词>
/search?q=<关键词>&p=<页码>
/search/<关键词>/1.html
/?s=<关键词>怎么确定是哪种:在站点上搜一次,然后看地址栏。就这么简单——你要的信息它已经显示给你了。
带分页的话,翻到第 2 页再看一次地址栏,对比出页码参数名(常见 p / page / /2/)。拿到这个规律,就能批量跑:
python
from urllib.parse import quote
def search(keyword, pages=3):
out = []
for p in range(1, pages + 1):
url = f"https://<站点>/search?q={quote(keyword)}&p={p}"
html = http_get(url)
out += re.findall(r'magnet:\?xt=urn:btih:[A-Za-z0-9]{32,40}[^"\'<\s]*', html)
return dedupe(out)三个细节:
quote()必须用。中文关键词不编码,服务端可能返回 400 或者空结果- 页数 3 页封顶。再多基本是重复和低质源
- 去重。同一资源会被不同用户重复发布,info hash 相同就是同一个种子
解析结果:元信息在标题里
磁力链接本身只有哈希(见这篇),但显示名称里塞满了信息:
[高清剧集网 www.xxx.com]华灯初上 第二季[全8集][中文字幕][2021][WEB-DL][1080p]用正则把这些拆出来,就能按条件筛选:
python
def parse(title):
return {
"res": "2160p" if "2160" in title else "1080p" if "1080" in title else "?",
"sub": "中字" in title or "字幕" in title,
"eps": (m := re.search(r"全(\d+)集", title)) and m.group(1),
"free": ("国英" in title) or ("双语" in title),
"site": (m := re.match(r"\[([^\]]+)\]", title)) and m.group(1),
}站名标签很有用:同一个片子,不同压制组/搬运站的资源质量差异巨大。跑几次你就会知道哪几个标签是"能下、画质好、有中字",直接按标签白名单筛。
资源站的两个现实问题
1. 域名会换
这类站换域名是常态。所以不要把域名写死在代码里,至少抽成一个配置项;脚本里判断"搜不到结果"和"站点打不开"要分开:
python
code = http_code(url)
if code == 0:
raise RuntimeError("站点不通(挂了/被墙/域名换了)")
if code >= 400:
raise RuntimeError(f"站点返回 {code}(可能要 cookie 或验证)")
if not results:
raise NotFound("站点通了,但没这个资源")这三种情况的处理方式完全不同,混在一起就会得出"这个片子网上没有"的错误结论——而实际上只是域名换了。
2. 有的站需要代理
出墙判断很简单:
bash
# 直连
curl -s -o /dev/null -m 8 -w '直连: %{http_code}\n' "https://<站点>/"
# 走代理
curl -s -o /dev/null -m 8 -x http://127.0.0.1:7890 -w '代理: %{http_code}\n' "https://<站点>/"我踩过的最蠢的坑:只看了一个站直连不通,就得出"外网不通"的结论。实际是国内站直连都好好的,只有境外站需要代理。分站判断,别一刀切。
反过来也成立:国内资源站挂代理反而更慢,甚至被拦。所以脚本里应该按站点配置"要不要代理",而不是全局开关。
网盘资源是另一种玩法
如果目标是网盘文件(不是 BT),逻辑不同:搜索 → 拿到分享链接 + 提取码 → 转存到自己网盘。
同样先看能不能 curl:
bash
curl -s -o /tmp/r.html -w '%{http_code}\n' "https://<网盘搜索站>/search?q=<关键词>"
grep -oE 'https://pan\.[a-z]+\.com/s/[A-Za-z0-9_-]+' /tmp/r.html | head
grep -oE '提取码[::]\s*[a-zA-Z0-9]{4}' /tmp/r.html | head能抓到分享链接和提取码,就不用浏览器。抓不到再看是不是 JS 渲染。
什么时候浏览器真的必要
三种情况,我认:
- 内容是 JS 渲染且找不到 JSON 接口
- 需要登录态 + 有反爬(指纹/验证码)
- 要点才能出结果(比如必须先选分类下拉)
即使这样,也可以用"半自动":浏览器只负责拿到结果页的 HTML,抓取/解析还在脚本里。把"必须交互的那一步"缩到最小,剩下的都留在脚本里。
检查清单
curl一下,看 HTML 里有没有目标内容 —— 有就别开浏览器- 在界面上搜一次,读地址栏,确定 URL 模式
- 中文关键词必须
quote() - 分页 3 页封顶,结果按 info hash 去重
- 把"站点不通 / 返回错误码 / 真没资源"三种情况分开处理
- 代理按站点配置,别全局开
一句话版本:先
curl再决定要不要浏览器。资源站基本是服务端渲染,正则抓磁力就够了;把"没搜到"和"站点挂了"分开报,能省掉一半误判。