Python 从yahoo finance中提取期权日期

Python 从yahoo finance中提取期权日期,python,beautifulsoup,python-requests,Python,Beautifulsoup,Python Requests,我无法从以下url的下拉菜单中提取选项日期“ url=“” 我试图通过BeautifulSoup找到合适的标记,但它似乎是用Javascript呈现的? 我试着查看network选项卡,看看是否有一些json数据被用来填充菜单。我想不出来。在这种情况下,我是被迫使用selenium吗? 硒是重而慢的 以下是我正在尝试的: url = 'https://finance.yahoo.com/quote/AAPL/options?p=AAPL' response = requests.

我无法从以下url的下拉菜单中提取选项日期“

url=“”

我试图通过
BeautifulSoup
找到合适的标记,但它似乎是用Javascript呈现的? 我试着查看
network
选项卡,看看是否有一些json数据被用来填充菜单。我想不出来。在这种情况下,我是被迫使用selenium吗? 硒是重而慢的

以下是我正在尝试的:

    url = 'https://finance.yahoo.com/quote/AAPL/options?p=AAPL'
    response = requests.get(url)
    with open('testing.html', 'wb') as f:
        f.write(response.content)
    soup = BeautifulSoup(response.content, 'html.parser')
试图捕获各种元素,但我似乎无法捕获选项数据

print(soup.find('div', {"class": "Cf Pt(18px) controls"}))
print(soup.find('select'))
dates =soup.find('div', class_ = "Fl(start) Pend(18px) option-contract-control drop-down-selector")
print(dates)
然而,我大部分时间都是返回
None
。在将
html
保存到一个文件并打开它之后,似乎 选项下拉菜单缺失,因此我很可能无法捕获
javascript

部分。

是的,正如Demian建议的那样,您可以使用yfinance python包。看起来您可以执行以下操作

import yfinance as yf
aapl = yf.Ticker("AAPL")

# show options expirations
aapl.options

做你想做的事情的最好、最清晰和最具python风格的方法是使用API(参见@LoganGeorge前面的答案)

但是,如果你想自己做任何事情,你最多可以有三种方法:

1) 使用
请求
从Yahoo的API获取JSON(在这种情况下,以及在大多数其他API可用的情况下,这是一种比抓取网页更好的方法),然后使用
JSON
模块将其转换为Python字典,并获取必要的密钥

您可以尝试在浏览器的DevTools中找到这样的请求,并用Python实现它们。幸运的是,有一个API。此外,它是开放的,因此不需要为请求指定头和cookie。但是对于需要它的情况,请参见此

2) 使用
请求获取HTML页面
,并使用
BeautifulSoup
获取必要的数据(您已经尝试过的)

不幸的是,在这种特殊情况下,您无法删除该下拉选择框,因为它是在客户端使用JavaScript生成的,而
请求
按原样从服务器获取页面“没有执行任何客户端代码。在这里使用刮削的唯一方法是从浏览器下载就绪页面并将其传递给BeautifulSoup,但它没有任何意义

3) 使用Selenium(注意:通常情况下,如果您使用它不是为了测试目的,而是为了创建一个API、您自己的应用程序,并且您需要快速完成所有操作,而不打开任何窗口,那么这是一个糟糕的解决方案)。但是,如果没有API,并且内容是在客户端生成的,那么您需要快速完成所有操作,打开浏览器窗口和安装webdriver对您来说不是什么大问题,它可能会对您有很大帮助)


注意:请求以及BeautifulSoup和Selenium不是内置的Python包。不要忘记使用
pip安装请求
pip install-beauthoup4
。对于Selenium安装,请看

为什么要重新发明轮子?试着用这个代替。@DemianWolf谢谢。主要是为了学习,谢谢。虽然我希望学习如何在没有API的情况下完成它,因为它更多的是为了学习。
import datetime
import json

import requests


url = "https://query1.finance.yahoo.com/v7/finance/options/AAPL"
timestamps = json.loads(requests.get(url).content)["optionChain"]["result"][0]["expirationDates"]
dates = [datetime.date.fromtimestamp(timestamp) for timestamp in timestamps]