爬虫抓取失败防火墙与站点配置双重整改完整清单
为什么爬虫老抓取失败?先想清楚这两个方向
当百度、谷歌或自定义爬虫频繁抓取失败时,绝大多数原因是防火墙策略或站点配置文件做了限制。
防火墙可能直接丢弃或拒绝爬虫 IP,站点配置文件可能设置了过严的访问控制、IP 黑名单或 User-Agent 拦截。
本文整理一套完整的整改清单,按步骤操作即可定位并修复问题。
整改前先把环境摸清楚
在执行操作前,先确认以下信息,避免后续改错文件:
- 操作系统版本:CentOS 7 / Ubuntu 20.04 等
- 使用的防火墙工具:UFW、firewalld、iptables 或宝塔面板自带的系统防火墙
- Web 服务软件:Nginx 或 Apache,最好知道配置文件主目录(如
/etc/nginx/或/etc/httpd/) - 是否有 CDN 或反向代理(如 Cloudflare、阿里云 CDN),若有需要放行回源 IP 段
- 爬虫的 User-Agent 或 IP 段(例如百度蜘蛛的 IP 段会定期更新)
第一步:整改防火墙策略
检查当前防火墙规则
先确认规则是否生效,以 UFW 为例:
sudo ufw status numbered
如果返回 Status: active,说明防火墙正在运行;inactive 的话可暂时跳过后面的防火墙步骤。
对于 iptables 使用:
sudo iptables -L -n --line-numbers
放行爬虫 IP 段
大多数爬虫 IP 段会定期更新,建议从官方文档获取最新范围。
以百度蜘蛛为例,可以在百度站长平台获取 IP 段列表,然后添加到防火墙白名单。
UFW 添加白名单示例:
sudo ufw allow from 123.125.71.0/24 to any port 80
sudo ufw allow from 123.125.71.0/24 to any port 443
iptables 添加白名单示例:
sudo iptables -I INPUT -s 123.125.71.0/24 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -s 123.125.71.0/24 -p tcp --dport 443 -j ACCEPT
添加后务必保存规则(iptables 默认重启丢失,
Ubuntu 可使用 iptables-persistent,
CentOS 可使用 service iptables save)。
检查默认策略
如果默认 INPUT 策略是 DROP,即使添加了白名单还要确认顺序是否在前。
使用 sudo iptables -L -n 查看,ACCEPT 行必须在 DROP 之前。
如果顺序错误,可以用 -I 插入到第一行。
第二步:整改站点配置文件
Nginx 用户请检查这些地方
打开站点配置文件(如 /etc/nginx/sites-available/example.com),找到 server 块,检查是否存在以下限制:
allow/deny指令:如果设置了只允许特定 IP,需要加入爬虫 IP 段。例如:
allow 123.125.71.0/24;
allow all;
注意 allow all 必须放在最后,否则后续 deny 会覆盖。
if ($http_user_agent ~* (badbot|spam)):检查 User-Agent 黑名单中是否误封了正规爬虫。正规爬虫的 User-Agent 一般包含Baiduspider、Googlebot、bingbot等,确认这些没有被列入拒绝规则。limit_req或limit_conn:限流模块可能导致爬虫请求被频繁拒绝。如果触发限制,爬虫会收到 503 或 429 状态码。可以适当调高阈值或对爬虫 IP 段单独放行(使用geo模块区分)。
检查完后执行:
sudo nginx -t
sudo systemctl reload nginx
Apache 用户请检查 .htaccess 或 httpd.conf
Order allow,deny或Require指令:确保没有将爬虫 IP 段设为拒绝。例如正确的写法:
Order Deny,Allow
Deny from all
Allow from 123.125.71.0/24
但更推荐使用 Require 语法(Apache 2.4+):
Require all granted
Require not ip 1.2.3.4
- mod_rewrite 规则:检查是否存在针对 User-Agent 的 RewriteCond 导致爬虫被重定向。
同样执行配置测试:
httpd -t
sudo systemctl reload httpd
避坑说明:这些地方最容易漏掉
- CDN 回源 IP 白名单:如果使用了 Cloudflare 或阿里云 CDN,爬虫访问的是 CDN 节点,但节点回源时用的 IP 段可能不同。需要在防火墙和站点配置中同时放行 CDN 回源 IP 段,否则抓取仍会失败。
- 宝塔面板的“系统防火墙”:宝塔提供独立的防火墙插件(如 Nginx 防火墙),该插件可能会拦截爬虫。需要进入宝塔后台「软件商店」→「Nginx 防火墙」→「全局配置」,检查是否开启了 UA 过滤或 IP 黑名单,并将爬虫 User-Agent 加入白名单。
- 日志是关键证据:不要盲目改配置,先查看访问日志
access.log和错误日志error.log。查找爬虫 IP 的状态码,如果是 403 说明被权限拦截,如果是 503 说明被限流,如果是 200 则说明不是服务器端问题。
效果验证与高频问题解答
怎样确认整改生效?
用 curl 模拟爬虫请求是最直接的方法:
curl -A "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html" -I https://yourdomain.com
如果返回 HTTP/1.1 200 OK 说明站点层面已放行。
同时用 curl -I http://yourdomain.com 不带 User-Agent 验证普通用户访问是否正常,避免误伤。
常见问题
Q:爬虫依然返回 404 或 301?
A:404 说明爬虫抓取的 URL 本身不存在,301 可能被重定向到了其他域名,这些都是站点路由问题,不是防火墙或权限设置。检查 robots.txt 和网站内部链接。
Q:我已经放行了所有已知爬虫 IP,为什么还是有部分抓取失败?
A:部分爬虫使用动态 IP 或反向代理,源 IP 不在官方文档内。建议在配置文件中将默认策略设为 allow all,再通过其他方式(如验证码或 User-Agent 检测)过滤恶意请求,而不是直接屏蔽未知 IP。
Q:修改后访问日志中爬虫请求还是 403?
A:检查是否有 CDN 层面(如 Cloudflare 的 WAF)或 Web 应用防火墙(ModSecurity)的拦截,这些是独立于服务器防火墙和站点配置的另一层屏障。
总结
处理爬虫抓取失败问题,核心思路是先判断是防火墙拦截还是站点配置拦截,然后按清单逐一排查。
本文给出的双重整改清单覆盖了 UFW/iptables 防火墙规则、Nginx/Apache 访问控制、CDN 回源和宝塔面板特殊设置。
按照步骤操作并配合日志验证,绝大多数抓取失败都能解决。
如果你在操作过程中遇到其他异常,欢迎对照清单再次检查,或查看相关服务器配置教程。