必须指定locale,否则默认生成英文数据(en_US),中文场景需Faker('zh_CN')才能生成符合本地格式的姓名、地址、手机号、身份证号等字段。

faker.Faker() 初始化时为什么必须指定 locale
不指定 locale 会导致生成的姓名、地址、电话等字段默认使用英文(en_US),但中文网站或接口常需要符合本地格式的身份证号、手机号、银行账号——这些在非中文 locale 下要么缺失,要么格式错误(比如用美国 Social Security Number 代替中国18位身份证)。
实操建议:
- 中文场景固定用
Faker('zh_CN');港澳台可选'zh_TW'或'zh_HK' - 若需多语言混合(如中英双语公司名),得初始化多个实例:
f_zh = Faker('zh_CN')、f_en = Faker('en_US') - 避免全局设置
Faker.seed()后又换 locale,seed 值在不同 locale 下不保证生成相同语义内容
生成中国身份证号要用 ssn() 还是 id_number()
ssn() 是 Faker 的通用方法名,但在 zh_CN locale 下它实际返回的是中国18位身份证号(含校验码);而 id_number() 是 zh_CN 专属方法,行为完全一致。两者都可用,但注意:
-
ssn()在其他 locale(如en_US)返回的是美国社保号(9位数字+短横线),切勿混用 -
id_number()更语义明确,推荐在中文项目里优先写这个 - 生成的身份证号默认是随机有效号码(通过校验算法),但不保证对应真实人口库——仅用于测试
如何让 Faker 返回结构化请求头(User-Agent + Referer + Accept-Language)
Faker 本身不直接生成完整 headers 字典,但可组合多个 provider 方法拼出符合浏览器特征的字段:
立即学习“Python免费学习笔记(深入)”;
f = Faker('zh_CN')
headers = {
'User-Agent': f.user_agent(),
'Referer': f.uri(),
'Accept-Language': f.locale(), # 如 'zh-CN,zh;q=0.9'
'X-Forwarded-For': f.ipv4(), # 可选,模拟代理IP
}
关键点:
-
f.user_agent()默认返回桌面 Chrome UA,加参数可切换:f.user_agent(2)返回移动端 UA -
f.uri()生成的是随机 URL,不是真实站点,若需特定 Referer(如模拟从某电商来),应手动替换域名部分 - 不要用
f.email()或f.phone_number()直接填入 headers,它们不属于标准 header 字段,容易被服务端日志系统误判为攻击特征
并发调用 Faker 时出现重复数据怎么办
Faker 实例不是线程安全的——当多个线程/协程共享同一个 Faker 对象并频繁调用(如每秒数百次 name()),可能因内部随机状态冲突导致重复输出。
解决方式很直接:
- 每个线程/协程创建独立实例:
f = Faker('zh_CN')放在函数内,而非模块顶层 - 若用 asyncio,不要跨 task 共享实例;每个
async def内重新初始化 - 不需要手动调用
random.seed(),Faker 内部已封装;但若需可重现的测试数据,应在每个实例初始化后立刻调用f.seed_instance(42)
最易被忽略的一点:很多人把 Faker 实例挂到类属性或全局变量上图省事,这在压力测试或 FastAPI 多 worker 场景下会悄悄引入数据污染。 faker 不是单例工具,它是“一次一实例”的轻量对象。


















