yaml爬虫配置须用yaml.safeloader加载,字段名禁用on/off等布尔关键词,字符串加单引号防隐式转换;delay控制请求间隔,timeout控制http响应超时;css/xpath需分字段声明,xpath含引号需转义;regex单独设字段;加载后校验start_urls为合法url列表、allowed_domains为纯域名列表。

YAML文件里怎么写爬虫规则才不被yaml.load()报错
Python默认的yaml.load()在PyYAML 5.1+之后禁用unsafe loader,直接读配置会抛ConstructorError或UnsafeLoaderWarning。必须显式指定Loader=yaml.SafeLoader——这不是可选项,是强制要求。
- 别写
yaml.load(f),一律改用yaml.load(f, Loader=yaml.SafeLoader) - 字段名避免用
on、off、yes、no,YAML会把它们自动转成布尔值,比如enabled: on→True,容易误判 - URL路径、CSS选择器这类字符串,统一加单引号,防止
.或-触发隐式类型转换,例如selector: 'div.item > a.title'
抓取规则里的delay和timeout参数到底控制谁
这两个参数常被混用,但作用对象完全不同:delay管请求间隔(防封),timeout管单次HTTP响应等待(防卡死)。设错会导致爬虫要么被限流,要么大量挂起。
-
delay: 1.5表示两次requests.get()之间至少等1.5秒,不是“每秒最多发1次” -
timeout: 10是传给requests.get(timeout=...)的,超时后抛requests.exceptions.Timeout,需捕获处理 - 如果用
aiohttp异步爬虫,timeout得换用aiohttp.ClientTimeout对象,YAML里不能直接写数字
为什么css和xpath规则在配置里不能混着写又不标类型
解析逻辑依赖明确的提取方式声明。YAML本身不带语义,extract: 'h1.title'无法自动判断该走CSS还是XPath引擎——不同库行为差异极大,比如lxml对//div[@class="a b"]支持好,但BeautifulSoup默认CSS解析器不支持属性多值匹配。
- 必须显式分字段:
css: 'article h2'或xpath: '//article/h2/text()',不要塞进同一个键 - XPath表达式里含引号时,YAML需用双引号包裹并转义内部双引号,例如
xpath: "//div[@data-id=\"item\"]" - 若规则含正则提取(如从URL抽ID),单独用
regex字段,别硬塞进css值里
加载配置后怎么验证start_urls和allowed_domains没写漏
配置错误往往在运行时才暴露,比如start_urls写成字符串而非列表,或allowed_domains漏了子域名,导致scrapy静默跳过所有链接,或requests发到黑产站。
- 加载后立刻检查
config['start_urls']是否为list,且每个元素是合法URL(用urllib.parse.urlparse()验scheme和netloc) -
allowed_domains必须是纯域名列表,不含协议和路径,example.com✅,https://example.com/❌ - 如果用Scrapy,注意它会自动忽略不在
allowed_domains内的域名,但不会报错——得靠日志里Filtered offsite request反查
YAML配置看着简单,但字段语义松散、类型隐式、库间解析逻辑不一致,最容易出问题的地方从来不是语法,而是你认为“应该能自动推断”的那部分。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











