广告被恶意点击烧钱?先定位来源再想拦截

来源:互联网 时间:2026-10-08

做付费投放最心疼的事,是预算被点完了却没带来一个询盘。广告被恶意点击烧钱,很多站长的第一反应是立刻停投,可停投只止血、不解决问题,重新开投照样被点。网站被恶意点击怎么办才不留后患?先定位来源,再谈拦截。定位的思路是把点击拆到渠道、IP、设备、时间段四个维度上,看清是谁在点,才知道该拦哪一层。

一、定位第零步:把渠道拆开看

如果你同时投了竞价、信息流和友链,先把每个渠道的点击量和转化量单独拉出来算比例。某个渠道点击成本低得离谱、转化却是零,这个渠道就要重点查;几个渠道的点击量同步上涨、转化一起掉,说明刷量是冲着你整站来的,不是单个渠道的问题。这一步只用统计工具就能做,不用动服务器,十分钟就能缩小范围。

二、从访问日志拉出点击来源明细

范围缩小到具体渠道后,要把它拆到单个请求。访问日志里能拿到比统计工具更细的东西,尤其是 User-Agent 和 Referer。下面这段脚本把落地页的请求明细导出成 CSV,并按 IP 加 User-Agent 的组合统计次数:UA 相同、IP 不同的组合多,是同一台机器换代理;IP 相同、UA 五花八门的,是脚本在伪造身份。导出的 CSV 可以直接当申诉材料的一部分。

# 把落地页点击明细导出 CSV,并按 IP + User-Agent 组合统计次数
import csv, re
from collections import Counter

LOG = "/www/wwwlogs/example.com.log" # 改成你的访问日志路径
LANDING = "/ad/landing.html" # 改成你的落地页路径
OUT = "click_detail.csv" # 导出的明细文件

PAT = re.compile(r'(\S+) \S+ \S+ \[([^\]]+)\] "(\S+) ([^"]*)[^"]*" (\d+) (\d+) "([^"]*)" "([^"]*)"')

rows, combo = [], Counter()
for line in open(LOG, "r", encoding="utf-8", errors="ignore"):
m = PAT.match(line)
if not m:
continue
ip, ts, method, url, status, size, referer, ua = m.groups()
if LANDING not in url:
continue
rows.append((ts, ip, ua, referer, status))
combo[(ip, ua)] += 1

with open(OUT, "w", newline="", encoding="utf-8-sig") as f:
w = csv.writer(f)
w.writerow(["时间", "IP", "User-Agent", "Referer", "状态码"])
w.writerows(rows)

print("明细行数:", len(rows))
for (ip, ua), n in combo.most_common(10):
print(n, ip, ua[:60])

跑完先看时间分布。请求集中在凌晨两三点、白天几乎没有,是典型的机器刷量;请求均匀铺满全天、次数不高,反而可能是有人在人工点。再看 Referer 字段,如果大量请求的 Referer 指向同一个陌生的聚合页,顺着这个页面往下查,往往能找到刷量入口。

三、按来源类型分别拦截

单一来源高频的,用上一节的 Nginx 限流或者防火墙封 IP 段,成本最低。分布式刷量的,封 IP 没有尽头,要在落地页加人机校验、在 CDN 层开频率限制和 IP 信誉库。同行竞争式点击的,重点是把证据做扎实交给投放平台,让平台去做无效点击核查和扣费退回。还有一类容易被误伤:企业、学校、网吧的出口 IP 是共用的,一个 IP 后面可能有几百个真实用户,封之前先看这个 IP 的历史转化记录,有成交记录的就别封。

四、把预算保护和监控做成常态

拦截规则上线后,给账户加一道预算保护:设日预算上限、把投放时段收窄到业务高峰、对单城市设置投放比例上限。同时把落地页的点击分布做成每日报表,连续两天偏离基线就告警。每周花十分钟复核一次平台的无效点击申诉记录,看退回了多少、有没有新的刷量特征。恶意点击不会只来一次,把定位和拦截做成流程,才不用每回都被烧一遍预算。

相关阅读:

《网站被恶意点击怎么办?识别、取证与拦截方法》

《网站流量超限怎么处理?原因定位与缓解办法》

《手机网页被挂马怎么办?移动端劫持排查方法》

相关文章

A5创业网 版权所有

返回顶部