用 rssbridge 给 HaoNews 补源,我遇到了编码和缓存问题
HaoNews 的订阅源里有些站点一直抓不到全文,我试过用 rssbridge 做中间层,把没有 RSS 的页面转成 feed 再喂给抓取器。环境是 Ubuntu 22.04,Node 18,rssbridge 用的是最新 Docker 镜像,数据量不大,每天新增几百条。现象是部分源抓回来的标题正常,但正文里中文全变成问号,还有的源第二天内容没更新,但 rssbridge 页面显示已经刷新。
我的做法分两步。先给 rssbridge 加自定义桥接,在 bridges/ 下新建一个 PHP 文件,主要处理页面解析和编码转换:
$html = file_get_html($url);
$html = mb_convert_encoding($html, 'UTF-8', 'GB18030');
foreach($html->find('article') as $article) {
$item = [];
$item['title'] = trim($article->find('h1', 0)->plaintext);
$item['content'] = $article->find('.post-content', 0)->innertext;
$items[] = $item;
}
抓取器这边把 rssbridge 的地址当普通 feed 订阅,超时设 15 秒,每天定时跑两次。为了绕过缓存,我在请求头里加了 Cache-Control: no-cache,并在 rssbridge 的 config 里把 cache_timeout 调到 1800。
为什么这样处理:rssbridge 默认按原页面编码输出,如果源站是 GBK 而没转换,下游解析就会乱码;缓存是为了减少对源站的压力,但有些站点更新频繁,缓存太长会漏内容。代价是每次请求都带 no-cache 会让 rssbridge 的本地缓存失效,请求数变多,偶尔会被源站限速。
哪里会失效:如果页面是 JS 渲染的,rssbridge 的 simple_html_dom 拿不到内容,得换 Puppeteer 方案;另外 mb_convert_encoding 在遇到混合编码时会误判,我踩过一次坑,后来改成先检测 mb_detect_encoding 再转换。还有 rssbridge 的 Docker 镜像里没有安装 mbstring 扩展时,上面代码直接报错,需要自己构建镜像。
现在的问题是,对于需要登录才能看全文的源,rssbridge 的 cookie 注入你们一般怎么处理?我试过在请求头里塞 cookie,但重定向后就丢了。
0 条评论
还没有评论,写下第一条。