很多人以为会 page.click() 和 page.fill() 就等于会做数据采集了。真上手一个项目才发现,点击、输入只占 20%,剩下 80% 全是下面这些「看不见的坑」。
一、登录态管理,才是第一道坎
目标网站要登录才能看数据,你总不能每次跑都手动扫码。核心是 Cookie 的生命周期管理:
首次手动登录,保存 cookie
context = browser.new_context()
page = context.new_page()
... 手动登录后
context.storage_state(path="cookies.json")
之后直接复用,跳过登录
context = browser.new_context(storage_state="cookies.json")
但保存一次就完事是错的。Cookie 会过期、会失效,脚本要能检测登录态是否还在,失效了及时提醒重新登录,而不是跑一半报一堆看不懂的错。
二、指纹一致性,比你想的阴险
很多网站不只看 UA,还查 navigator.webdriver、window.chrome、Canvas 指纹、甚至鼠标移动轨迹。你 headless 一开,指纹就露馅了。
关键不是「加 stealth 插件」这么简单,而是保持整套指纹的自洽——UA、屏幕分辨率、语言、时区要像一个真实用户,不能东拼西凑。
三、等待,是技术活不是 sleep
新手最爱 time.sleep(5),结果要么等不够、要么浪费半天。真正该做的是等条件,不等时间:
差:固定睡 5 秒
time.sleep(5)
好:等某个元素真的出现
page.wait_for_selector('.data-table', state='visible', timeout=30000)
数据是异步加载的,等「数据渲染完成」这个信号,比等「几秒钟」可靠一百倍。
四、稳定性,决定你能不能接第二单
脚本跑一次成功没用,要能跑一百次都稳。三个关键:
重试机制:网络抖动、偶发超时,自动重试而不是直接崩
断点续跑:跑到一半断了,下次从断点接着跑,不从头再来
日志:每次跑留下记录,出问题了能查,而不是对着黑屏猜
这四点做扎实了,才是一个「能交付」的数据采集脚本,而不是「在我电脑上能跑」的 demo。
后续我会继续分享自动化实战里的这些细节。如果你也在做类似的项目,卡在某个环节上,欢迎一起交流。
Top comments (0)