(六)区分来源身份与书籍字段
1. 为采集记录保留源站编号
目录里的 b101 是源站给这本书的编号,来源链接则说明从哪里取得记录。书名、完成状态和标签继续放在前面的 Book 中:
# 项目文件:crawler_project/src/catalogcrawl/models.py
# 源站编号和来源链接用于采集;Book 继续保存前面章节已经使用的业务字段。
from dataclasses import asdict, dataclass
from bookdata.models import Book
@dataclass
class CollectedBook:
source_id: str
book: Book
source_url: str
def as_record(self):
return asdict(self.book)CollectedBook 组合一份 Book,而不是重新复制一套书籍操作。as_record() 用已经讲过的 asdict 交回书籍库认识的三个字段。source_id 和 source_url 留在采集结果中,分别用于识别重复记录与追查来源。
2. 缺少字段时反馈具体采集动作
接下来的解析与请求会使用这两个错误类别:
# 项目文件:crawler_project/src/catalogcrawl/errors.py
# 入口按采集动作反馈错误,底层请求或字段异常仍由异常链保留。
class CrawlError(ValueError):
pass
class ParseError(CrawlError):
pass它们继承第五章已经用过的 ValueError。ParseError 指向“有响应,但没有取得要求的记录结构”;CrawlError 还承接链接和请求过程中可以向入口反馈的问题。错误中保留 URL,日志才能把某个失败和对应页面联系起来。
字符串 "false" 是非空字符串,bool("false") 会得到 True。详情解析会先识别页面里的 true、false 两种文本,再明确转换为布尔值,最后交给已有的 book_from_dict 检查。书名缺失时也会指出来源,而不是填一个空书名继续保存。