Sitelet https://github.com/NanmiCoder/MediaCrawler/pull/977
Skip to content

fix(weibo): 修复搜索翻页到底时崩溃退出 - #977

Open
ybwbqg9379 wants to merge 1 commit into
NanmiCoder:mainfrom
ybwbqg9379:fix/weibo-search-pagination-end
Open

ybwbqg9379 wants to merge 1 commit into
NanmiCoder:mainfrom
ybwbqg9379:fix/weibo-search-pagination-end

Conversation

@ybwbqg9379

Copy link
Copy Markdown

问题

微博在「已无更多结果」时返回 {'ok': 0, 'msg': '这里还没有内容'},与真实接口错误共用 ok=0。

WeiboClient.request() 对 ok=0 无差别抛 DataFetchError,而它的 @retry(stop_after_attempt(5), wait_fixed(3)) 又没有排除这种情况。结果是搜索正常翻到最后一页时,会白白重试 5 次(约 12 秒),最后以 tenacity.RetryError 打穿整个爬虫进程:

{'ok': 0, 'msg': '这里还没有内容', 'data': {'cards': []}}
tenacity.RetryError: RetryError[<Future ... raised DataFetchError>]

WeiboCrawler.search() 的分页循环唯一出口是 CRAWLER_MAX_NOTES_COUNT,异常会一路冒泡到顶层,所以后面的关键词也不会再被采集。get_all_notes_by_creator_id() 的循环同样会被这个异常打穿。

改动

  • exception.py:新增 NoMoreResultsError
  • client.py:request() 区分「无更多结果」信号并抛 NoMoreResultsError,用 retry_if_not_exception_type 将其排除出重试。这与 media_platform/xhs/client.py 中已有的做法一致
  • client.py:get_all_notes_by_creator_id() 捕获后跳出,返回已采集结果
  • core.py:search() 捕获后跳出当前关键词的分页,继续下一个关键词

只匹配 这里还没有内容 这一条已被日志证实的消息,其余 ok=0 的行为完全不变,仍然按错误处理并重试。

测试

新增 tests/test_weibo_search_pagination_end.py,纯离线 mock,不访问真实平台:

  • 翻页结束时抛 NoMoreResultsError 且只请求 1 次(不重试)
  • 其他 ok=0 错误仍然重试满 5 次并抛 RetryError,内层异常仍是 DataFetchError
  • 创作者主页翻页到底时返回已采集的结果,异常不外溢
uv run pytest tests -q
99 passed

关于 #907

这个 PR 只解决 #907 中暴露出来的崩溃问题,没有解决该 issue 标题所问的「抓取全部搜索结果(含被折叠的相似结果)」——那需要调整微博搜索接口的去重参数,且必须对真实平台验证,不适合放在同一个改动里。所以这里用 Refs 而非 Fixes,issue 请保持开启。

微博对「已无更多结果」的响应是 {'ok': 0, 'msg': '这里还没有内容'},
与真实接口错误共用 ok=0。request() 无差别抛 DataFetchError,叠加
未排除该情况的 @Retry,导致正常翻到最后一页会重试 5 次后以
tenacity.RetryError 打穿整个爬虫进程。

在 request() 中区分这一信号并抛 NoMoreResultsError,将其排除出重试
(与 xhs client 既有做法一致);搜索与创作者主页两个分页循环捕获后
跳出,改为继续下一个关键词或返回已采集结果。

Refs NanmiCoder#907

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant