用 AI 写 Python 爬虫
AI帮你写爬虫却被反爬盯上?从服务器端破解反爬的实操方法
很多朋友用 AI(比如 ChatGPT)快速生成了一段 Python 爬虫代码,一运行就被目标网站封了 IP 或弹出验证码。
这不是代码写错了,而是触发了服务器的反爬虫机制。作为服务器运维博主,我习惯从“怎么让爬虫看起来更像正常人”的角度解决问题。
下面我会从准备环境开始,一步一步带你在自己的服务器上配置出能绕过常规反爬的爬虫。
准备工作:你需要一台服务器和基础环境
- 一台云服务器(推荐 2 核 2G 以上,系统用 CentOS 7 或 Ubuntu 20.04)
- 已安装宝塔面板(方便快速管理环境,也支持手动装 Python)
- Python 3.8+ 和 pip(宝塔自带 Python 项目管理器,也可以直接
yum install python3 -y) - 一个用于测试爬虫的目标网站(建议先用公开 API 或静态页面试)
小提示:如果还没装宝塔,去 bt.cn 复制安装命令一键安装即可。
爬虫项目可以放在 /www/wwwroot/spider 目录,方便管理。
第一步:让 AI 生成的代码“穿上衣服”——修改请求头
AI 写的爬虫往往只带默认的 User-Agent,比如 python-requests/2.28.0,服务器一看就知道是爬虫。
你需要在代码里伪装成普通浏览器。
import requests
from fake_useragent import UserAgent
ua = UserAgent()
headers = {
'User-Agent': ua.random,
'Referer': 'https://www.baidu.com/',
'Accept-Language': 'zh-CN,zh;q=0.9'
}
response = requests.get('你的目标网址', headers=headers, timeout=10)
如果你用的宝塔面板,可以把这段代码放到 /www/wwwroot/spider/ 下的 .py 文件里,用宝塔的“Python 项目管理器”添加项目,选择 Python 版本和入口文件,然后启动。
效果是每次请求的浏览器标识都不同。
第二步:用代理 IP 池绕开 IP 封禁
即使改了请求头,同一个 IP 频繁请求仍然会被 ban。
解决方法是用代理,每次请求换一个 IP。
这里推荐免费代理池方案(仅供学习,正式项目请用付费稳定代理)。
- 安装代理切换库
pip install requests random(随机选择) - 准备一个代理列表,或者通过免费 API 获取动态代理。
- 在代码中每次请求时随机选择一个代理。
proxies = {
'http': 'http://代理IP:端口',
'https': 'http://代理IP:端口'
}
response = requests.get(url, headers=headers, proxies=proxies, timeout=10)
重要:免费代理速度慢且不稳定,建议在宝塔面板中设置定时任务(每分钟清理无效代理),或者直接使用云服务器的弹性公网 IP 切换功能(比如阿里云弹性公网IP切换)。
第三步:添加随机延时,模拟人类操作
连续快速请求也是被反爬的主要原因。
在每次请求之间加入随机暂停。
import time
import random
time.sleep(random.uniform(1, 3)) # 随机等待1-3秒
如果爬虫需爬取大量页面,建议配合请求重试机制(比如 requests.adapters.HTTPAdapter 设置重试次数)。
避坑指南:最容易踩的 3 个坑
- 代理未验证可用性:免费代理经常失效,请求前最好先测试一下代理是否可用,否则会报 ConnectionError。可以在代码里加 try/except 并更换下一个代理。
- 忘记处理 Cookie:有些网站需要维持会话,比如登录态。你需要在 AI 生成的代码里检查是否需要
cookies参数或session对象。建议统一用requests.Session()。 - 爬取频率依然太高:即使设置了随机延时,如果目标网站有严格的频率限制(比如 1 秒 1 次),你仍然会被封。这时要把延时范围设大(比如 3-6 秒),或者用爬虫框架自带的限速功能(如 Scrapy 的
DOWNLOAD_DELAY)。
效果验证:如何确认反爬已被绕过
- 状态码:正常返回 200,而不是 403、503 或 429。
- 响应内容:检查
response.text里是否包含验证码页面、空页面或错误提示。 - 连续运行 10 分钟以上,观察 IP 是否被拉黑(可通过 ssh 登录服务器,用
curl -I 目标网址查看返回头)。
你也可以在宝塔面板的“计划任务”里每分钟执行一次爬虫测试脚本,并日志记录状态码和耗时,方便排查。
高频问题解答
Q:用了代理和延时,还是被封怎么办?
A:检查代理来源是否太单一(多个 IP 但属于同一 C 段),或者目标网站有更高级的反爬(比如检测浏览器指纹)。这时可以尝试改用 Selenium 模拟真实浏览器,在服务器上安装 headless Chrome 并启动。
Q:AI 生成的代码中有很多冗余或错误,怎么快速修正?
A:让 AI 自行审查代码,或直接告诉 AI“帮我添加代理支持、随机 User-Agent 和延时”。如果报错,把报错信息复制给 AI,一般能直接给出修复方案。
Q:在宝塔面板里运行爬虫需要注意什么?
A:宝塔默认 Python 环境可能缺少某些库,需要手动 pip install。推荐用“Python 项目管理器”创建虚拟环境,避免依赖冲突。还有,不要在面板后台直接运行死循环爬虫,建议写成定时任务来控制运行时长。
如果你正在处理用 AI 写 Python 爬虫却被反爬盯上的情况,建议先从修改请求头和加延时开始,再逐步加入代理。
每一步改动后都用上面的方法验证,遇到异常优先回看本文的避坑部分。
稳住节奏,你的爬虫就能稳定跑下去。