尝试使用Python从网站下载.csv文件

4

1
主要问题是URL不正确。您需要具有实际文件的URL,而不是下载页面。在您想要执行此操作的网站上,无法获取文件的URL。 - Billy Bonaros
1
我查看了该网站,它从https://api.nasdaq.com/api/screener/stocks获取数据。有趣的是,它以json格式回复,页面上的javascript必须将其转换为csv供您下载。 - Arthur Borshenko
你需要哪些具体信息?我们可以使用pandas data-reader来完成! - Billy Bonaros
@ArthurBorshenko 哦。我的错误,我是说我可以这样做,但我希望自动化数据获取,而不是手动获取。 - A5omic
1
就像@ArthurBorshenko所说的那样 - 与其尝试获取CSV,不如尝试调用API从其API端点中获取JSON。 https://api.nasdaq.com/api/screener/stocks?tableonly=true&limit=3296&exchange=nyse - 这个URL应该返回您需要的所有数据,您可以将JSON转换为字典并创建CSV。 - Joe Akanesuvan
显示剩余6条评论
1个回答

4

正如@JoeAkanesuvan所指出的那样,该信息是通过JSON API获取的。可以使用requests库访问它。然后可以使用Python将其转换为CSV文件,方法如下:

import requests
import csv

headers = {
    "User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0",
}

url = "https://api.nasdaq.com/api/screener/stocks?tableonly=true&limit=3296&exchange=nyse"
r = requests.get(url, headers=headers)
j = r.json()

table = j['data']['table']
table_headers = table['headers']

with open('Stocks.csv', 'w', newline='') as f_output:
    csv_output = csv.DictWriter(f_output, fieldnames=table_headers.values(), extrasaction='ignore')
    csv_output.writeheader()

    for table_row in table['rows']:
        csv_row = {table_headers.get(key, None) : value for key, value in table_row.items()}
        csv_output.writerow(csv_row)

我建议您使用print(j),以更好地了解返回数据的结构。

这将输出以下内容:

Symbol,Name,Last Sale,Net Change,% Change,Market Cap
BABA,Alibaba Group Holding Limited American Depositary Shares each representing eight Ordinary share,$260.25,-5.67,-2.132%,"704,141,925,150"
TSM,Taiwan Semiconductor Manufacturing Company Ltd.,$121.74,-4.91,-3.877%,"631,343,640,000"
JNJ,Johnson & Johnson Common Stock,$167.88,-2.60,-1.525%,"441,951,263,775"

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