爬虫抓取失败原因排查指南:从零开始找出问题
爬虫抓取失败原因排查指南:从零开始找出问题
刚写好的爬虫脚本,运行后返回空空如也,或者直接报错——这是新手最常见也最头疼的问题。爬虫抓取失败原因往往集中在网络、请求头、反爬机制和动态内容这几个环节。
下面按照从外到内的顺序,一步步帮你定位并解决。
做好这几项准备工作
在动手排查之前,先确保本地环境能用。
推荐用 Python 3.8+,并安装 requests 和 beautifulsoup4 库。
打开终端或命令提示符执行:
pip install requests beautifulsoup4
然后准备一个目标 URL,比如 https://httpbin.org/get(这是一个会返回请求信息的测试站点),后面所有测试都基于这个地址。
第一步:检查网络连通性
爬虫抓取失败原因中,网络不通是最简单但也最容易被忽略的。
在终端里执行 ping 命令测试:
ping httpbin.org
如果能收到回复(如 64 bytes from ...),说明网络正常。
如果超时或请求失败,请检查你的代理设置或防火墙是否阻挡了出站连接。
另外,服务器如果在国内,访问国外站点可能被墙,需要配好透明代理。
第二步:用简易脚本复现请求
写一个最简单的 Python 脚本来看看是不是代码本身的问题:
import requests
url = "https://httpbin.org/get"
try:
resp = requests.get(url, timeout=10)
print("状态码:", resp.status_code)
print("响应头:", resp.headers)
except Exception as e:
print("请求异常:", e)
如果返回 200,说明基础抓取没问题,问题出在你的具体目标站上。
如果返回非 200 或者报 ConnectionError/Timeout,则继续排查。
第三步:分析常见失败状态码
- 403 Forbidden:服务器拒绝访问,通常因为缺少合法的 User-Agent 或被识别为爬虫。解决方案:伪装请求头,加入浏览器的 User-Agent 和 Referer。
- 429 Too Many Requests:请求频率过高触发限流。需要降低请求间隔(如每次请求后
time.sleep(1)),或使用代理 IP 池。 - 503 Service Unavailable:服务器暂时过载或屏蔽了你的 IP。可尝试更换 IP 或等待后重试。
- 404 Not Found:目标 URL 无效或已变更,检查地址是否正确。
实战中,伪装 User-Agent 是最基础的防屏蔽手段。
添加请求头示例:
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36",
"Referer": "https://httpbin.org/"
}
resp = requests.get(url, headers=headers, timeout=10)
第四步:处理 cookies 和动态加载
有些站点需要登录后的 cookies 才能访问数据。
你可以先用浏览器登录,然后从开发者工具(按 F12 → 网络 → 复制请求头里的 Cookie 值)手动添加到脚本中:
cookies = {"sessionid": "你的真实sessionid"}
resp = requests.get(url, cookies=cookies)
另外,如果目标网站数据是通过 JavaScript 动态渲染的,直接用 requests 拿不到真实内容。
这时需要改用 Selenium 或 Playwright 这类无头浏览器。
简单判断方法:在浏览器里右键“查看网页源代码”,如果找不到你要的数据,基本就是动态加载。
避坑指南:高频踩雷点
- 忽略 robots.txt:很多站点在
https://域名/robots.txt里声明了禁止爬取的路径。虽然不遵守不违法,但可能触发法律纠纷或被封 IP,建议先查看并遵守。 - 编码问题:爬回来的文本乱码,一般是没指定正确的编码。可以尝试
resp.encoding = resp.apparent_encoding自动检测。 - 请求超时设置过短:默认
timeout=None会导致无限等待,建议设为 5-10 秒;但某些慢站需要更长,可以动态调整。 - 没有异常处理:网络请求不稳定,务必用
try...except包住,并在出错后捕获异常、打印详细信息。
效果验证:确认你的修复生效
用修复后的脚本再次请求目标站点,打印状态码和响应体的前 200 字符:
if resp.status_code == 200:
print("内容预览:", resp.text[:200])
else:
print("仍然失败,状态码:", resp.status_code)
如果 200 且内容符合预期(比如包含目标标题或数据片段),则问题已解决。
如果仍有失败,请对照本文的步骤逐条复查。
总结
定位爬虫抓取失败原因需要从外到内系统排查:先确认网络,再检查请求头和状态码,然后处理 cookies 和动态加载。
记住,大多数新手问题出在 User-Agent 未伪装或请求频率过高。
按照本文的步骤操作,你的爬虫很快就能正常工作了。
如果遇到特殊反爬策略,欢迎在评论区留言,我会继续帮你分析。