MediaCrawler icon indicating copy to clipboard operation
MediaCrawler copied to clipboard

响应头中缺少'Verifytype'字段导致无法爬取小红书

Open 000LimitedLiabilityCompany000 opened this issue 1 month ago • 18 comments

⚠️ 提交前确认

  • [√ ] 我已经仔细阅读了项目使用过程中的常见问题汇总
  • [√ ] 我已经搜索并查看了已关闭的issues
  • [ √] 我确认这不是由于滑块验证码、Cookie过期、Cookie提取错误、平台风控等常见原因导致的问题

❓ 问题描述

爬取小红书遇到了无法爬取的问题,如果是未登录状态,登录后会报错退出。再次打开爬取会出现小红书账号已经登录,但是程序继续等待登录窗出现的问题。

🔍 使用场景

  • 目标平台:小红书
  • 使用功能:关键词搜索

💻 环境信息

  • 操作系统: windows11
  • Python版本: 3.14.0
  • 是否使用IP代理: 否
  • 是否使用VPN翻墙软件:否
  • 目标平台(抖音/小红书/微博等): 小红书

📋 错误日志

PS E:\tools\MediaCrawler> uv run E:\tools\MediaCrawler\main.py
2025-11-24 15:04:01 MediaCrawler INFO (core.py:74) - [XiaoHongShuCrawler] 使用CDP模式启动浏览器
2025-11-24 15:04:06 MediaCrawler INFO (cdp_browser.py:142) - [CDPBrowserManager] 检测到浏览器: Google Chrome (Unknown Version)
2025-11-24 15:04:06 MediaCrawler INFO (cdp_browser.py:145) - [CDPBrowserManager] 浏览器路径: C:\Program Files\Google\Chrome\Application\chrome.exe
2025-11-24 15:04:06 MediaCrawler INFO (cdp_browser.py:185) - [CDPBrowserManager] 用户数据目录: E:\tools\MediaCrawler\browser_data\cdp_xhs_user_data_dir
2025-11-24 15:04:06 MediaCrawler INFO (browser_launcher.py:163) - [BrowserLauncher] 启动浏览器: C:\Program Files\Google\Chrome\Application\chrome.exe
2025-11-24 15:04:06 MediaCrawler INFO (browser_launcher.py:164) - [BrowserLauncher] 调试端口: 9222
2025-11-24 15:04:06 MediaCrawler INFO (browser_launcher.py:165) - [BrowserLauncher] 无头模式: False
2025-11-24 15:04:06 MediaCrawler INFO (browser_launcher.py:195) - [BrowserLauncher] 等待浏览器在端口 9222 上准备就绪...
2025-11-24 15:04:07 MediaCrawler INFO (browser_launcher.py:204) - [BrowserLauncher] 浏览器已在端口 9222 上准备就绪
2025-11-24 15:04:08 MediaCrawler INFO (cdp_browser.py:159) - [CDPBrowserManager] CDP端口 9222 可访问
2025-11-24 15:04:08 MediaCrawler INFO (cdp_browser.py:78) - [CDPBrowserManager] 清理处理器已注册
2025-11-24 15:04:08 MediaCrawler INFO (cdp_browser.py:223) - [CDPBrowserManager] 获取到浏览器WebSocket URL: ws://localhost:9222/devtools/browser/87681267-8d29-4f86-b019-77ef721d6d47
2025-11-24 15:04:08 MediaCrawler INFO (cdp_browser.py:242) - [CDPBrowserManager] 正在通过CDP连接到浏览器: ws://localhost:9222/devtools/browser/87681267-8d29-4f86-b019-77ef721d6d47
2025-11-24 15:04:09 MediaCrawler INFO (cdp_browser.py:248) - [CDPBrowserManager] 成功连接到浏览器
2025-11-24 15:04:09 MediaCrawler INFO (cdp_browser.py:249) - [CDPBrowserManager] 浏览器上下文数量: 1
2025-11-24 15:04:09 MediaCrawler INFO (cdp_browser.py:274) - [CDPBrowserManager] 使用现有的浏览器上下文
2025-11-24 15:04:09 MediaCrawler INFO (core.py:437) - [XiaoHongShuCrawler] CDP浏览器信息: {'version': '142.0.7444.163', 'contexts_count': 1, 'debug_port': 9222, 'is_connected': True}
2025-11-24 15:04:11 MediaCrawler INFO (core.py:359) - [XiaoHongShuCrawler.create_xhs_client] Begin create xiaohongshu API client ...
2025-11-24 15:04:11 MediaCrawler INFO (client.py:230) - [XiaoHongShuClient.pong] Begin to pong xhs...
2025-11-24 15:04:15 MediaCrawler ERROR (client.py:237) - [XiaoHongShuClient.pong] Ping xhs failed: RetryError[<Future at 0x14c5abbd350 state=finished raised DataFetchError>], and try to login again...
2025-11-24 15:04:15 MediaCrawler INFO (login.py:71) - [XiaoHongShuLogin.begin] Begin login xiaohongshu ...
2025-11-24 15:04:15 MediaCrawler INFO (login.py:151) - [XiaoHongShuLogin.login_by_qrcode] Begin login xiaohongshu by qrcode ...
2025-11-24 15:04:16 MediaCrawler INFO (login.py:184) - [XiaoHongShuLogin.login_by_qrcode] waiting for scan code login, remaining time is 120s
2025-11-24 15:04:31 MediaCrawler INFO (login.py:192) - [XiaoHongShuLogin.login_by_qrcode] Login successful then wait for 5 seconds redirect ...
2025-11-24 15:04:36 MediaCrawler INFO (core.py:127) - [XiaoHongShuCrawler.search] Begin search xiaohongshu keywords
2025-11-24 15:04:36 MediaCrawler INFO (core.py:134) - [XiaoHongShuCrawler.search] Current search keyword: 河北冬季旅游线路推荐
2025-11-24 15:04:36 MediaCrawler INFO (core.py:144) - [XiaoHongShuCrawler.search] search xhs keyword: 河北冬季旅游线路推荐, page: 1
2025-11-24 15:04:39 MediaCrawler INFO (cdp_browser.py:374) - [CDPBrowserManager] 浏览器连接已断开
2025-11-24 15:04:39 MediaCrawler INFO (browser_launcher.py:255) - [BrowserLauncher] 正在关闭浏览器进程...
2025-11-24 15:04:39 MediaCrawler INFO (browser_launcher.py:285) - [BrowserLauncher] 浏览器进程已关闭
Traceback (most recent call last):
  File "E:\tools\MediaCrawler\.venv\Lib\site-packages\tenacity\_asyncio.py", line 50, in __call__
    result = await fn(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\tools\MediaCrawler\media_platform\xhs\client.py", line 142, in request
    verify_type = response.headers["Verifytype"]
                  ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^
  File "E:\tools\MediaCrawler\.venv\Lib\site-packages\httpx\_models.py", line 302, in __getitem__
    raise KeyError(key)
KeyError: 'Verifytype'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "E:\tools\MediaCrawler\main.py", line 154, in <module>
    asyncio.get_event_loop().run_until_complete(main())
  File "C:\Users\Lenovo\AppData\Roaming\uv\python\cpython-3.11.14-windows-x86_64-none\Lib\asyncio\base_events.py", line 654, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "E:\tools\MediaCrawler\main.py", line 85, in main
    await crawler.start()
  File "E:\tools\MediaCrawler\media_platform\xhs\core.py", line 113, in start
    await self.search()
  File "E:\tools\MediaCrawler\media_platform\xhs\core.py", line 147, in search
    notes_res = await self.xhs_client.get_note_by_keyword(
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\tools\MediaCrawler\media_platform\xhs\client.py", line 286, in get_note_by_keyword
    return await self.post(uri, data)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\tools\MediaCrawler\media_platform\xhs\client.py", line 195, in post
    return await self.request(
           ^^^^^^^^^^^^^^^^^^^
  File "E:\tools\MediaCrawler\.venv\Lib\site-packages\tenacity\_asyncio.py", line 88, in async_wrapped
    return await fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\tools\MediaCrawler\.venv\Lib\site-packages\tenacity\_asyncio.py", line 47, in __call__
    do = self.iter(retry_state=retry_state)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "E:\tools\MediaCrawler\.venv\Lib\site-packages\tenacity\__init__.py", line 326, in iter
    raise retry_exc from fut.exception()
tenacity.RetryError: RetryError[<Future at 0x14c5ac45d90 state=finished raised KeyError>]

📷 错误截图

Image

出现滑块验证了

NanmiCoder avatar Nov 24 '25 07:11 NanmiCoder

出现滑块验证了

并不是,我打开的浏览器界面并没有发现滑块验证。

出现滑块验证了

并不是,我打开的浏览器界面并没有发现滑块验证。

接口触发验证了,可能xhs又更新风控了,待处理,从下面的逻辑看就是的

https://github.com/NanmiCoder/MediaCrawler/blob/1da347cbf813ae288baeec2683eee71cbc4cc37a/media_platform/xhs/client.py#L140-L146

NanmiCoder avatar Nov 24 '25 07:11 NanmiCoder

出现滑块验证了

出现上面的问题后,我重新运行。能保留登录状态,但是为什么程序还是要求登录啊?

PS E:\tools\MediaCrawler> uv run main.py 2025-11-24 15:45:25 MediaCrawler INFO (core.py:74) - [XiaoHongShuCrawler] 使用CDP模式启动浏览器 2025-11-24 15:45:30 MediaCrawler INFO (cdp_browser.py:142) - [CDPBrowserManager] 检测到浏览器: Google Chrome (Unknown Version) 2025-11-24 15:45:30 MediaCrawler INFO (cdp_browser.py:145) - [CDPBrowserManager] 浏览器路径: C:\Program Files\Google\Chrome\Application\chrome.exe 2025-11-24 15:45:30 MediaCrawler INFO (cdp_browser.py:185) - [CDPBrowserManager] 用户数据目录: E:\tools\MediaCrawler\browser_data\cdp_xhs_user_data_dir 2025-11-24 15:45:30 MediaCrawler INFO (browser_launcher.py:163) - [BrowserLauncher] 启动浏览器: C:\Program Files\Google\Chrome\Application\chrome.exe 2025-11-24 15:45:30 MediaCrawler INFO (browser_launcher.py:164) - [BrowserLauncher] 调试端口: 9222 2025-11-24 15:45:30 MediaCrawler INFO (browser_launcher.py:165) - [BrowserLauncher] 无头模式: False 2025-11-24 15:45:30 MediaCrawler INFO (browser_launcher.py:195) - [BrowserLauncher] 等待浏览器在端口 9222 上准备就绪... 2025-11-24 15:45:30 MediaCrawler INFO (browser_launcher.py:204) - [BrowserLauncher] 浏览器已在端口 9222 上准备就绪 2025-11-24 15:45:31 MediaCrawler INFO (cdp_browser.py:159) - [CDPBrowserManager] CDP端口 9222 可访问 2025-11-24 15:45:31 MediaCrawler INFO (cdp_browser.py:78) - [CDPBrowserManager] 清理处理器已注册 2025-11-24 15:45:32 MediaCrawler INFO (cdp_browser.py:223) - [CDPBrowserManager] 获取到浏览器WebSocket URL: ws://localhost:9222/devtools/browser/87d60bc8-13cf-42bf-8fac-3c3809a4f9a1 2025-11-24 15:45:32 MediaCrawler INFO (cdp_browser.py:242) - [CDPBrowserManager] 正在通过CDP连接到浏览器: ws://localhost:9222/devtools/browser/87d60bc8-13cf-42bf-8fac-3c3809a4f9a1 2025-11-24 15:45:32 MediaCrawler INFO (cdp_browser.py:248) - [CDPBrowserManager] 成功连接到浏览器 2025-11-24 15:45:32 MediaCrawler INFO (cdp_browser.py:249) - [CDPBrowserManager] 浏览器上下文数量: 1 2025-11-24 15:45:32 MediaCrawler INFO (cdp_browser.py:274) - [CDPBrowserManager] 使用现有的浏览器上下文 2025-11-24 15:45:32 MediaCrawler INFO (core.py:437) - [XiaoHongShuCrawler] CDP浏览器信息: {'version': '142.0.7444.163', 'contexts_count': 1, 'debug_port': 9222, 'is_connected': True} 2025-11-24 15:45:35 MediaCrawler INFO (core.py:359) - [XiaoHongShuCrawler.create_xhs_client] Begin create xiaohongshu API client ... 2025-11-24 15:45:35 MediaCrawler INFO (client.py:230) - [XiaoHongShuClient.pong] Begin to pong xhs... 2025-11-24 15:45:37 MediaCrawler ERROR (client.py:237) - [XiaoHongShuClient.pong] Ping xhs failed: RetryError[<Future at 0x23866cd9ad0 state=finished raised KeyError>], and try to login again... 2025-11-24 15:45:37 MediaCrawler INFO (login.py:71) - [XiaoHongShuLogin.begin] Begin login xiaohongshu ... 2025-11-24 15:45:37 MediaCrawler INFO (login.py:151) - [XiaoHongShuLogin.login_by_qrcode] Begin login xiaohongshu by qrcode ... Page.wait_for_selector: Timeout 30000ms exceeded. Call log: waiting for locator("//img[@class='qrcode-img']") to be visible

2025-11-24 15:46:07 MediaCrawler INFO (login.py:160) - [XiaoHongShuLogin.login_by_qrcode] login failed , have not found qrcode please check .... 2025-11-24 15:46:38 MediaCrawler INFO (cdp_browser.py:374) - [CDPBrowserManager] 浏览器连接已断开 2025-11-24 15:46:38 MediaCrawler INFO (browser_launcher.py:255) - [BrowserLauncher] 正在关闭浏览器进程... 2025-11-24 15:46:38 MediaCrawler INFO (browser_launcher.py:285) - [BrowserLauncher] 浏览器进程已关闭 Traceback (most recent call last): File "E:\tools\MediaCrawler\main.py", line 154, in asyncio.get_event_loop().run_until_complete(main()) File "C:\Users\Lenovo\AppData\Roaming\uv\python\cpython-3.11.14-windows-x86_64-none\Lib\asyncio\base_events.py", line 654, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "E:\tools\MediaCrawler\main.py", line 85, in main await crawler.start() File "E:\tools\MediaCrawler\media_platform\xhs\core.py", line 107, in start await login_obj.begin() File "E:\tools\MediaCrawler\media_platform\xhs\login.py", line 73, in begin await self.login_by_qrcode() File "E:\tools\MediaCrawler\media_platform\xhs\login.py", line 164, in login_by_qrcode await login_button_ele.click() File "E:\tools\MediaCrawler.venv\Lib\site-packages\playwright\async_api_generated.py", line 15046, in click await self._impl_obj.click( File "E:\tools\MediaCrawler.venv\Lib\site-packages\playwright_impl_locator.py", line 156, in click return await self._frame.click(self._selector, strict=True, **params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\tools\MediaCrawler.venv\Lib\site-packages\playwright_impl_frame.py", line 488, in click await self._channel.send("click", locals_to_params(locals())) File "E:\tools\MediaCrawler.venv\Lib\site-packages\playwright_impl_connection.py", line 59, in send return await self._connection.wrap_api_call( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\tools\MediaCrawler.venv\Lib\site-packages\playwright_impl_connection.py", line 514, in wrap_api_call raise rewrite_error(error, f"{parsed_st['apiName']}: {error}") from None playwright._impl._errors.TimeoutError: Locator.click: Timeout 30000ms exceeded. Call log: waiting for locator("//*[@id='app']/div[1]/div[2]/div[1]/ul/div[1]/button")

出现滑块验证了

出现上面的问题后,我重新运行。能保留登录状态,但是为什么程序还是要求登录啊?

出现验证之后就会直接踢你下线的 不要跑了 现在有问题了

NanmiCoder avatar Nov 24 '25 07:11 NanmiCoder

出现滑块验证了

出现上面的问题后,我重新运行。能保留登录状态,但是为什么程序还是要求登录啊?

出现验证之后就会直接踢你下线的 不要跑了 现在有问题了

过段时间小红书的风控能好吗?还是我可以换一个账号试试,上午还能正常跑,我就是换了一个账号后出的问题。

不用换账号了,js签名不行了,修复会通知的

NanmiCoder avatar Nov 24 '25 07:11 NanmiCoder

不用换账号了,js签名不行了,修复会通知的

好的,感谢大佬。

同样遇到了这个问题

Xiangjie-Kong avatar Nov 24 '25 13:11 Xiangjie-Kong

遇到这个问题+1

JackWBC avatar Nov 26 '25 06:11 JackWBC

使用了最新的xhshow之后,搜索接口已经恢复,但是其他接口仍不可使用。

zhangshaodong avatar Nov 26 '25 06:11 zhangshaodong

使用了最新的xhshow之后,搜索接口已经恢复,但是其他接口仍不可使用。

最新的xhshow是0.1.3?为啥我这还是不行

JackWBC avatar Nov 26 '25 07:11 JackWBC

使用了最新的xhshow之后,搜索接口已经恢复,但是其他接口仍不可使用。

问题已经能解决了?

使用了最新的xhshow之后,搜索接口已经恢复,但是其他接口仍不可使用。

最新的xhshow是0.1.3?为啥我这还是不行

参考这个:https://github.com/Cloxl/xhshow/issues/64

zhangshaodong avatar Nov 27 '25 01:11 zhangshaodong

使用了最新的xhshow之后,搜索接口已经恢复,但是其他接口仍不可使用。

问题已经能解决了?

还没有。只有搜索的接口可用,其他的几个接口不可用。参考:https://github.com/Cloxl/xhshow/issues/64

zhangshaodong avatar Nov 27 '25 01:11 zhangshaodong

fix/xhs-sign-20251127 这个分支更新了一个版本,搜索接口 帖子详情接口 一级评论接口可以用,二级评论和创作者还是不行,有需要的可以切换到这个分支

NanmiCoder avatar Nov 27 '25 02:11 NanmiCoder

fix/xhs-sign-20251127 这个分支更新了一个版本,搜索接口 帖子详情接口 一级评论接口可以用,二级评论和创作者还是不行,有需要的可以切换到这个分支

还是先合到main分支了,后续看看能不能修复这个问题,如果感兴趣的也可以去看看那里有问题,我也比较好奇为啥通过浏览器 window.mnsv2这个函数去获取二级评论创作者主页的接口有问题

NanmiCoder avatar Nov 27 '25 03:11 NanmiCoder

fix/xhs-sign-20251127 这个分支更新了一个版本,搜索接口 帖子详情接口 一级评论接口可以用,二级评论和创作者还是不行,有需要的可以切换到这个分支

还是先合到main分支了,后续看看能不能修复这个问题,如果感兴趣的也可以去看看那里有问题,我也比较好奇为啥通过浏览器 window.mnsv2这个函数去获取二级评论创作者主页的接口有问题

好的感谢大佬

fix/xhs-sign-20251127 这个分支更新了一个版本,搜索接口 帖子详情接口 一级评论接口可以用,二级评论和创作者还是不行,有需要的可以切换到这个分支

还是先合到main分支了,后续看看能不能修复这个问题,如果感兴趣的也可以去看看那里有问题,我也比较好奇为啥通过浏览器 window.mnsv2这个函数去获取二级评论创作者主页的接口有问题

你好,我想请问下为什么之前CDP 模式正常能用,最近CDP 模式几个平台都用不了了,我拉取了最新的版本CDP 模式还是启动失败

Image

Xiangjie-Kong avatar Nov 29 '25 09:11 Xiangjie-Kong

fix/xhs-sign-20251127 这个分支更新了一个版本,搜索接口 帖子详情接口 一级评论接口可以用,二级评论和创作者还是不行,有需要的可以切换到这个分支

还是先合到main分支了,后续看看能不能修复这个问题,如果感兴趣的也可以去看看那里有问题,我也比较好奇为啥通过浏览器 window.mnsv2这个函数去获取二级评论创作者主页的接口有问题

你好,我想请问下为什么之前CDP 模式正常能用,最近CDP 模式几个平台都用不了了,我拉取了最新的版本CDP 模式还是启动失败

Image

看样子好像是 websocket 没连上,我本地没有出现你这个问题,你是有梯子这些代理网络了吗?

NanmiCoder avatar Nov 29 '25 10:11 NanmiCoder

该问题已修复,GET请求编码问题,使用playwright去调用sign的方法还是可以

具体代码修改的细节: https://github.com/NanmiCoder/MediaCrawler/pull/793

NanmiCoder avatar Dec 03 '25 03:12 NanmiCoder