我是编码世界的新手,所以如果我滥用术语或通常不知道我在说什么,请多多包涵。我正在做一个研究项目,我试图通过 EDGAR 从 sec.gov 刮取上市公司 10-Ks。我阅读了各种资料,观看了各种视频,但我发现以下参考资料与我的项目最相关,坦率地说,我很容易理解。我的代码解释从第 194 页开始,代码从第 195 页开始。我首先尝试下载索引文件(下图),这将帮助我编写代码来专门获得 10-Ks。所以,我正处于项目的早期阶段。
这只是我正在使用的论文的参考。它目前在 SSRN 上,所以我意识到每个人都可能无法访问。我会上传 PDF,但我不认为这是一个选项。我列出这个纯粹是为了表明我有我正在做的事情的来源。如有必要,我可以提供屏幕截图。
Anand, V.、Bochkay, K.、Chychyla, R. 和 Leone, AJ (2020)。在会计研究中使用 Python 进行文本分析。即将出版,会计基础和趋势。
目前,我有两个问题:我的代码没有按预期工作,而且我似乎被 sec.gov 阻止了。我将首先讨论前者,最后讨论后者。当我运行以下命令时,它应该在 down_direct 路径下载 2018 和 2019 索引文件。但是,此代码仅抓取 2018 年的索引文件。
下面的 log/IDLE shell 结果显示了“成功”和不成功的运行。不成功的运行让我觉得我被 sec.gov 阻止了。据我了解,某些网站会查找来自 urllib.request 的请求,并且可能会自动对其进行筛选。但是,只要您在间隔尝试数小时后尝试下载,sec.gov 对研究人员是友好的,这两项我都做过(我昨晚从晚上 7 点到晚上 10 点一直在做这个,两次尝试之间等待了 10 分钟)。所以,我的问题是
我应该如何调整我的代码以使其按预期运行?(即,提取 start_year 和 end_year 的所有 4 个季度)
我被 sec.gov 屏蔽了吗?如果是这样,我可以调整我的代码来解决这个问题吗?
import os import urllib.request from pathlib import Path def get_index(start_year:int, end_year:int, down_direct:str): start_year = 2018 end_year = 2019 down_direct = r"C:/Users/Documents/Student Files/~Current Student/~RESEARCH/~First Summer Paper/Data/EDGAR/" print('Retrieving data') if not os.path.exists(down_direct): os.makedirs(down_direct) for year in range(start_year, end_year+1): for qtr in range(1,5): url = r"https://www.sec.gov/Archives/edgar/full-index/" + str(year) + '/' + 'QTR' + str(qtr) + '/master.idx' dl_file = down_direct + 'master' + str(year) + str(qtr) + '.idx' urllib.request.urlretrieve(url, dl_file) print('Downloaded', dl_file, end = '\n') print('Data retrieved') return down_direct = os.path.join(Path.home(), 'edgar', 'indexfiles') get_index(2018, 2019, down_direct)
成功运行
检索数据
下载 C:/Users/Documents/Student Files/~Current Student/~RESEARCH/~First Summer Paper/Data/EDGAR/master20184.idx
检索到的数据
运行不成功(为了篇幅,我只包括了错误行)
检索数据
urllib.error.HTTPError:HTTP 错误 403:禁止
我看过类似的帖子,人们建议将以下内容添加到代码中以解决此错误,但我太绿了,我真的不知道如何将其合并。感谢任何帮助,如果我需要编辑我的帖子更多信息,请告诉我。
req = Request(url, headers={'User-Agent': 'Mozilla/5.0'})