feat(08-02): add CommentData models for comment crawling

- Add CommentAuthor model for comment author info
- Add CommentData model with content, author, likes, child_count
- Add CommentsResult model for crawl operation result
- Update CrawlResult to include optional comments field

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-17 21:53:17 +08:00
parent f0ee4ca5e2
commit b1f57922da
+56 -1
View File
@@ -3,7 +3,7 @@
Pydantic models for structured data from Zhihu API responses. Pydantic models for structured data from Zhihu API responses.
""" """
from typing import Optional, Union from typing import Optional, Union, List
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
@@ -79,6 +79,56 @@ class ArticleData(BaseModel):
) )
class CommentAuthor(BaseModel):
"""Comment author information.
Attributes:
name: Author display name
url_token: Author URL token (e.g., 'zhang-san-12')
"""
name: str = Field(..., description="Author display name")
url_token: Optional[str] = Field(None, description="Author URL token")
class CommentData(BaseModel):
"""Data model for Zhihu comment.
Attributes:
id: Comment ID
content: Comment content in plain text
author: Comment author information
created_time: Unix timestamp of creation
like_count: Number of likes/upvotes
child_count: Number of child/reply comments
is_author: Whether the commenter is the content author
"""
id: int = Field(..., description="Comment ID")
content: str = Field(default="", description="Comment content")
author: Optional[CommentAuthor] = Field(None, description="Comment author")
created_time: Optional[int] = Field(None, description="Creation timestamp")
like_count: int = Field(default=0, description="Like/upvote count")
child_count: int = Field(default=0, description="Number of child comments")
is_author: bool = Field(default=False, description="Whether commenter is content author")
class CommentsResult(BaseModel):
"""Result of comment crawling operation.
Attributes:
content_type: Type of content ("answers" or "articles")
content_id: ID of the content
comments: List of comments
total_count: Total number of comments (may exceed returned count)
"""
content_type: str = Field(..., description="Content type: answers or articles")
content_id: int = Field(..., description="Content ID")
comments: List[CommentData] = Field(
default_factory=list,
description="List of comments"
)
total_count: int = Field(default=0, description="Total comment count")
class CrawlResult(BaseModel): class CrawlResult(BaseModel):
"""Result of a crawl operation. """Result of a crawl operation.
@@ -86,6 +136,7 @@ class CrawlResult(BaseModel):
success: Whether the crawl was successful success: Whether the crawl was successful
content_type: Type of content ("answer" or "article") content_type: Type of content ("answer" or "article")
data: Extracted content data if successful data: Extracted content data if successful
comments: Optional list of comments (when include_comments=True)
error: Error message if failed error: Error message if failed
""" """
success: bool = Field(..., description="Whether crawl succeeded") success: bool = Field(..., description="Whether crawl succeeded")
@@ -94,4 +145,8 @@ class CrawlResult(BaseModel):
None, None,
description="Extracted content data" description="Extracted content data"
) )
comments: Optional[List[CommentData]] = Field(
None,
description="Comments if include_comments was True"
)
error: Optional[str] = Field(None, description="Error message if failed") error: Optional[str] = Field(None, description="Error message if failed")