应通过五步优化反爬:一、随机User-Agent;二、代理IP池自动切换;三、浮动延迟控制;四、Session复用连接;五、动态轮换Accept等请求头字段。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

如果您使用DeepSeek生成的Python爬虫程序在请求目标网站时被拦截,通常是因为服务器识别出请求头缺乏多样性或IP地址被频繁访问而触发反爬机制。以下是解决此问题的步骤:
一、添加随机User-Agent
网站常通过检查请求头中的User-Agent字段判断是否为真实浏览器访问。固定User-Agent容易被识别为爬虫,因此需从预设列表中每次随机选取一个合法浏览器标识。
1、准备包含主流浏览器标识的字符串列表,例如Chrome、Firefox、Safari等不同版本的User-Agent值。
2、导入random模块,在每次发起requests.get()或requests.post()前,调用random.choice()从中随机抽取一个字符串。
立即学习“Python免费学习笔记(深入)”;
3、将该字符串赋值给headers字典中的'User-Agent'键,并在requests方法中通过headers参数传入。
4、确保每次请求都重新生成User-Agent,不可在循环外一次性生成后复用。
二、集成代理IP池逻辑
单一IP高频访问易被封禁,引入代理可分散请求来源。需构造支持HTTP/HTTPS协议的代理字典,并配合异常处理实现自动切换。
1、收集一批可用的免费或付费代理IP端口,格式为'http://user:pass@host:port'或'http://host:port'。
2、将代理地址存入列表proxy_list,每次请求前使用random.choice()随机选取一个。
3、构建proxies字典,键为'http'和'https',值为选定的代理字符串。
4、在requests请求中传入proxies参数,并捕获requests.exceptions.ProxyError、requests.exceptions.ConnectTimeout等异常,触发异常时跳过当前代理并重试下一条。
三、结合延迟与请求间隔控制
即使具备随机User-Agent和代理,密集请求仍会暴露爬虫行为。需模拟人类操作节奏,降低单位时间请求数量。
1、导入time模块,在每次请求完成后调用time.sleep()暂停指定秒数。
2、避免固定延时,改用random.uniform(1.5, 4.5)生成浮动等待时间,使间隔不可预测。
3、禁止在for循环开头直接sleep,必须放在requests调用之后,否则首次请求前也会无意义等待。
四、使用Session对象复用连接
频繁新建TCP连接不仅效率低,也增加被识别风险。Session可复用底层连接、自动管理cookies,并提升请求稳定性。
1、创建session = requests.Session()实例,替代直接使用requests.get()。
2、将随机User-Agent写入session.headers['User-Agent'],后续所有请求自动携带。
3、每次请求前更新proxies参数,但保持session对象在整个爬取过程中复用。
4、务必在全部请求结束后调用session.close(),防止资源泄漏。
五、动态解析并轮换请求头其他字段
部分站点还会校验Accept、Accept-Language、Referer等字段的一致性与合理性,静态设置同样存在风险。
1、为Accept、Accept-Language、Connection等字段分别准备多组合法值列表。
2、每次请求前,对每个字段独立调用random.choice()获取新值,并更新session.headers。
3、Referer字段应与当前请求URL同域,可构造如f"https://{parsed_url.netloc}/"作为基础值再随机附加路径。
4、禁止将Referer设为与目标域名完全无关的地址,否则可能被立即拒绝。











