Python3爬取谷歌财经遇HTTP Error 403 Forbidden,如何更换IP?
解决谷歌财经历史数据爬取时IP被封禁的问题
嘿,我懂你现在的困扰——想用Python 3爬取谷歌财经的AMZN历史数据,不仅代码没写完,还碰到了IP被封禁的情况对吧?别慌,咱们一步步来拆解问题,找到可行的解决办法。
首先,先把你没写完的代码补全并修正基础问题,原代码里有拼写错误和未完成的调用,修正后的基础版本大概是这样:
import urllib.request import ssl url = 'http://finance.google.com/finance/historical?q=AMZN' headers = { 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', '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' } context = ssl._create_unverified_context() req = urllib.request.Request(url, headers=headers) try: html = urllib.request.urlopen(req, context=context).read() print(html[:500]) # 打印前500个字符验证请求结果 except urllib.error.HTTPError as e: print(f"请求错误: {e.code}") except Exception as e: print(f"其他错误: {str(e)}")
不过就算补全了代码,你还是可能碰到IP封禁,这是因为谷歌财经有严格的反爬机制,单一IP频繁请求或者请求特征太像爬虫,都会被拦截。下面是几个实用的解决思路:
- 优化请求头,模拟真实浏览器:除了
User-Agent,你可以再加几个字段让请求更“真人化”,比如Referer(设置为谷歌首页)、Accept-Language(比如en-US,en;q=0.9),避免被识别为机器请求。 - 添加请求延迟:每次请求后用
time.sleep()停顿3-5秒,不要短时间内连续发起请求,降低被检测的概率。 - 使用代理IP轮换:找一些可靠的代理IP池,每次请求随机切换代理,这样谷歌就不会盯着单一IP封禁了。注意要提前验证代理的可用性,避免用无效代理浪费时间。
- 改用第三方库(最推荐):自己写爬虫要处理各种反爬太麻烦,不如用现成的库,比如
yfinance——它原本针对雅虎财经,但也能获取类似的股票历史数据,而且封装了所有反爬逻辑,调用非常简单:
import yfinance as yf # 获取AMZN的历史数据 amzn = yf.Ticker("AMZN") # 可以指定时间范围,比如最近1年的每日数据 hist = amzn.history(period="1y") # 打印数据前几行查看结果 print(hist.head())
- 注意谷歌财经的端点变化:谷歌财经的历史数据页面URL可能已经更新,你可以先手动访问原URL看看是否还能正常打开,如果页面结构变了,原爬虫逻辑也得跟着调整。
最后提醒一下,就算用了上面的方法,也不要过度请求,遵守网站的robots.txt规则,避免给服务器造成太大压力哦。
内容的提问来源于stack exchange,提问作者econofutmist
相关产品推荐
相关产品推荐

