Python3使用urllib2请求特定URL出现405 Method Not Allowed错误
解决网页爬取时的HTTP Error 405: Method Not Allowed问题
你遇到的这个405错误,本质是服务器拒绝了你的请求——要么是默认的GET请求被网站的反爬规则拦截,要么是你的请求没有模拟正常浏览器的特征,被识别成了爬虫。结合你的代码,我给你两个关键修复点:
1. 模拟浏览器请求头,绕过基础反爬
urllib2.urlopen默认发送的请求没有携带完整的浏览器标识(User-Agent),很多网站会直接拒绝这种“裸请求”。你需要创建Request对象并添加请求头,让服务器认为你是正常用户访问:
from bs4 import BeautifulSoup import urllib.request as urllib2 url = "http://www.scmp.com/news/world" # 模拟Chrome浏览器的请求头,你也可以换成其他主流浏览器的UA headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8' } # 用Request对象包装请求,带上自定义headers req = urllib2.Request(url, headers=headers) page = urllib2.urlopen(req) soup = BeautifulSoup(page, "html.parser") # 注意class参数的正确写法 item = soup.find_all("h3", class_="node-title lvl_24-title") print(item)
2. 修正BeautifulSoup的class匹配写法
你的原代码里用了_class,这是错误的!在Python中class是关键字,所以BeautifulSoup规定用class_(末尾加下划线)来匹配HTML的class属性,也可以通过attrs字典传递:
# 两种写法等价,任选其一即可 item = soup.find_all("h3", attrs={"class": "node-title lvl_24-title"})
额外注意事项
如果添加请求头后还是遇到问题,可能是网站有更严格的反爬策略:
- 可以尝试补充更多请求头字段(比如
Accept-Language、Referer),让请求更接近真实浏览器的请求格式 - 考虑使用
urllib2.HTTPCookieProcessor维持会话,模拟用户的连续浏览状态 - 若频繁请求被封禁,可能需要使用代理IP分散请求来源
内容的提问来源于stack exchange,提问作者Tayyab Nasir




