因广告链接多为跳转链,utm_source等参数在重定向后才拼入最终url,需模拟点击并等待页面跳转完成后再读取window.location.href,而非直接访问初始链接。

用 selenium 抓取竞品落地页广告参数时,为什么总拿不到 utm_source 等参数?
因为多数广告链接是跳转链(如百度推广页、腾讯广点通中转页),真实参数在重定向后才拼到最终 URL 上,直接访问初始链接会丢失。必须模拟真实点击行为,等页面完成跳转并稳定后再读取 window.location.href。
实操建议:
- 用
driver.get()打开广告入口链接后,加WebDriverWait等待url_changes或新页面标题出现,避免过早读取 - 禁用图片加载(
ChromeOptions.add_argument('--blink-settings=imagesEnabled=false'))可提速,但注意某些广告依赖图片加载触发 JS 埋点 - 若页面使用
history.pushState无刷新改 URL,需监听driver.current_url变化,而非只靠get()后的首次值
如何稳定提取广告素材中的文案与投放时间?
竞品广告图常以 base64 内联或 CDN 链接形式嵌入,文案可能藏在 alt、title、JS 变量或 DOM 文本节点里,不能只靠 find_element(By.TAG_NAME, 'img') 硬扫。
实操建议:
- 优先查
document.querySelector('[data-ad-id]')类属性,这类自定义字段往往是广告系统注入的标识 - 对含「限时」「抢购」「今日」等词的文本节点,用
driver.execute_script("return window.performance.timing.navigationStart")推算页面加载时间,再结合本地时区反推“投放开始时间”(非绝对准确,但比纯文本解析可靠) - 若页面有
__NEXT_DATA__或window.adConfig全局变量,用driver.execute_script('return window.adConfig')直接提取结构化数据
记录动态时,为什么用 SQLite 比 JSON 文件更合适?
广告参数变化高频(如出价、时段、地域定向),JSON 文件每次写入需全量读-改-写,易丢数据且无法原子更新;而 SQLite 支持行级 INSERT OR REPLACE INTO 和带 WHERE 的 UPDATE,还能建索引加速按日期/广告位查询。
实操建议:
- 表结构至少包含:
ad_id(主键,来自广告链接或 DOM data 属性)、url、utm_params(TEXT 存原始字典 JSON)、snapshot_time(INTEGER 存 timestamp)、html_hash(存当前页面 DOM 的sha256,用于识别是否真变化) - 避免用
datetime.now()记录时间——不同机器时区不一致,统一用int(time.time()) - 每次插入前先
SELECT ad_id FROM ads WHERE ad_id = ? AND html_hash = ?,命中则跳过,减少冗余存储
绕过反爬时,哪些 User-Agent 和行为特征最容易被识别?
单纯换 User-Agent 字符串毫无意义;现代风控系统会检测 navigator.webdriver、plugins.length、鼠标移动轨迹、pageLoadTime 等真实浏览器指纹。
实操建议:
- 启动 Chrome 时加
--disable-blink-features=AutomationControlled,并在初始化后执行driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument', {'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'}) - 避免
time.sleep(1)这类固定等待,改用random.uniform(0.8, 2.3)模拟人工停顿 - 不要连续监控同一竞品超过 3 个广告位/小时——多数平台对单 IP 的广告接口有 QPS 限流,触发后返回空数据或 403,且不会报错
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











