首页 > 解决方案 > 网页抓取 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 个到期日太慢了。为了速度,我想一次刮掉整个桌子。任何想法如何做到这一点?

标签: pythonweb-scrapingbeautifulsoup

解决方案


您在页面上看到的数据是通过 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

推荐阅读