我正在编写一个 Python 脚本,使用 BeautifulSoup 从 Investing.com 抓取历史 CDS 数据。目标是从页面上的特定表中提取数据并将其编译成 DataFrame。
这是我的代码的核心部分:
lista_cds = ['cds-1-year', 'cds-2-year', 'cds-3-year',
'cds-4-year', 'cds-5-year', 'cds-7-year', 'cds-10-year']
headers = {'user-agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/106.0.0.0 Safari/537.36'}
lista_dfs = []
for ano_cds in lista_cds:
url = f'https://br.investing.com/rates-bonds/brazil-{ano_cds}-usd-historical-data'
req = Request(url, headers=headers)
page = urlopen(req)
soup = BeautifulSoup(page, features='lxml')
table = soup.find_all("table")[0]
df_cds = pd.read_html(StringIO(str(table)))[0][['Último', 'Data']]
问题:当我尝试从第一个表 (tables[0]) 中抓取数据时,我收到 HTTP 错误 404:未找到。然而,当我切换到第二个表(tables[1])时,代码工作得很好,但这不是我需要的表。
有趣的是,其他人运行了完全相同的代码,针对表 [0],并且它对他们来说非常有效。这让我相信问题可能不在于代码本身,而可能与特定环境或服务器的特殊响应有关。
但我不确定这个人是否在撒谎或其他什么。
我的环境:
您的
lista_cds
值有误,除了 years
之外的所有元素都应该是 year
而不是 cds-1-year
。
您也可以直接使用
pandas.read_html
,无需urllib/BeautifulSoup。
试试这个代码:
import pandas as pd
lista_cds = ['cds-1-year', 'cds-2-years', 'cds-3-years', 'cds-4-years', 'cds-5-years', 'cds-7-years', 'cds-10-years']
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36'}
url = 'https://br.investing.com/rates-bonds/brazil-{}-usd-historical-data'
lista_dfs = [pd.read_html(url.format(ano_cds), storage_options=headers)[0][['Último', 'Data']] for ano_cds in lista_cds]
print(lista_dfs)