Python用requests+BeautifulSoup爬取网页出现403、400错误如何解决
问题原因
- 初始无请求头访问返回403,是因为目标站点拦截了无User-Agent标识的爬虫请求,requests默认的UA会被识别为爬虫直接拒绝。
- 加请求头后返回400的原因有两个:
- 请求头字段名拼写错误,你定义的header键为
User Agent(中间为空格),HTTP标准的UA字段名是User-Agent(中间为半角横杠),错误的字段名会导致服务端无法解析请求,返回400错误。 - 代码存在变量覆盖问题:你先发送带header的请求后,又执行了不带header的
html_doc=requests.get(x),覆盖了之前的请求结果,实际解析的还是无header的请求返回内容。
- 请求头字段名拼写错误,你定义的header键为
优化方案
你后续使用Session的修复方案已经解决了核心问题,也可以用普通get请求实现,适配性更高的版本如下:
import requests from bs4 import BeautifulSoup url = 'https://www.topstockresearch.com/INDIAN_STOCKS/COMPUTERS_SOFTWARE/Wipro_Ltd.html' headers = { # 使用主流桌面浏览器UA,避免被部分站点拦截老旧移动设备UA 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' } resp = requests.get(url, headers=headers) # 自动匹配页面编码,避免出现中文乱码问题 resp.encoding = resp.apparent_encoding soup = BeautifulSoup(resp.text, 'lxml') print(soup)
注意事项
个人学习用途爬取请合理控制请求频率,避免对站点正常服务造成压力。
内容的提问来源于stack exchange,提问作者Sure Path
相关产品推荐
相关产品推荐

