使用Python爬取REST API时遭遇HTTP 403 Forbidden错误求助
嘿,这个403错误太常见啦——服务器直接把你的爬虫请求给拦下来了!CEX.IO的API会检查请求里的User-Agent字段,你用urllib默认的请求头太“机器化”,一眼就被识别成非人类访问了。
而且哦,你要爬的是REST API,返回的是JSON格式数据,根本不需要用BeautifulSoup来解析HTML,直接用json模块处理就好,省事儿多了。
给你改好的代码,亲测能用:
import json from urllib.request import urlopen, Request my_url = 'https://cex.io/api/ohlcv/hd/20180124/BTC/USD' # 模拟浏览器的请求头,让服务器以为是正常用户访问 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36' } # 创建带请求头的Request对象 req = Request(my_url, headers=headers) with urlopen(req) as uClient: page_json = uClient.read() # 解析JSON数据 data = json.loads(page_json) print(data)
关键点解释:
- 加了
User-Agent请求头,模拟Chrome浏览器的访问行为,服务器就不会轻易拦截你了 - 用
with语句管理请求连接,自动帮你关闭连接,比手动调用close()更安全可靠 - 直接解析API返回的JSON结果,不需要BeautifulSoup,因为这本来就不是HTML页面
你之前遇到的错误信息如下:
Traceback (most recent call last):
File "", line 1, in
File "C:\Users\mubee\Downloads\Annaconda\lib\urllib\request.py", line 223, in urlopen
return opener.open(url, data, timeout)
File "C:\Users\mubee\Downloads\Annaconda\lib\urllib\request.py", line 532, in open
response = meth(req, response)
File "C:\Users\mubee\Downloads\Annaconda\lib\urllib\request.py", line 642, in http_response
'http', request, response, code, msg, hdrs)
File "C:\Users\mubee\Downloads\Annaconda\lib\urllib\request.py", line 570, in error
return self._call_chain(*args)
File "C:\Users\mubee\Downloads\Annaconda\lib\urllib\request.py", line 504, in _call_chain
result = func(*args)
File "C:\Users\mubee\Downloads\Annaconda\lib\urllib\request.py", line 650, in http_error_default
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
内容的提问来源于stack exchange,提问作者Hadi Rajani




