python - 网页抓取 CNBC 美国财政部页面
问题描述
我正在尝试抓取 CNBC 美国国债收益率表https://www.cnbc.com/us-treasurys/但一无所获。这是我的代码:
import requests
from bs4 import BeautifulSoup
url='https://www.cnbc.com/us-treasurys/'
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT x.y; Win64; x64; rv:10.0) Gecko/20100101 Firefox/10.0 '}
page=requests.get(url,headers=headers)
soup=BeautifulSoup(page.content,'lxml')
print('Page status code',page.status_code)
#
output=[]
mydata=soup.find_all('td',class_="BasicTable-unchanged BasicTable-numData")
for tag in mydata:
output.append(tag.text.strip())
print(output)
即使我使用 Google Chrome 仔细检查了页面,它也不会产生任何输出。单个报价页面(例如https://www.cnbc.com/quotes/US6M )的类似代码运行良好,但循环浏览所有 11 个到期日太慢了。为了速度,我想一次刮掉整个桌子。任何想法如何做到这一点?
解决方案
您在页面上看到的数据是通过 JavaScript 动态加载的。requests
您可以使用模块模拟 Ajax 请求。例如:
import json
import requests
url = "https://quote.cnbc.com/quote-html-webservice/quote.htm"
params = {
"noform": "1",
"partnerId": "2",
"fund": "1",
"exthrs": "0",
"output": "json",
"symbolType": "issue",
"symbols": "5093148|5093149|5093150|15183113|5093151|5093158|5093159|19892965|5093160|135058359|5093168",
"requestMethod": "extended",
}
data = requests.get(url, params=params).json()
# uncomment this to print all data:
# print(json.dumps(data, indent=4))
for q in data["ExtendedQuoteResult"]["ExtendedQuote"]:
print(
"{:<8} {:>8} {:>8}".format(
q["QuickQuote"]["symbol"],
q["QuickQuote"]["last"],
q["QuickQuote"]["change"],
)
)
印刷:
US1M 0.053 0.002
US3M 0.053 0.00
US6M 0.053 0.00
US1Y 0.066 0.00
US2Y 0.22 -0.002
US3Y 0.403 -0.008
US5Y 0.79 -0.019
US7Y 1.096 -0.036
US10Y 1.32 -0.05
US20Y 1.865 -0.061
US30Y 1.938 -0.065
推荐阅读
- html - 自定义 404 页面不适用于其他目录
- c# - 自动刷新 Firebase 数据库 Visual Studio C#
- c++ - Mod (%) 运算符在 C++ Visual Studio 中给出不同的输出
- typescript - 如何从 GraphQL 模式生成 GraphQL 操作
- r - 将值与数据框中的前 n 个值进行比较
- sensors - 使用 Omron D6T-8L-09 H 传感器,我们错误地测量了人体温度
- regex - 我的 nginx 正则表达式路由不起作用
- arrays - 如何从 TextField 的控制器获取自定义输入?
- bash - 如何使用 bash 迭代 wp 选项列表输出?
- html - 为什么不能设置头部元素的样式?