我正在研究一个学校项目,以获取JPMorgan Website上的实时股价。我想获取<div class="price_area">
中显示的所有数据。我已经尝试了beautifulsoup和yahoo api,但仍然无法获得我想要的东西。因此,这是我第一次尝试硒,但我不知道如何通过它运行javascript。这是我的代码:
def getStockPrice():
driver = webdriver.Chrome()
driver.get("http://www.jpmhkwarrants.com/en_hk/market-statistics/underlying/underlying-terms/code/1")
try:
stock_index = WebDriverWait(driver, 10).until(
driver.find_element_by_class_name('price_area').find_element_by_class_name('price')
)
finally:
driver.quit()
但是它显示错误'WebElement'是不可调用的。我如何获得实时价格,涨跌百分比和开盘价。谢谢。
答案 0 :(得分:2)
要在.find_element_by_*
中使用WebDriverWait
,必须使用lambda
之类的功能
stock_index = WebDriverWait(driver, 10).until(
lambda d: d.find_element_by_class_name('price_area').find_element_by_class_name('price')
)
不要忘记致电.text
来获取内容
def getStockPrice():
driver = webdriver.Chrome()
driver.get("http://www.jpmhkwarrants.com/en_hk/market-statistics/underlying/underlying-terms/code/0700")
try:
stock_index = WebDriverWait(driver, 10).until(
lambda x: x.find_element_by_class_name('price_area')
)
price = stock_index.find_element_by_class_name('price')
percentage = stock_index.find_element_by_css_selector('.percentage.rise')
open_price = stock_index.find_element_by_css_selector('ul li span')
print('Current price: ' + price.text)
print('Percentage: ' + percentage.text)
print('Open price: ' + open_price.text)
except:
print('wait timeout, element not found')
finally:
driver.quit()
答案 1 :(得分:1)
您可以使用requests
和BeautifulSoup
来获取通过Ajax查询字符串调用提到的三个项目
import requests
from bs4 import BeautifulSoup
url= 'http://www.jpmhkwarrants.com/en_hk/ajax/terms_quick_search?_=1543832902362'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
items = [item.text for item in soup.select('.price,.percentage.rise,li:nth-of-type(3) span')]
print(items)
结果:
实时框具有自己的Ajax调用:
http://www.jpmhkwarrants.com/en_hk/ajax/market-terms-real-time-box/code/0700?_=1543832902364
您可以使用它来检索该框中的所有项目。
import requests
from bs4 import BeautifulSoup
url= 'http://www.jpmhkwarrants.com/en_hk/ajax/market-terms-real-time-box/code/0700?_=1543832902364'
res = requests.get(url)
soup = BeautifulSoup(res.content, "lxml")
items = [item.text.strip().split('\n') for item in soup.select('.price_area div')]
tidied = [item for sublist in items for item in sublist if item and item !='Change (%)']
print(tidied)
结果:
答案 2 :(得分:1)
该数据不是实时的。
通常您必须为实时数据付费。
如果您的项目涉及任何类型的纸张交易/分析,请知道从刮擦中拉出的所有物品可能会延迟5-15分钟。 我听说Bloomberg有免费的api,但我不知道实时数据是否免费。 签出Interactive Brokers API。我敢肯定,对数据的访问是免费的,它使您可以连接到模拟交易帐户来测试策略和算法。