网页抓取与交互网页

时间:2021-02-15 18:57:20

标签: python web-scraping

我正在做一个需要财务数据的项目,我需要从雅虎财经中抓取历史数据,但是例如在该页面中的https://finance.yahoo.com/quote/ETH-USD/history?p=ETH-USD,我需要调整时间间隔并按下下载按钮,我该怎么做用蟒蛇做吗?我应该自动完成这项任务。

抱歉我的语法错误,我的母语不是英语。

3 个答案:

答案 0 :(得分:1)

为了让你从雅虎财经中提取数据,你可以使用一个名为yfinance的python库

在您的情况下,通过使用此库,您将执行以下操作:

import yfinance as yf

tickers = yf.Tickers('ETH')

eth_history = tickers.tickers.ETH.history(period="1y")

然后你可以对这些数据做任何你想做的事情(例如保存在电子表格中)。

答案 1 :(得分:0)

您可以使用实现 Chrome DevTools 协议 (CDP) 的库来自动化 Chrome 浏览器或无头 Chromium 浏览器(或任何支持此协议的浏览器)。

这是我通过搜索找到的一个库:https://github.com/hyperiongray/trio-chrome-devtools-protocol,但我确定还有其他库。我个人没有使用过。

答案 2 :(得分:0)

您可以使用 Selenium WebDriver 加载页面,WebElement 包含下载按钮和 click() 它,但与直接调用 API 相比,这将是一个缓慢而脆弱的解决方案。

我解决这个问题的方法是对雅虎财经 URL 进行逆向工程,并使用请求库获取数据。结果是包含您要查找的历史数据的 CSV。

如果您查看下载 URL...URL 查询参数很容易理解。

https://query1.finance.yahoo.com/v7/finance/download/ETH-USD?period1=1581795382&period2=1613417782&interval=1d&events=history&includeAdjustedClose=true

我们可以看到要修改的关键组件是股票代码、日期范围和间隔。在代码中...

import csv
from datetime import datetime, timedelta
from io import StringIO

import requests


ticker = 'ETH-USD'
url = f'https://query1.finance.yahoo.com/v7/finance/download/{ticker}'
now = datetime.now()
start_ts = int((now - timedelta(days=365)).timestamp())
end_ts = int(now.timestamp())
params = {
    'period1': start_ts,
    'period2': end_ts,
    'interval': '1d',
    'events': 'history',
    'includeAdjustedClose': True,
}

result = requests.get(url, params=params)

f = StringIO(result.content.decode('utf-8'))
reader = csv.reader(f, delimiter=',')
for row in reader:
    print('\t'.join(row))