爬虫写多了一定会遇到反爬。这篇文章总结最常见的 5 种反爬手段和对应的解决方案。一、反爬手段全景反爬方式特征难度User-Agent 检测请求头不含浏览器标识⭐IP 频率限制同一 IP 短时间大量请求被封⭐⭐Cookie/Session 校验不带 Cookie 直接返回 403⭐⭐请求头完整性校验Referer、Origin 等不完整被拦截⭐⭐⭐验证码图形验证码、滑块验证码⭐⭐⭐⭐二、User-Agent 伪装最简单的反爬也是最容易被忽略的。importrequests# 错误没有设置请求头resprequests.get(url)# 网站一看来的是 python-requests直接封# 正确伪装成浏览器headers{User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Chrome/120.0.0.0 Safari/537.36}resprequests.get(url,headersheaders)建议准备一个 User-Agent 池随机切换importrandom USER_AGENTS[Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Chrome/120.0.0.0 Safari/537.36,Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) ... Safari/605.1.15,Mozilla/5.0 (Windows NT 10.0; Win64; x64) ... Firefox/121.0,Mozilla/5.0 (X11; Linux x86_64) ... Chrome/119.0.0.0 Safari/537.36,]defget_headers():return{User-Agent:random.choice(USER_AGENTS)}三、IP 代理池同一 IP 短时间内大量请求网站会直接封 IP。# 使用代理proxies{http:http://127.0.0.1:7890,# 本地代理https:http://127.0.0.1:7890}resprequests.get(url,proxiesproxies)# 随机切换代理proxy_list[http://代理1:端口,http://代理2:端口,http://代理3:端口,]proxyrandom.choice(proxy_list)resprequests.get(url,proxies{http:proxy,https:proxy})免费代理获取defget_free_proxies():从免费代理网站获取代理示例快代理urlhttps://www.kuaidaili.com/free/inha/1/headers{User-Agent:Mozilla/5.0 ...}resprequests.get(url,headersheaders)resp.encodingutf-8treeetree.HTML(resp.text)proxies[]forrowintree.xpath(//table/tbody/tr):iprow.xpath(./td[1]/text())[0]portrow.xpath(./td[2]/text())[0]proxies.append(f{ip}:{port})returnproxies请求频率控制比代理更重要的是一一控制请求速度importtime# 每次请求间隔 1~3 秒forpageinrange(10):resprequests.get(url)time.sleep(random.uniform(1,3))# 关键四、Cookie 处理有些网站必须带 Cookie 才能访问# 方法1直接从浏览器复制 Cookiecookies{sessionid:abc123...,csrf_token:def456...}resprequests.get(url,cookiescookies)# 方法2先用 requests.Session 保持会话sessionrequests.Session()session.get(login_url)# 先访问登录页获取 Cookiesession.post(login_url,datalogin_data)# 登录respsession.get(target_url)# 带着 Cookie 访问目标页五、请求头完整性一些反爬严格的网站会检查请求头的完整性headers{User-Agent:Mozilla/5.0 ...,Referer:https://www.example.com,# 从哪跳转来的Origin:https://www.example.com,# 来源站占Accept-Language:zh-CN,zh;q0.9,Accept-Encoding:gzip, deflate, br,Connection:keep-alive,}# 先用浏览器开发者工具 F12 → Network → 任意请求# 把 Request Headers 完整复制过来六、应对验证码验证码是反爬的终极大招常见应对方案# 方案1打码平台推荐# 使用 超级鹰、打码兔 等平台自动识别importhashlibdefrecognize_captcha(image_file):调用打码平台 API 识别验证码# 各平台有 SDK按文档调用即可return识别结果# 方案2Selenium 手动介入# 当出现验证码时暂停等手动处理input(请手动完成验证码完成后按 Enter...)七、完整实战带反爬策略的爬虫模板importrequestsimportrandomimporttimefromlxmlimportetreeclassAntiSpiderCrawler:带反爬策略的爬虫模板def__init__(self):self.sessionrequests.Session()self.session.headers.update({User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...,Accept-Language:zh-CN,zh;q0.9,})self.proxiesNonedefset_proxy(self,proxy):self.proxies{http:proxy,https:proxy}defrequest(self,url,retry3):带重试机制的请求foriinrange(retry):try:respself.session.get(url,proxiesself.proxies,timeout10)ifresp.status_code200:returnrespelifresp.status_code403:print(f被反爬拦截切换代理重试...)time.sleep(2)else:print(f状态码:{resp.status_code})exceptExceptionase:print(f请求失败:{e})time.sleep(random.uniform(1,3))returnNone# 使用crawlerAntiSpiderCrawler()respcrawler.request(https://example.com/data)ifresp:treeetree.HTML(resp.text)# 提取数据...总结反爬与反反爬是一个持续对抗的过程。核心原则模拟真人— User-Agent、请求间隔、行为模式降低频率— 控制请求速度比任何技术都重要分散 IP— 被封了就换代理完整请求头— 越像浏览器越安全如果对你有帮助欢迎点赞、评论、关注【张老师技术栈】持续分享 Java/Python/爬虫 实战干货。