使用Python requests请求纳斯达克网站获取股息数据时挂起
问题分析与解决办法
你的脚本挂起并非网站封禁了requests模块,而是纳斯达克的反爬机制识别出请求来自脚本,通过挂起连接的方式拦截(这是反爬的常见手段,区别于直接返回错误码)。请求谷歌正常是因为其反爬策略相对宽松,未触发拦截规则。
可行解决办法
1. 添加模拟浏览器的请求头
默认requests的请求头会暴露脚本身份,添加浏览器标识的User-Agent可绕过基础检测,同时建议设置超时避免无限挂起:
import requests 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" } dividends_url = "https://www.nasdaq.com/market-activity/stocks/hd/dividend-history" response = requests.get(dividends_url, headers=headers, timeout=10) print(response.status_code)
2. 处理动态加载内容
纳斯达克的股息数据大概率是通过JavaScript动态渲染的,直接用requests只能拿到静态HTML框架,无法获取实际数据。可使用浏览器自动化工具模拟渲染:
from selenium import webdriver from selenium.webdriver.chrome.options import Options options = Options() options.add_argument("--headless=new") # 无头模式,不显示浏览器窗口 driver = webdriver.Chrome(options=options) driver.get("https://www.nasdaq.com/market-activity/stocks/hd/dividend-history") driver.implicitly_wait(10) # 等待数据加载完成 page_source = driver.page_source # 后续可从page_source中提取目标数据 driver.quit()
3. 遵守爬虫协议
先查看纳斯达克的robots.txt文件,确认目标爬取路径是否被允许,避免违反网站规则。
4. 控制请求频率
若需多次请求,添加随机间隔时间,避免因请求过于频繁触发频率限制:
import time import random # 每次请求后随机等待1-3秒 time.sleep(random.uniform(1, 3))
内容的提问来源于stack exchange,提问作者codyc4321
相关产品推荐
相关产品推荐

