从定期回调抛出的散景错误

时间:2017-09-21 08:57:20

标签: python python-3.x web-scraping bokeh

我正在关注Bokeh的Udemy教程,并且我遇到了一个错误,我无法弄清楚如何解决,并且没有收到导师的回复。最初,我认为我的代码有问题,所以花了大约一个星期试图找出它并最终放弃并复制导师代码只是为了发现错误仍然存​​在。

代码的目的是抓取并绘制实时数据。代码如下:

from bokeh.io import curdoc
from bokeh.models import ColumnDataSource, DatetimeTickFormatter
from bokeh.plotting import figure
from random import randrange
import requests
from bs4 import BeautifulSoup

# Create the figure
f = figure()

# Create webscraping function
def extract_value():
    r = requests.get("https://bitcoincharts.com/markets/okcoinUSD.html", headers = {'User-Agent' : 'Chrome'})
    c = r.content
    soup = BeautifulSoup(c, "html.parser")
    value_raw = soup.find_all("p")
    value_net = float(value_raw[0].span.text)
    return value_net

# Create ColumnDataSource
source = ColumnDataSource(dict(x = [], y = []))

# Create glyphs
f.circle(x = 'x', y = 'y', color = 'olive', line_color = 'brown', source = source)
f.line(x = 'x', y = 'y', source = source)

# Create periodic funtion
def update():
    new_data = dict(x = [source.data['x'][-1]+1], y = [extract_value])
    source.stream(new_data, rollover = 200)
    print(source.data) # Displayed in the commmand line!

# Add a figure to curdoc and configure callback
curdoc().add_root(f)
curdoc().add_periodic_callback(update, 2000)

投掷:

  

周期性回调引发的错误:IndexError('列出索引   范围',)

关于这里发生了什么的任何想法?

1 个答案:

答案 0 :(得分:1)

更改您的更新功能,如下所示:

# Create periodic funtion
def update():
    if len(source.data['x']) == 0:
        x = 0
    else:
        x = source.data['x'][-1]+1

    new_data = dict(x = [x] , y = [extract_value()])
    print("new_data", new_data)
    source.stream(new_data, rollover = 200)
    print(source.data) # Displayed in the commmand line!

您的代码存在两个问题:

  1. 您没有调用 extract_value函数,但您只需将其分配给y。因此,y将不包含返回的值。
  2. source.data['x']是第一次调用update()时的空列表。因此,您尝试访问空列表的最后一个元素(通过[-1])。这会给你带来错误IndexError('list index out of range')
  3. 1的解决方案是微不足道的。对于2,它类似于您之前尝试过的操作。但首先检查source.data ['x']是否为空。第一次更新时就是这种情况。在那里,您将x设置为0.在执行后,当列表非空时,您将获取列表中的最后一个值并将其递增1。