1。我想要什么
我想使用Python下载一个没有Selenium webdriver(PhantomJS、Chrome驱动程序等)的文件。在
2。情况
使用常规的浏览器(即,不使用机器人)通过单击某个图标自动下载文件(请参见此图here)。在
如果我可以使用Selenium Webdriver,因为我知道它被放在下面的input
标记中,我可以简单地做一个driver.find_element_by_id('cphCorpo_ctl01_btExportarTxt').click()
并下载该文件。在
3。问题
这是引用我正在讨论的文件的input
标记。在
<input id="cphCorpo_ctl01_btExportarTxt" name="ctl00$cphCorpo$ctl01$btExportarTxt" src="inc/img/txt_file.png" style="height:30px;width:30px;" title="Exportar Dados para .TXT" type="image"/>
问题1:如您所见,没有href
标记,也没有可见的url可用。在
问题2:我不能使用Selenium/Browsers的原因是,当使用例如driver.get(url)
时,在解析指向所需网页的完整url时,有一个long VIEWSTATE参数创建了一个“HTTP Error 414:Request url too long”(请参见图片here)。在
4。我所尝试的
我试图通过网络浏览器标签找到下载文件的网址。虽然可以获得显示下载图标的页面的url,但单击下载按钮时,Network选项卡中没有任何更改(即使文件已下载)。在
可能的解决方案
我能想出三种方法来解决这个问题,但却找不到解决办法。如果能做到其中一个,就能解决我的问题:
从标记中获取(不知何故)一个隐藏的URL
“模拟”在urllib/Requests/urlopen/etc中的元素soup.find_all('input', attrs = {'id':'cphCorpo_ctl01_btExportarTxt'})[0]
上“单击”,就像在使用Browsers/Selenium时一样。
解决“URL too long”错误,以便使用Browsers/Selenium。
其他信息
由于完整的URL太长,我将发布初始URL:
http://gestorpcd.ana.gov.br/exportarDados.aspx
应该是this
在点击第一组(这是唯一的强制组)的一个选项并选择日期后,下载图标将可用,网页应该看起来像this
没有浏览器你不能下载文件
。。。因为文件是由浏览器生成的。所有的数据都已经在内存中了。当您单击图像时,一些JavaScript代码构造报告,然后欺骗浏览器将其保存到本地文件系统(可能是通过告诉它打开一个data URI)。在
这看起来像任何其他文件下载,但它不是。这也解释了为什么找不到文件的URL:没有。在
你可以用Selenium下载这个文件
。。。只要你用一种合理的方式使用它。在
您告诉Selenium打开一个无效的URL,这就是为什么您收到了414状态代码。这不是硒的错,是你的错。这个“URL”不会与任何HTTP库一起工作,不管是curl、wget、requests,或者其他任何东西。在
(顺便说一句,我不明白您为什么要用这种方式为Selenium构建一个URL。我没有理由相信这个特定的POST请求代表了当前页面。此外,没有理由假设可以将任意POST请求重写为GET请求并使其正常工作。)
如果要使用Selenium,只需执行与实际浏览器手动操作相同的操作:访问报表生成器,选择所需的选项,然后单击图标:
相关问题 更多 >
编程相关推荐