You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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-LanguageReferer),让请求更接近真实浏览器的请求格式
  • 考虑使用urllib2.HTTPCookieProcessor维持会话,模拟用户的连续浏览状态
  • 若频繁请求被封禁,可能需要使用代理IP分散请求来源

内容的提问来源于stack exchange,提问作者Tayyab Nasir

火山引擎 最新活动