使用BeautifulSoup爬取雅虎财经返回404 无法获取正确soup对象
问题原因
雅虎财经配置了反爬策略,会校验HTTP请求头的User-Agent字段,默认requests库发送的请求会携带暴露爬虫身份的UA标识,因此被服务端拦截返回404页面。
解决步骤
- 构造合规的请求头,模拟浏览器的UA标识即可正常请求:
from bs4 import BeautifulSoup import requests # 构造请求头,模拟Chrome浏览器访问 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' } # 发送请求时传入headers参数 response = requests.get('https://finance.yahoo.com/quote/FBRX/profile?p=FBRX', headers=headers) # 可先判断状态码是否正常再解析 if response.status_code == 200: soup = BeautifulSoup(response.text, 'lxml') print(soup) else: print(f"请求失败,状态码:{response.status_code}")
- 如果添加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/avif,image/webp,image/apng,*/*;q=0.8', 'Accept-Language': 'zh-CN,zh;q=0.9', 'Accept-Encoding': 'gzip, deflate, br', 'Connection': 'keep-alive', 'Upgrade-Insecure-Requests': '1' }
注意事项
- 不要高频发送请求,避免触发IP限流规则,可适当添加
time.sleep()设置请求间隔 - 如果需要批量抓取数据,建议搭配代理IP池使用,降低被封IP的风险
内容的提问来源于stack exchange,提问作者Aashish Pal
相关产品推荐
相关产品推荐

