从网址下载CSV文件并将其转换为Python Pandas数据框。

9
我是新手Python程序员,需要一些帮助。我的数据框中有一个URL列,其中包含允许我下载每个链接的CSV文件的链接。我的目标是创建一个循环/任何有效的内容,以便我可以运行一个命令来下载、读取CSV并为每一行创建一个数据框。非常感谢您的帮助。下面是部分数据框。如果链接无法使用(很可能不行),您可以将它替换为“https://finance.yahoo.com/quote/GOOG/history?p=GOOG”(或任何其他公司),然后导航到下载CSV并使用该链接。
Symbol         Link
YI             https://query1.finance.yahoo.com/v7/finance/download/YI?period1=1383609600&period2=1541376000&interval=1d&events=history&crumb=PMHbxK/sU6E
PIH            https://query1.finance.yahoo.com/v7/finance/download/PIH?period1=1383609600&period2=1541376000&interval=1d&events=history&crumb=PMHbxK/sU6E
TURN           https://query1.finance.yahoo.com/v7/finance/download/TURN?period1=1383609600&period2=1541376000&interval=1d&events=history&crumb=PMHbxK/sU6E
FLWS           https://query1.finance.yahoo.com/v7/finance/download/FLWS?period1=1383609600&period2=1541376000&interval=1d&events=history&crumb=PMHbxK/sU6E

再次感谢您。

该网站使用cookies来提供内容。首先尝试通过编程方式(例如scrapyselenium)下载单个文件,并尝试了解网站如何使用cookies,然后您可以尝试循环遍历所有的URL。 - Edgar Ramírez Mondragón
4个回答

21

有多种方法可以从URL获取CSV数据。从您提供的例子,即雅虎财经,您可以复制历史 数据链接,并在Pandas中调用它。

...
HISTORICAL_URL = "https://query1.finance.yahoo.com/v7/finance/download/GOOG?period1=1582781719&period2=1614404119&interval=1d&events=history&includeAdjustedClose=true"

df = pd.read_csv(HISTORICAL_URL)

通常情况下,可以使用类似于requestshttpx的工具来发起GET|POST请求,然后获取内容到io中。

import pandas as pd
import requests
import io

url = 'https://query1.finance.yahoo.com/v7/finance/download/GOOG'
params ={'period1':1538761929,
         'period2':1541443929,
         'interval':'1d',
         'events':'history',
         'crumb':'v4z6ZpmoP98',
        }

r = requests.post(url,data=params)
if r.ok:
    data = r.content.decode('utf8')
    df = pd.read_csv(io.StringIO(data))
为了获取参数,我只需跟随链接并复制“?”后面的所有内容。请检查它们是否匹配 ;) 结果: enter image description here 更新:
如果您可以直接在URL中查看原始csv内容,请将URL传递给pd.read_csv。 来自URL的示例数据:
data_url ='https://raw.githubusercontent.com/pandas-dev/pandas/master/pandas/tests/data/iris.csv'

df = pd.read_csv(data_url)

0

我经常使用这个过程

import pandas as pd
import requests

url="<URL TO DOWNLOAD.CSV>"
s=requests.get(url).content
c=pd.read_csv(s)

这只能获取一个值的结果,而不是像他想要的整个数据框。 - pandasman

0

首先将任务分解成较小的部分,你需要做的是:

  1. 使用DataFrame迭代链接。

    for index, row in df.iterrows():
        url= row["Link"]
    
  2. 使用Python的requests库从Yahoo Finance下载JSON文件。这可能是困难的部分,您需要在实际下载CSV文件之前获取cookie,更多信息请参见here,herehere。一旦您使用cookie创建了正确的URL,就可以使用以下代码进行下载:

    re = requests.get(URL)
    print(re.status_code) #状态码200表示成功下载
    
  3. 可选地,您可以将响应保存到本地磁盘。
  4. 使用pandas加载它。

    df = pd.read_csv(file_name) #如果将文件保存到磁盘中
    df = pd.read_csv(re.content) #直接从响应中读取
    

0
如果您将以下内容应用于数据框,它将把每个文档放入np.array中,而不是数据框(我不确定如何到达那里)。但这将使您可以访问所有文件,只需要将它们放入df中即可。
links = test['Link'].unique()

import requests
a=[]
for x in links:
     url=x
     s=requests.get(url).content
     a.append(s)

a[4] 或 np.array(a[4]).tolist() 输出的整个文件格式都不正确。

使用 'https://api.iextrading.com/1.0/stock/GOOG/chart/5y?format=csv' 而不是 Yahoo,它更容易访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接