Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python和Selenium会弹出一个对话框,而不是手动单击链接时自动下载的对话框_Python_Excel_Selenium Webdriver_Download - Fatal编程技术网

Python和Selenium会弹出一个对话框,而不是手动单击链接时自动下载的对话框

Python和Selenium会弹出一个对话框,而不是手动单击链接时自动下载的对话框,python,excel,selenium-webdriver,download,Python,Excel,Selenium Webdriver,Download,我正在使用Python访问SEC的网站,获取10-K可下载的电子表格。我创建了一段代码,请求用户输入股票代码,成功打开Firefox,访问位于的Edgar搜索页面,并输入正确的股票代码。问题是自动下载电子表格并保存它 现在,我可以手动点击“查看Excel电子表格”,电子表格会自动下载。但是当我运行Python代码时,我从Firefox中得到一个对话框。我已经将Firefox设置为自动下载,我尝试使用“通过xpath查找元素”、“通过css选择器查找元素”,但这两种方法都不能简单地下载文件。这两种

我正在使用Python访问SEC的网站,获取10-K可下载的电子表格。我创建了一段代码,请求用户输入股票代码,成功打开Firefox,访问位于的Edgar搜索页面,并输入正确的股票代码。问题是自动下载电子表格并保存它

现在,我可以手动点击“查看Excel电子表格”,电子表格会自动下载。但是当我运行Python代码时,我从Firefox中得到一个对话框。我已经将Firefox设置为自动下载,我尝试使用“通过xpath查找元素”、“通过css选择器查找元素”,但这两种方法都不能简单地下载文件。这两种方法只调用同一个对话框。我尝试了“通过链接文本查找元素”,但收到一条错误消息,提示无法找到“查看Excel电子表格”。我的示例代码是Caterpillar的CAT(纽约证券交易所代码:CAT)。我的代码如下:

import selenium.webdriver.support.ui as ui
from pathlib import Path
import selenium.webdriver as webdriver
import time

ticker = input("please provide a ticker symbol: ")

# can do this other ways, but will create a function to do this 
def get_edgar_results(ticker):
        url = "https://www.sec.gov/cgi-bin/browse-edgar?action=getcompany&CIK=" + str(ticker) + "&type=10-k&dateb=20200501&count=20"

# define variable that opens Firefox via my executable path for geckodriver
    driver = webdriver.Firefox(executable_path=r"C:\Program Files\JetBrains\geckodriver.exe")

 # timers to wait for the webpage to open and display the page itself
    wait = ui.WebDriverWait(driver,40)
    driver.set_page_load_timeout(40)
    driver.get(url)

    # timers to have page wait for the page to load.
    # seemed that the total amount of time was necessary; not sure about these additional lines
    driver.set_page_load_timeout(50)
    wait = ui.WebDriverWait(driver, 50)
    time.sleep(30)

    # actual code to search the resulting page for the button to click and access the excel document for download
    annual_links = driver.find_element_by_xpath('//*[@id="interactiveDataBtn"]')
    annual_links.click()

    # need to download the excel spreadsheet itself in the "financial report"
    driver.set_page_load_timeout(50)
    wait = ui.WebDriverWait(driver, 50)

    excel_sheet = driver.find_element_by_xpath('/html/body/div[5]/table/tbody/tr[1]/td/a[2]')
    excel_sheet.click()
    # i'm setting the resulting dialog box to open and download automatically from now on. if i want to change it back
    # i'll need to use this page:  https://support.mozilla.org/en-US/kb/change-firefox-behavior-when-open-file
    # Testing showed that dialog box "open as" probably suits my needs better than 'save'.

    driver.close()
    driver.quit()


get_edgar_results(ticker)



非常感谢您的帮助或建议。谢谢

这并不是基于您的实际代码或Selenium的工作原理的建议,而是尝试从web收集信息时的一般建议

如果有机会,通过API访问网站比通过Selenium尝试同样的任务对编程更友好。当您使用Selenium进行Web垃圾处理时,网站的行为通常与通过普通浏览器访问时的行为不同。这可能有很多原因,尤其是网站故意阻止像Selenium这样的自动浏览器访问它们

在这种情况下,您应该能够通过它获得所需的信息

在不深入挖掘这些数据的情况下,使用http请求库(如
requests
)请求这些信息并以这种方式保存应该不会非常困难

import requests

result = requests.get("https://www.sec.gov/Archives/edgar/data/18230/000001823020000214/Financial_Report.xlsx")

with open("file.xlsx", "wb") as excelFile:
    excelFile.write(result.content)
唯一的困难是获取股票代码的CIK来构建上面的URL,但是使用相同的API信息应该不会太难

EDGAR网站通过其URL相当透明地向您公开其数据。您可以绕过Selenium的所有奇怪之处,只构建URL,直接请求信息而不加载所有JavaScript,等等

编辑:您也可以以更编程的方式浏览这些信息。上面的链接提到edgar/full索引中的每个目录还提供一个JSON文件,该文件易于计算机读取。因此您可以请求
https://www.sec.gov/Archives/edgar/full-index/index.json
,解析出你想要的年份,请求当年,解析出你想要的季度,请求该季度,然后解析出你想要的公司,请求该公司的信息,等等


例如,要获取Caterpillar的CIK编号,您可以从
https://www.sec.gov/Archives/edgar/full-index/2020/QTR4.json
,将其解析为数据帧,找到其上带有
CATERPILLAR INC
的行,从相关的.txt文件中找到CIK和登录号,然后找到正确的URL下载他们的Excel文件。有点迂回,但如果你能找到一种方法,直接跳到CIK号码,你就可以减少所需的请求数量。

我首先承认我根本不是一个熟练的程序员。我绝对是个新手。话虽如此,我想做的是下载所有大约6000-10000份公开交易的股票电子表格,你看到的代码是为了让我一次下载一份来解决这个问题。您建议的代码在PyCharm中不起作用,但可能是因为我遗漏了一行关键代码?我要提到的是,我想要一种API方法,但我对XBRL的理解还不够透彻,不知道怎样才能得到一个可操作的excel文件来修改/解析所有10000只股票。我已经尝试过Intrinio。所以本质上:下载此文件:“”。该文件中按名称列出了所有股票。获取他们的CIK和注册号。然后把它们放在下面的表格中:“。并循环浏览您选择的股票,根据需要替换股票代码和登录。为了澄清,我的意思是您需要从“”获取“company.gz”文件。解析该数据文件,直到获得所需的公司名称,然后以编程方式将它们注入到我在前面的评论中提到的url格式中。使用selenium下载这么多文件将花费非常长的时间。通过URL下载它们会大大提高效率,而且可能更容易。谢谢这些建议。我知道我在使用Selenium和与浏览器交互方面走了很长的路。一开始,我并不清楚[请求]是一条路,也不清楚[请求]应该做什么。我希望这需要更多的经验。你的代码帮了大忙。我对你的答案投了赞成票,但我没有足够的声誉。没问题。我认为使用请求应该是前进的方向,因为你所需要的只是CIK,然后拉一个所有文件的列表,然后只需浏览文件并找到excel文件。唯一困难的部分将是得到一份雪茄的清单,但我想你已经有了一些想法。