如何在表中存储传入的实时数据

时间:2019-06-14 11:58:12

标签: python pandas web-scraping store hdf5

我正在尝试将传入的实时(价格)存储在表中,然后将其导出以进行进一步分析,但是我失败了。 如果有人可以帮助我,那就太好了。

现在,我已经设法编写了一个代码,在网站上取消了价格,但是我不知道如何将传入的数据(价格)存储在表中,因此我可以将其导出以进行进一步分析。 我当时在考虑使用熊猫,但后来我看到了一个关于stackoverflow的话题,他们说hdf5是一种更好的方法,但是我没有实现它。

此处:How to handle incoming real time data with python pandas

import bs4
import requests
from bs4 import BeautifulSoup
import time
import pandas as pd

def real_price():
    r = requests.get('https://fr.finance.yahoo.com/quote/fb?ltr=1')

    soup = BeautifulSoup(r.text,'xml')

    price = soup.find_all('div', {
        'class' : 'My(6px) Pos(r) smartphone_Mt(6px)'
    })[0].find('span').text

    return price

starttime = time.time()

while True:
    print (real_price())
    time.sleep(10.0 - ((time.time() - starttime) % 10.0))

此代码可以正常工作。它每10秒返回一次价格。

1 个答案:

答案 0 :(得分:0)

我想您想用时间戳存储金融工具的价格,以便您可以对时间序列进行排序并使用它。我试过你的代码(它已经一年了,我知道!)但它不能正常工作,有一个基本问题:如果你想寻找“一个特定的”值,例如使用bs4作为抓取工具的股票的最后价格,您不仅需要使用“find_all”方法,还需要在“find_all”-found记录中“find”,以获得一个特定的值。

假设 html 页面包含共享同一类的各种“div”,我们称其为“magic-class”,其中只有一个 div 包含您需要的值,最后价格。因此,您需要找到该类的所有 div,然后,例如使用 for-cycle ,使用该类查找每个 div 中包含的每个值。

因此,这个问题的一部分本质上与您打算抓取的页面的特定结构有关,如果您想将找到的值存储在 Pandas Dataframe 中,这里有一个示例,您可以用作起点:

import urllib.request
from urllib.error import HTTPError, URLError
from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
import random
from datetime import datetime
import time
from http.cookiejar import CookieJar

price_all = pd.DataFrame()

def checkprice():
    url = "https://www.yourlink.com"
    # Request
    user_agents = [ 
        'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.142 Safari/535.19',
        'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:11.0) Gecko/20100101 Firefox/11.0',
        'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.151 Safari/535.19',
        'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.0.3705)',
        'Mozilla/4.0 (compatible; MSIE 6.0; Windows 98; Win 9x 4.90)',
    ]

    cj = CookieJar()
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    opener.addheaders = [('User-agent', user_agents[random.randint(0,4)]) ]
    opener.addheaders = [('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') ]
    # opener.addheaders = [('Accept-Charset', 'ISO-8859-1,utf-8;q=0.7,*;q=0.3') ]
    # opener.addheaders = [('Accept-Language', 'it-IT,it;q=0.8,en-US;q=0.6,en;q=0.4') ]
    # opener.addheaders = [('Accept-Encoding', 'gzip, deflate, sdch') ]
    response = opener.open(url, timeout= 5)

    #choose one webpage parser
    soup = BeautifulSoup(response,'html.parser')
    # soup = BeautifulSoup(response,'html5lib')
    # soup = BeautifulSoup(response,'lxml')


    found_values = soup.find_all('div', class_='magic-class')
    
    if (len(found_values) > 0):
        number_of_values =  len(found_values)

    else:
        print('No value '+ url)
        return


    list_values = []
    list_timestamps = []

    for n in np.arange(0, number_of_values):
        # Getting the values
        title = found_values[n].find('a').get_text()
        list_values.append(title)
        
        #optional: append timestamp:
        timestamp = datetime.fromtimestamp(time.time())
        list_timestamps.append(timestamp)
       
        df_show_info = pd.DataFrame(
            {'Value': list_values,
            'Time': list_timestamps
            })
        
    return df_show_info


while True:
    price_all = price_all.append(checkprice(), ignore_index=False).copy()
    time.sleep(5)

这将创建一个名为“price_all”的通用 DF,其中包含大约检查的所有价格和时间戳。每 5 秒。有更优雅的方式来每'x'秒重复一个动作,这是最基本的一种。

使用网络抓取工具获取金融工具价格的技术已经过时,并已被其他方法取代,最著名的方法之一是 Pandas Datareader,这是一个简单的库提供对许多提供财务数据的在线资源的轻松访问。它完美匹配 Pandas 逻辑,非常易于使用。

这能解决您的问题吗?