第15课:网页爬虫|反爬策略全解析【看懂网站如何“认出”你,为对抗打下地基】
文章目录学习目标一、通俗原理反爬就是“门卫的十八般武艺”1.1 网站也是“有脾气的”1.2 反爬的“三层漏斗”模型1.3 反爬的“光谱”二、User-Agent校验最基础的门卫2.1 原理2.2 触发条件2.3 识别方式2.4 真实案例豆瓣的UA检测2.5 绕过思路预告三、Referer校验你的来路是否清白3.1 原理3.2 触发条件3.3 识别方式3.4 绕过思路预告四、Cookie校验你有入场券吗4.1 原理4.2 触发条件4.3 真实案例知乎的Cookie校验4.4 绕过思路预告五、频率限制与访问频次封禁5.1 原理5.2 触发条件5.3 识别方式5.4 绕过思路预告六、访问模式与行为分析6.1 原理6.2 触发条件6.3 识别方式6.4 绕过思路预告七、IP封禁与代理检测7.1 原理7.2 触发条件7.3 识别方式7.4 绕过思路预告八、设备指纹与浏览器指纹8.1 原理8.2 触发条件8.3 识别方式8.4 绕过思路预告九、验证码挑战9.1 原理9.2 触发条件9.3 识别方式9.4 绕过思路预告十、JavaScript挑战与前端加密10.1 原理10.2 触发条件10.3 识别方式10.4 绕过思路预告十一、真实场景案例综合演练案例1某新闻网站的UAReferer双检案例2豆瓣的418“茶壶”与频率限制案例3知乎的动态请求签名案例4某电商网站的设备指纹案例5Cloudflare的5秒盾十二、新手常见误区误区1“只要加了延时网站就不会封我”误区2“换了IP就万事大吉”误区3“把UA改成百度蜘蛛就能横行无阻”误区4“Selenium不会被反爬”误区5“免费代理池可以解决IP问题”误区6“反爬是一场单向战争攻方永远被动”十三、总结反爬策略全景图爬虫与反爬的博弈本质为下一课铺垫十四、课后作业作业1观察网站的反爬行为必做作业2分析豆瓣418状态码必做作业3检测自己的设备指纹选做作业4阅读Cloudflare的“5秒盾”原理选做作业5思考题必做《20节课精通网页爬虫》系列课程导航学习目标学完这一课你将能够理解反爬的核心理念——知道网站为什么要反爬、反爬的基本思路是什么识别六大常见反爬策略——UA校验、Referer校验、Cookie校验、频率限制、访问频次封禁、设备与指纹检测掌握每种策略的原理——清楚触发器在哪个环节、识别逻辑是什么能判断自己触发了哪种反爬——看到403、封IP、验证码时能定位是哪个环节出了问题建立对抗思维框架——为第16、17课具体反爬绕过技术打好理论基础这一课不写任何绕过代码只是做原理拆解和认知搭建。正所谓“知己知彼百战不殆”只有搞明白了网站怎么识别爬虫你才能有的放矢地设计对抗策略。一、通俗原理反爬就是“门卫的十八般武艺”1.1 网站也是“有脾气的”想象一下你开了一家奶茶店网站每天正常接待几百个顾客真人用户。突然有一天门口来了一个机器人它每隔0.1秒就伸进窗口要一杯奶茶而且不要糖、不要奶只是机械地重复“要一杯奶茶”。机器人不是来消费的它就是来采集你的菜单价格和配方爬数据。你会怎么做你肯定不想让这个机器人影响正常顾客。于是你可能会看对方的“制服”User-Agent不是普通顾客的打扮就拦住检查他是不是从隔壁店Referer过来的来路不明的不搭理让他每次出示“会员卡”Cookie没卡的不给进如果一个人来得太频繁就让他走远点站一会儿频率限制记住他的长相IP地址、设备指纹下次见了直接轰走反爬策略就是网站的这套“门卫系统”。它不是为了为难好人而是为了维护网站稳定、保护数据资产、遵守法律法规比如防止竞争对手低价抓取商品信息。1.2 反爬的“三层漏斗”模型大多数网站的反爬采用分层过滤像漏斗一样层层筛选第一层请求级别—— 检查请求头中的User-Agent、Referer、Cookie、Accept等是否“像个正常人”。这个最容易触发也最容易绕过改个头就行了。第二层访问行为级别—— 检查访问频率、访问间隔、请求顺序等是否符合人类行为特征。这一层能拦住绝大多数初级爬虫。第三层身份级别—— 通过IP、设备指纹、账号行为等长期跟踪。一旦你上了黑名单换个IP、换台电脑可能都不管用因为指纹能关联。下面我们逐层拆解。1.3 反爬的“光谱”按照严格程度反爬策略可以分成三个梯度梯度特点典型网站爬虫难度宽松型只检查User-Agent甚至什么都不检查老式博客、政府公开数据极低标准型检查UA、Referer、频率限制偶尔弹验证码中小型电商、论坛中等严格型设备指纹、浏览器环境检测、JS挑战、WAF淘宝、京东、知乎、豆瓣高我们从最基础的开始讲起。二、User-Agent校验最基础的门卫2.1 原理User-Agent是HTTP请求头中的一个字段告诉服务器“我是谁”——什么操作系统、什么浏览器、什么版本。网站服务器接收到请求后会检查User-Agent。如果它发现这个值不符合正常浏览器的格式比如是python-requests/2.31.0、curl/7.68.0或者是一个很老版本、很少见的浏览器就可以判定为自动化程序直接返回403拒绝访问。真实案例百度搜索的UA检测很严格你用requests.get(‘https://www.baidu.com’)默认UA会被拦住但换成Chrome的UA就放行。2.2 触发条件User-Agent缺失有些库不自动添加User-Agent是明显的爬虫标识python-requests、Go-http-client、Java/User-Agent是搜索引擎爬虫如Googlebot但你的IP又不是Google的IP这种伪装很容易被识破2.3 识别方式作为爬虫开发者当你收到403状态码或者页面内容提示“请使用Chrome浏览器访问”基本可以判断是UA问题。查看响应头中的X-Frame-Options、X-XSS-Protection等不一定最直接的是换一个主流浏览器UA试试如果问题消失那就确诊了。2.4 真实案例豆瓣的UA检测豆瓣的公开页面如电影Top250对UA非常敏感。用默认UA请求importrequests responserequests.get(‘https://movie.douban.com/top250’)print(response.status_code)# 418 或 403换一个Chrome UAheaders{‘User-Agent’:‘Mozilla/5.0(Windows NT10.0;Win64;x64)…’}responserequests.get(‘https://movie.douban.com/top250’,headersheaders)print(response.status_code)# 200这就是最简单的反爬。2.5 绕过思路预告随机轮换User-Agent池每次请求换一个主流浏览器UA模拟真实浏览器的完整UA字符串不要简写注意UA要和操作系统、语言环境匹配比如Windows上跑Mac UA也显得假三、Referer校验你的来路是否清白3.1 原理Referer引荐来源告诉服务器你是从哪个页面跳转过来的。比如你在百度搜“爬虫”点了一个链接那个请求的Referer就是百度的搜索结果页地址。网站可以检查Referer只有从它信任的域名或自身域名来的请求才允许访问。如果Referer缺失或来源不对就拒绝。为什么要校验Referer防盗链防止其他网站直接引用你的图片、视频资源对方直接把img src你的图片地址放在自己网站上消耗你的带宽防CSRF攻击防止恶意网站诱导用户发请求确保访问路径正常例如购物网站的商品详情页只允许从列表页或搜索结果页进入不允许直接访问3.2 触发条件Referer为空直接从书签、命令行工具、代码发起的请求Referer是第三方网站不是本站域名Referer的路径不符合业务逻辑比如提交订单的请求Referer却是首页3.3 识别方式当你发现图片、视频等资源返回403但直接在浏览器地址栏访问又能打开某个数据接口返回“非法请求”或“请从正规渠道访问”那很可能是Referer校验。真实案例很多网站的图片CDN会做Referer白名单。比如微博的图片如果你在自己的网站用img src微博图片链接图片可能无法显示。因为微博服务器检查Referer如果不是来自weibo.com或*.sinaimg.cn就拒绝。3.4 绕过思路预告在请求头中伪造Referer设置为网站自身的域名或允许的域名注意某些网站会严格校验Referer的格式比如必须完整带协议和路径不能只给个域名四、Cookie校验你有入场券吗4.1 原理Cookie是服务器存放在客户端的一小段文本用于维持会话、记录状态。网站可以通过Cookie来判断你是否曾经访问过新用户 vs 老用户你是否正常通过了某些前置步骤比如先访问了首页获取了session_id然后才能访问详情页你是否有合法的登录凭证登录态反爬场景中网站可能要求每个请求都必须携带特定的Cookie这些Cookie是通过执行JavaScript生成的或者在前一个请求的响应中通过Set-Cookie下发的。爬虫的常见问题直接请求目标URL没有携带任何Cookie → 被拒绝Cookie过期比如设置了很短的失效时间 → 被要求重新获取4.2 触发条件请求中完全没有CookieCookie缺失某个必须的键值如token、sessionidCookie的值不正确比如签名错误、时间戳过期4.3 真实案例知乎的Cookie校验知乎的某些API接口需要先访问首页获得一个名为z_c0的Cookie登录态然后才能请求数据。如果你直接请求API且不带这个Cookie会返回401 Unauthorized。更高级的有些网站会在Cookie中加密存储用户的行为轨迹如果爬虫只是简单复制一个Cookie而不模拟真实行为轨迹也会被识别。4.4 绕过思路预告使用requests.Session()自动管理Cookie先访问首页或其他前置页面让服务器下发必要的Cookie分析Cookie的生成逻辑可能涉及JS加密用代码模拟生成五、频率限制与访问频次封禁5.1 原理真人用户访问网站不可能做到“每0.5秒精准访问一次连续访问1000次”。爬虫通常因为追求效率而忽略这一点。频率限制Rate Limiting是反爬最常用、最有效的手段之一。服务器会记录每个IP或每个用户在单位时间内的请求次数超过阈值就暂时封IP几秒到几小时不等返回429 Too Many Requests状态码弹出验证码验证你是不是真人5.2 触发条件请求间隔过于规律比如固定1秒一次单位时间内请求次数超过阈值例如1分钟超过60次并发连接数过多阈值因网站而异。有的网站宽松每秒10次有的严格每秒2次。5.3 识别方式状态码返回429Too Many Requests页面提示“访问过于频繁请稍后再试”突然出现验证码尤其Google reCAPTCHAIP被临时封禁换个IP或等一段时间恢复真实案例豆瓣的公开接口限制比较严格单个IP在短时间内请求超过一定次数就会返回418I’m a teapot别笑这是真的或者直接封IP几小时。5.4 绕过思路预告降低请求频率增加随机延迟例如1-3秒随机间隔使用代理IP池分散请求压力避免固定频率每次请求前time.sleep(random.uniform(0.5, 2))对于需要高频率的场景采用分布式爬虫六、访问模式与行为分析6.1 原理频率限制只能防住“量”但防不住“质”。更高级的反爬系统会分析你的访问模式pattern即使你频率很低但行为明显不像人也可能被封。什么是不像人的行为访问路径单调真人用户访问网站是随机的可能会点击链接、后退、刷新。而爬虫往往按照固定的顺序遍历页面比如从第1页→第2页→第3页…。不加载资源真人浏览器会同时请求HTML、CSS、JS、图片、字体等。爬虫通常只请求HTML或JSON不请求静态资源。没有鼠标移动、滚动等交互有些网站会记录鼠标轨迹、滚动事件缺少这些特征就是机器人。请求间隔完全相等人类有思维停顿两次点击间隔不可能是精确的1.000秒。访问时间异常在凌晨3点到5点人类活动低谷期爬虫却在疯狂爬取。6.2 触发条件请求顺序和页面结构与真实用户偏差太大只请求数据接口不请求页面真用户会先加载HTML页面然后才触发接口缺少Referer链比如直接访问深度页面而不是从首页一步步点进去6.3 识别方式服务器会通过日志分析、机器学习模型来识别行为异常。作为爬虫开发者你可能不会直接看到“你的行为异常”的提示而是发现数据开始出现乱序、被篡改蜜罐数据请求偶尔返回假数据你的IP虽然没有被封但拿到的内容质量下降6.4 绕过思路预告模拟完整访问路径先请求首页再请求列表页最后请求详情页随机加载一些CSS、JS、图片但会降低效率设置随机等待间隔指数分布更接近人类行为使用浏览器自动化Selenium、Playwright来模拟真实浏览器的资源加载七、IP封禁与代理检测7.1 原理IP是最基础的标识。一旦某个IP被判定为爬虫最简单的办法就是封掉它——通过防火墙或应用层拒绝来自该IP的所有请求。临时封禁几分钟到几小时作为警告永久封禁加入黑名单几乎不再解封更高级的网站还会检测代理IP的特征代理IP的归属地是数据中心阿里云、AWS、DigitalOcean等机房IP而不是普通家庭宽带代理IP的端口特征明显如8080、3128代理IP的请求头中包含X-Forwarded-For等字段7.2 触发条件单个IP请求频率超过阈值见第五点使用了公开免费代理这些IP早就进了黑名单IP段被标记为机房IP很多网站会允许家庭宽带IP但禁止云服务器IP7.3 识别方式状态码403 Forbidden或者连接直接被拒绝Connection refused更换IP后恢复正常访问一些IP检测网站如ip.cn发现自己的IP是机房IP7.4 绕过思路预告使用高质量住宅代理IP成本较高轮换IP池每个IP发送少量请求后更换使用ADSL拨号服务器每次拨号换IP不要使用免费代理八、设备指纹与浏览器指纹8.1 原理IP可以被换User-Agent可以改Cookie可以清。但是每个浏览器、每个设备有一系列特征组合起来几乎是唯一的。这就是设备指纹。网站通过JavaScript收集以下信息浏览器特征User-Agent、平台、语言、插件列表、字体列表、时区、屏幕分辨率、色深硬件特征CPU核心数、内存大小、显卡信息通过WebGL渲染指纹网络特征IP、DNSCanvas指纹用Canvas绘制一个图形不同设备、不同操作系统、不同显卡驱动渲染出来的图像有细微差异可以被哈希成唯一指纹WebGL指纹类似Canvas利用3D渲染差异AudioContext指纹音频处理器的细微差异把这些特征组合起来计算出一个哈希值就是设备指纹。即使你清除了Cookie、换了IP只要指纹不变网站仍能认出你。真实案例很多广告联盟通过设备指纹追踪用户跨网站行为。对于爬虫你哪怕用无头浏览器指纹也和普通Chrome有差异可以被检测到。8.2 触发条件使用无头浏览器如Headless Chrome时某些指纹特征会暴露使用Selenium、Playwright默认配置时会有一些自动化特征如navigator.webdriver为true使用自定义HTTP库如requests时完全没有浏览器指纹特征因为不是真正的浏览器8.3 识别方式当你的爬虫明明用了浏览器如Selenium但网站依然能阻挡你或者要求你滑动验证码很可能是指纹被识别了。你可以通过访问一些指纹测试网站如https://bot.sannysoft.com/、https://amiunique.org/fp查看自己的指纹特征和正常浏览器的差异。8.4 绕过思路预告使用专门的指纹伪装库如puppeteer-extra-plugin-stealth修改浏览器指纹特征通过注入JS覆盖navigator.webdriver、plugins等属性使用真实用户浏览器通过远程控制真实设备方案复杂九、验证码挑战9.1 原理当其他反爬手段都无法100%确定你是爬虫时网站会祭出最终武器——验证码。验证码的核心设计目标是“人机鉴别”——计算机程序无法或很难自动完成的任务。常见类型类型例子难度图形验证码扭曲的数字、字母低滑动验证码拖动滑块拼合缺口中点选验证码点击图片中的特定物体红绿灯、自行车高计算题验证码34?低reCAPTCHA v3无感评分不给具体任务较高短信/邮箱验证码需要交互很高9.2 触发条件请求频率过高触发隐形阈值设备指纹可疑访问了敏感页面如登录、注册、下单单个IP请求量突然暴增9.3 识别方式返回的页面中包含验证码输入框、图片API接口返回“需要验证”的标识请求被重定向到验证码页面9.4 绕过思路预告降低频率避免触发使用机器学习识别图形验证码OCR使用打码平台人工或AI破解对于滑动验证码分析轨迹模拟需要深度学习使用Cookie池绕过验证码后的Cookie复用十、JavaScript挑战与前端加密10.1 原理很多网站会返回一段加密的HTML或JS要求浏览器执行后才能获得真实内容。爬虫如果不执行JS就无法拿到数据。常见形式Cloudflare的“5秒盾”返回一个等待页面浏览器执行JS计算挑战几秒后自动跳转到真实页面。前端加密数据接口返回的JSON是加密的需要前端JS解密后再渲染。动态Token每次请求需要携带一个由JS计算生成的Token例如时间戳加密签名。10.2 触发条件直接使用requests请求返回的内容是一个小HTML里面只有script标签响应内容中包含cf-browser-verification、__cf_chl等Cloudflare特征请求参数中需要sign、token、_sig等看起来不固定的字段10.3 识别方式浏览器访问正常但爬虫获取的HTML大量包含JS或不可读状态码503 Service UnavailableCloudflare常见浏览器开发者工具中看到发起了一个“挑战”请求10.4 绕过思路预告使用浏览器自动化Selenium、Playwright让浏览器执行JS逆向JS用Python重写加密逻辑高级使用Cloudflare绕过服务如scrapy-cloudflare-middleware十一、真实场景案例综合演练案例1某新闻网站的UAReferer双检小王写爬虫爬取某新闻网站的文章列表。他发现用浏览器访问完全正常但用Python的requests直接请求却返回403。他尝试加入User-Agent伪装成Chrome状态码变成200但内容是空的。进一步分析发现还需要添加Referer为网站自己的域名。他照做后成功拿到HTML。这是一个典型的初级反爬UA Referer。案例2豆瓣的418“茶壶”与频率限制小李爬取豆瓣电影Top250一开始能成功但连续跑了10页后突然返回418I’m a teapot。他查阅资料得知这是豆瓣的反爬意思是“你太快了去喝杯茶吧”。解决方案每请求一页后time.sleep(random.uniform(2, 5))问题解决。案例3知乎的动态请求签名小张想爬取知乎某个问题下的所有回答。他发现直接请求API接口需要一个x-zse-96签名这个签名是由JS动态计算的。他不懂逆向于是改用Selenium模拟浏览器滚动加载虽然慢一点但能稳定拿到数据。案例4某电商网站的设备指纹小陈用Playwright爬取某电商网站的商品价格他设置了headlessTrue无头模式还改了User-Agent。但每次访问10个商品后网站就会弹出验证码。他测试用普通Chrome浏览器有头模式爬取验证码频率大大降低。原因无头浏览器被设备指纹检测了。他改用有头模式并添加了stealth插件伪装基本能稳定运行。案例5Cloudflare的5秒盾小刘想爬取某个使用Cloudflare的小众网站。用requests请求时返回的HTML内容是“Checking your browser before accessing…”里面全是JS。他改用Selenium并设置等待5秒成功绕过。十二、新手常见误区误区1“只要加了延时网站就不会封我”延时可以减少频率被封的风险但解决不了设备指纹、行为模式、前端加密等问题。误区2“换了IP就万事大吉”如果网站使用了设备指纹你换IP没用因为它认的是浏览器特征。另外如果IP质量不好机房IP照样被封。误区3“把UA改成百度蜘蛛就能横行无阻”很多网站会验证UA和IP是否匹配。你的IP是家庭宽带UA却是Baiduspider服务器一查反向DNS发现不是百度机房直接封。误区4“Selenium不会被反爬”Selenium默认特征很明显navigator.webdrivertrue很多网站直接拦截。需要配合隐身插件使用。误区5“免费代理池可以解决IP问题”免费代理池的IP绝大多数已经被网站拉黑且质量极差速度慢、失效快。真正的生产环境需要购买高质量住宅代理。误区6“反爬是一场单向战争攻方永远被动”实际上是猫鼠游戏。反爬太严会影响正常用户体验所以网站必须在安全和用户体验之间平衡。爬虫开发者可以利用这种平衡。十三、总结反爬策略全景图层级策略检测目标典型响应请求头UA校验无UA或非浏览器UA403请求头Referer校验来源非本站403/盗链请求头Cookie校验缺少必要Cookie401/重定向行为频率限制请求过于频繁429/验证码行为访问模式访问顺序/资源加载异常假数据/封禁身份IP封禁机房IP/黑名单IP403/连接拒绝身份设备指纹浏览器特征异常验证码/直接封挑战验证码机器无法通过需要人工介入挑战JS挑战不执行JS返回加密内容爬虫与反爬的博弈本质成本博弈网站希望让爬虫的成本高于收益而不是完全禁止。误伤博弈反爬太严格会误伤真实用户网站必须容忍一定程度的爬虫。技术迭代没有一招鲜的爬虫也没有万无一失的反爬。为下一课铺垫你现在已经了解了网站反爬的招式。接下来两课我们会学习第16课高级反爬对抗技术——代理IP池、指纹伪装、验证码处理第17课JS逆向与接口破解——从浏览器中抢回数据十四、课后作业作业1观察网站的反爬行为必做选择一个你常访问的网站如知乎、豆瓣、微博用以下方式分别访问记录现象用浏览器正常访问查看Network中的请求头UA、Referer、Cookie等用requests不加任何头请求同样的URL记录状态码和返回内容用requests加Chrome UA请求对比结果快速连续请求20次间隔0.1秒观察是否触发429或验证码提交一份简单的实验报告指出这个网站用了哪些反爬策略。作业2分析豆瓣418状态码必做用requests默认设置请求https://movie.douban.com/top250记录状态码和响应头设置时间间隔循环请求该URL看多久触发418搜索资料了解豆瓣418的含义和触发机制作业3检测自己的设备指纹选做访问https://fingerprintjs.com/demo/查看自己的浏览器指纹。然后尝试开启浏览器的隐私模式刷新页面指纹是否变化切换不同的浏览器Chrome vs Firefox指纹差异大吗安装一个随机化指纹的扩展插件如Chrome的“Canvas Blocker”重新检测指纹有何变化作业4阅读Cloudflare的“5秒盾”原理选做搜索资料了解Cloudflare的“I’m Under Attack”模式和“5秒盾”的技术原理。写出你的理解至少200字并思考如何绕过。作业5思考题必做假如你要设计一个反爬系统保护自己网站的新闻内容。你会使用哪些策略如何平衡用户体验和反爬效果请列出你的设计思路至少3条策略。提示可以参考本课讲到的多层漏斗模型。结束语反爬是一面镜子照出的是你对网络协议、浏览器原理、网站架构的理解深度。不要畏惧它把它当成一个有趣的解谜游戏。今天你只是看清了对手的招式。下一课我们将学习如何见招拆招——从代理IP池到指纹伪装从验证码处理到JS逆向。你已经走在成为一名真正爬虫工程师的路上。第16课见。《20节课精通网页爬虫》系列课程导航GO 感谢您耐心阅读到这里 如果本文对您有所启发欢迎 点赞 收藏 分享给更多需要的伙伴。️ 期待在评论区看到您的想法, 共同进步。 关注我持续获取更多干货内容 我们下篇文章见
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2591081.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!