:DoubanClient 如何管好 Cookie、限速与 Referer 改写)
【免费下载链接】douban-backup命令行备份豆瓣账号的书影音游剧标记想看/在看/看过导出为与「豆伴」结构一致的 Excel。项目地址https://gitcode.com/gh_mirrors/dou/douban-backup点击查看免费下载豆瓣账号备份工具 douban-backup 是一个 Python 单文件脚本能把豆瓣的书、影、音、游、剧标记想看/在看/看过抓下来导出为与 Chrome 扩展「豆伴」结构一致的 Excel。整个工具的灵魂类就是DoubanClient——它只做了三件看似不起眼、实则决定备份成败的事Cookie 认证、请求限速、Referer 改写。本文带你逐段读懂 douban_backup.py 中这段请求层的设计。为什么需要单独一个请求层豆瓣的接口m.douban.com/rexxar/api/v2/...有三个特点需要登录态几乎所有接口都要带ck等 Cookie 才能返回数据会校验来源请求头里的Referer不符合预期时容易异常有限流连续快速请求会触发 429 甚至封禁。所以工具没有让上层代码直接requests.get()而是把这些规则收敛到一个类里。项目注释也点明了设计来源对齐原插件 background.js 的declarativeNetRequest把 Referer 改成 m.douban.com与 service.js 的requestInterval限速。Cookie 认证三种构造方式一套会话DoubanClient提供三个构造入口对应 README.md 中「Cookie 来源三选一」方式入口适用场景自动读浏览器from_browser()douban_backup.py#L123-L154本机已登录豆瓣零配置完整 cookie 串from_cookie_string()douban_backup.py#L156-L165从浏览器 F12 复制整串 Cookie仅 ck dbcl2from_ck_dbcl2()douban_backup.py#L167-L172只拿到两个关键 Cookie几个值得注意的细节自动读取的容错链from_browser()会按chrome → edge → brave → opera → chromium → firefox → safari的顺序逐个尝试任一浏览器里存在douban.com域名的 Cookie 就立即采用全部失败时把每个浏览器的错误汇总后抛出并提示改用--cookie。统一并入 Session无论哪种来源最终都是把 Cookie 写进同一个requests.Session的 cookie jar后续请求自动携带。启动即校验构造函数里调用_read_ck()L175-L179从 jar 中取出ck取不到直接抛RuntimeError并提示「cookie 中缺少 ck」。这样在真正开始抓取前就能快速失败而不是抓了几页才报错。伪装移动端Session 创建后立即写入移动端 UAMOBILE_UAL61-L64因为所有接口都是m.douban.com移动版端点UA 与域名保持一致才「像真人在手机上操作」。登录校验由checkin()L218-L237完成请求https://m.douban.com/mine/页面用 BeautifulSoup 解析#user元素拿到uid和用户名解析不到就提示「未登录豆瓣或登录已失效」。请求限速最小间隔节流支持突发豁免限速实现非常精炼就是_throttle()L181-L186def _throttle(self, continuous: bool False) - None: if continuous: return elapsed time.time() - self._last_request if elapsed self.request_interval: time.sleep(self.request_interval - elapsed)设计要点保间隔而非等固定时长记录上一次请求时刻_last_request本次请求前若距上次不足request_interval秒默认 1.0可用--interval调大就只 sleep「差值」。若上一次请求本身耗时 3 秒则本次几乎不等待——既保证最小间隔又不浪费时间。continuous 豁免开关request()接受continuousTrue参数L189-L195表示允许连续发请求不做节流。当前主流程未使用它但它为「500 降级逐条重抓」这类突发场景预留了通道。重试不吞错request()内部对requests.RequestException最多重试retries次默认 2每次失败 sleep 1 秒后重试重试耗尽则抛出最后一次异常L199-L210。超时统一 30 秒避免网络异常时脚本无限挂起。Referer 改写一个默认值解决「来源校验」request()的签名里有个容易被忽略的参数def request(self, method, url, referer: str https://m.douban.com/, ...)它用headers.setdefault(Referer, referer)L197-L198给每个请求补上Referer头默认是https://m.douban.com/。这对应了原 Chrome 扩展用declarativeNetRequest规则批量改写 Referer 的做法——扩展里要靠浏览器 API 拦截请求Python 版则直接在每个请求头里写死效果相同、实现更简单。上层还会按场景传入更精确的 Referer让请求来源与真实操作路径一致查总数https://m.douban.com/mine/get_totalL441-L444翻页抓取https://m.douban.com/mine/{type}如https://m.douban.com/mine/movie_crawl_segmentL461-L499这种「按业务路径伪造来源」的手法是让接口稳定返回 200 的关键之一。500 容错限速之外的第二道保险限速防的是「被打」容错防的是「偶发故障」。InterestTask._crawl_segment发现接口返回 HTTP 500 时会调用_crawl_sliced()L502-L522把原本一页 50 条的请求拆成 50 个count1的单条请求逐个重试仍然失败的单条直接跳过不让一条坏数据毁掉整个备份。这同样对齐了原插件的行为。小结机制实现位置作用多源 Cookie 构造 启动校验L123-L179零配置登录态快速失败移动端 UAL61-L64与 m.douban.com 端点保持一致最小间隔节流 重试L181-L210避开限流容忍网络抖动Referer 默认值 场景化改写L189-L198通过来源校验500 逐条重抓L502-L522单条失败不拖累整体DoubanClient不到 150 行却把「能不能稳定抓到数据」这件事兜住了。下一篇我们将深入Storage与InterestTaskSQLite 增量备份的 history 机制、_interest_equal的变更判定以及 14 个 sheet 的 Excel 导出是如何做到与「豆伴」逐字一致的。赞分享【免费下载链接】douban-backup命令行备份豆瓣账号的书影音游剧标记想看/在看/看过导出为与「豆伴」结构一致的 Excel。项目地址https://gitcode.com/gh_mirrors/dou/douban-backup点击查看免费下载相关推荐douban-backup 源码深度解析四openpyxl 生成 14 Sheet Excel 与 CSV 降级方案douban backup 源码深度解析四openpyxl 生成 14 Sheet Excel 与 CSV 降级方案 豆瓣备份工具 douban backdouban-backup 安全指南Cookie 保管方法与豆瓣账号限流风险规避完整教程douban backup 安全指南Cookie 保管方法与豆瓣账号限流风险规避完整教程 douban backup 是一款命令行的豆瓣账号备份工具能把你的douban-backup 常见问题大全Cookie 失效、429 限流等 10 个高频问题解决方案douban backup 常见问题大全Cookie 失效、429 限流等 10 个高频问题解决方案 使用 douban backup 豆瓣账号备份工具备上一篇Stoolap查询优化器解析基于成本的计划与自适应执行如何提速你的查询下一篇多窗口与多根工作区puppyone 桌面版窗口架构设计完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考