如何避免PythonAnywhere爬虫触发HTTP Error 418: You look like a robot错误?
解决PythonAnywhere部署爬虫时的418错误
你的推测完全站得住脚。PythonAnywhere的服务器IP是共享资源,大量用户用这些IP跑爬虫,目标网站很容易把这类IP归为“机器人”范畴,直接返回418错误——这是网站专门用来识别非人类访问的标志性状态码。当然也不排除你的请求头过于简单,没有模拟正常浏览器的请求特征,但IP被标记是最常见的诱因。
下面是几个有效的规避方案:
- 补全请求头,模拟浏览器行为:默认的urllib请求头非常简陋,很容易被识别。至少要带上
User-Agent,最好补充Accept、Accept-Language等字段,让请求看起来更像正常用户的访问。示例代码:from urllib.request import Request, urlopen target_url = "你要爬取的首页URL" # 复制真实浏览器的请求头,这里用Chrome的示例 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36", "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", "Accept-Language": "zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3" } req = Request(target_url, headers=headers) try: response = urlopen(req) # 处理响应内容 except Exception as e: print(f"请求出错: {e}") - 更换代理IP:既然PythonAnywhere的共享IP被拉黑,那就换个IP访问。可以选择免费代理(注意筛选稳定性),或者付费的代理服务,在urllib中配置代理的示例:
from urllib.request import Request, ProxyHandler, build_opener proxy_info = { "http": "http://your-proxy-ip:port", "https": "https://your-proxy-ip:port" } proxy_handler = ProxyHandler(proxy_info) opener = build_opener(proxy_handler) target_url = "你要爬取的首页URL" req = Request(target_url, headers=headers) try: response = opener.open(req) # 处理响应内容 except Exception as e: print(f"代理请求出错: {e}") - 控制请求节奏,添加随机延迟:短时间内高频请求是爬虫的典型特征,给请求之间加上随机延迟,模拟人类浏览的间隔。比如:
import time import random # 每次请求后随机等待1-3秒 time.sleep(random.uniform(1, 3)) - 遵守网站爬虫协议:先访问目标网站的
/robots.txt文件,确认网站是否允许爬虫访问你要爬取的内容,遵守规则能降低被拦截的概率。
内容的提问来源于stack exchange,提问作者Paul Ahuevo
相关产品推荐
相关产品推荐

