Python 暂停URL请求下载

Python 暂停URL请求下载,python,python-3.x,pandas,finance,datareader,Python,Python 3.x,Pandas,Finance,Datareader,当我有大约200到300只股票时,脚本工作正常,但我的公司列表有大约6000个符号 有没有一种方法可以让我下载大量数据,比如说一次下载200只股票,暂停一会儿,然后再继续下载 一次出口一只股票;如何一次写入200个,并将下一个批附加到初始批(用于CSV) 要在每200次下载后暂停,您也可以使用pandas\u datareader: import urllib.request import re import csv import pandas as pd from bs4 import Bea

当我有大约200到300只股票时,脚本工作正常,但我的公司列表有大约6000个符号

  • 有没有一种方法可以让我下载大量数据,比如说一次下载200只股票,暂停一会儿,然后再继续下载
  • 一次出口一只股票;如何一次写入200个,并将下一个批附加到初始批(用于CSV)

  • 要在每200次下载后暂停,您也可以使用
    pandas\u datareader

    import urllib.request
    import re
    import csv
    import pandas as pd
    from bs4 import BeautifulSoup
    
    columns = []
    data = []
    f = open('companylist.csv')
    csv_f = csv.reader(f)
    
    for row in csv_f:
        stocklist = row
        print(stocklist)
    
        for s in stocklist:
            print('http://finance.yahoo.com/q?s='+s)
            optionsUrl = urllib.request.urlopen('http://finance.yahoo.com/q?s='+s).read()
            soup = BeautifulSoup(optionsUrl, "html.parser")
            stocksymbol = ['Symbol:', s]
            optionsTable = [stocksymbol]+[
            [x.text for x in y.parent.contents]
            for y in soup.findAll('td', attrs={'class': 'yfnc_tabledata1','rtq_table': ''})
            ]
            if not columns:
                columns = [o[0] for o in optionsTable] #list(my_df.loc[0])
            data.append(o[1] for o in optionsTable)
    
    
    
    
    # create DataFrame from data
    df = pd.DataFrame(data, columns=columns)
    df.to_csv('test.csv', index=False)
    
    要将所有数据保存到单个文件(IIUC),请执行以下操作:

    在每次迭代中:

    stocks = pd.DataFrame() # to collect all results
    
    最后:

    stocks = pd.concat([stocks, pd.DataFrame(data, columns=columns))
    

    要在每200次下载后暂停,您也可以使用
    pandas\u datareader

    import urllib.request
    import re
    import csv
    import pandas as pd
    from bs4 import BeautifulSoup
    
    columns = []
    data = []
    f = open('companylist.csv')
    csv_f = csv.reader(f)
    
    for row in csv_f:
        stocklist = row
        print(stocklist)
    
        for s in stocklist:
            print('http://finance.yahoo.com/q?s='+s)
            optionsUrl = urllib.request.urlopen('http://finance.yahoo.com/q?s='+s).read()
            soup = BeautifulSoup(optionsUrl, "html.parser")
            stocksymbol = ['Symbol:', s]
            optionsTable = [stocksymbol]+[
            [x.text for x in y.parent.contents]
            for y in soup.findAll('td', attrs={'class': 'yfnc_tabledata1','rtq_table': ''})
            ]
            if not columns:
                columns = [o[0] for o in optionsTable] #list(my_df.loc[0])
            data.append(o[1] for o in optionsTable)
    
    
    
    
    # create DataFrame from data
    df = pd.DataFrame(data, columns=columns)
    df.to_csv('test.csv', index=False)
    
    要将所有数据保存到单个文件(IIUC),请执行以下操作:

    在每次迭代中:

    stocks = pd.DataFrame() # to collect all results
    
    最后:

    stocks = pd.concat([stocks, pd.DataFrame(data, columns=columns))
    

    为此,请使用
    python\u datareader

    stocks.to_csv(path, index=False)
    

    为此,请使用
    python\u datareader

    stocks.to_csv(path, index=False)
    

    正如@Merlin推荐的那样——仔细查看
    pandas\u datareader
    module——使用此工具可以做很多事情。下面是一个小例子:

    In [1]: import pandas_datareader.data as web
    
    In [2]: import datetime
    
    In [3]: start = datetime.datetime(2010, 1, 1)
    
    In [4]: end = datetime.datetime(2013, 1, 27)
    
    In [5]: f = web.DataReader("F", 'yahoo', start, end)
    
    In [6]: f.ix['2010-01-04']
    Out[6]: 
    Open               10.170000
    High               10.280000
    Low                10.050000
    Close              10.280000
    Volume       60855800.000000
    Adj Close           9.151094
    Name: 2010-01-04 00:00:00, dtype: float64
    
    输出:我故意转置了结果集,因为这里有太多的列来显示它们

    import csv
    import pandas_datareader.data as data
    from pandas_datareader.yahoo.quotes import _yahoo_codes
    
    stocklist = ['aapl','goog','fb','amzn','COP']
    
    #http://www.jarloo.com/yahoo_finance/
    #https://greenido.wordpress.com/2009/12/22/yahoo-finance-hidden-api/
    _yahoo_codes.update({'Market Cap': 'j1'})
    _yahoo_codes.update({'Div Yield': 'y'})
    _yahoo_codes.update({'Bid': 'b'})
    _yahoo_codes.update({'Ask': 'a'})
    _yahoo_codes.update({'Prev Close': 'p'})
    _yahoo_codes.update({'Open': 'o'})
    _yahoo_codes.update({'1 yr Target Price': 't8'})
    _yahoo_codes.update({'Earnings/Share': 'e'})
    _yahoo_codes.update({"Day’s Range": 'm'})
    _yahoo_codes.update({'52-week Range': 'w'})
    _yahoo_codes.update({'Volume': 'v'})
    _yahoo_codes.update({'Avg Daily Volume': 'a2'})
    _yahoo_codes.update({'EPS Est Current Year': 'e7'})
    _yahoo_codes.update({'EPS Est Next Quarter': 'e9'})
    
    data.get_quote_yahoo(stocklist).to_csv('test.csv', index=False, quoting=csv.QUOTE_NONNUMERIC)
    
    如果您需要更多字段(Yahoo Finance API代码),您可能需要查看以下链接:


    正如@Merlin推荐的那样-仔细查看
    pandas\u datareader
    模块-使用此工具可以做很多事情。下面是一个小例子:

    In [1]: import pandas_datareader.data as web
    
    In [2]: import datetime
    
    In [3]: start = datetime.datetime(2010, 1, 1)
    
    In [4]: end = datetime.datetime(2013, 1, 27)
    
    In [5]: f = web.DataReader("F", 'yahoo', start, end)
    
    In [6]: f.ix['2010-01-04']
    Out[6]: 
    Open               10.170000
    High               10.280000
    Low                10.050000
    Close              10.280000
    Volume       60855800.000000
    Adj Close           9.151094
    Name: 2010-01-04 00:00:00, dtype: float64
    
    输出:我故意转置了结果集,因为这里有太多的列来显示它们

    import csv
    import pandas_datareader.data as data
    from pandas_datareader.yahoo.quotes import _yahoo_codes
    
    stocklist = ['aapl','goog','fb','amzn','COP']
    
    #http://www.jarloo.com/yahoo_finance/
    #https://greenido.wordpress.com/2009/12/22/yahoo-finance-hidden-api/
    _yahoo_codes.update({'Market Cap': 'j1'})
    _yahoo_codes.update({'Div Yield': 'y'})
    _yahoo_codes.update({'Bid': 'b'})
    _yahoo_codes.update({'Ask': 'a'})
    _yahoo_codes.update({'Prev Close': 'p'})
    _yahoo_codes.update({'Open': 'o'})
    _yahoo_codes.update({'1 yr Target Price': 't8'})
    _yahoo_codes.update({'Earnings/Share': 'e'})
    _yahoo_codes.update({"Day’s Range": 'm'})
    _yahoo_codes.update({'52-week Range': 'w'})
    _yahoo_codes.update({'Volume': 'v'})
    _yahoo_codes.update({'Avg Daily Volume': 'a2'})
    _yahoo_codes.update({'EPS Est Current Year': 'e7'})
    _yahoo_codes.update({'EPS Est Next Quarter': 'e9'})
    
    data.get_quote_yahoo(stocklist).to_csv('test.csv', index=False, quoting=csv.QUOTE_NONNUMERIC)
    
    如果您需要更多字段(Yahoo Finance API代码),您可能需要查看以下链接:


    谢谢你的回答,它没有我需要的所有标题。比如div,market cap。探索python\u datareader,它可能有你需要的数据。@showri,不要低估熊猫!在
    pandas/io/tests/test_data.py
    file@showri,我已经添加了一小部分如何使用
    pandas_datareader
    完成的内容,感谢您的回答,它没有我需要的所有标题..比如div,market cap..探索python_datareader,它可能有您需要的数据。@showri,不要低估熊猫!在
    pandas/io/tests/test_data.py
    file@showri,我添加了一小部分内容,说明如何使用
    pandas\u datareader
    获取历史分割数据和/或收益日期。拆分被隐藏在网站上的历史股息数据中。@Merlin,是的,我认为您可以获得历史数据-查看
    ../site packages/pandas\u datareader/base.py
    -
    类\u BaseReader
    。我不明白什么是盈利日期。我想雅虎目前已经破产了。你能得到历史分割数据和/或盈利日期吗。拆分被隐藏在网站上的历史股息数据中。@Merlin,是的,我认为您可以获得历史数据-查看
    ../site packages/pandas\u datareader/base.py
    -
    类\u BaseReader
    。我不明白什么是盈利日期,我想雅虎现在已经破产了。