当文件的标记不显示URL时,如何使用Python下载没有浏览器的文件?

2024-10-04 03:21:30 发布

您现在位置:Python中文网/ 问答频道 /正文

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选项卡中没有任何更改(即使文件已下载)。在

可能的解决方案

我能想出三种方法来解决这个问题,但却找不到解决办法。如果能做到其中一个,就能解决我的问题:

  1. 从标记中获取(不知何故)一个隐藏的URL

  2. “模拟”在urllib/Requests/urlopen/etc中的元素soup.find_all('input', attrs = {'id':'cphCorpo_ctl01_btExportarTxt'})[0]上“单击”,就像在使用Browsers/Selenium时一样。

  3. 解决“URL too long”错误,以便使用Browsers/Selenium。

其他信息

由于完整的URL太长,我将发布初始URL:

http://gestorpcd.ana.gov.br/exportarDados.aspx

应该是this

在点击第一组(这是唯一的强制组)的一个选项并选择日期后,下载图标将可用,网页应该看起来像this


Tags: 文件标记idurlinputhereselenium浏览器
1条回答
网友
1楼 · 发布于 2024-10-04 03:21:30

没有浏览器你不能下载文件

。。。因为文件是由浏览器生成的。所有的数据都已经在内存中了。当您单击图像时,一些JavaScript代码构造报告,然后欺骗浏览器将其保存到本地文件系统(可能是通过告诉它打开一个data URI)。在

这看起来像任何其他文件下载,但它不是。这也解释了为什么找不到文件的URL:没有。在

你可以用Selenium下载这个文件

。。。只要你用一种合理的方式使用它。在

您告诉Selenium打开一个无效的URL,这就是为什么您收到了414状态代码。这不是硒的错,是你的错。这个“URL”不会与任何HTTP库一起工作,不管是curl、wget、requests,或者其他任何东西。在

(顺便说一句,我不明白您为什么要用这种方式为Selenium构建一个URL。我没有理由相信这个特定的POST请求代表了当前页面。此外,没有理由假设可以将任意POST请求重写为GET请求并使其正常工作。)

如果要使用Selenium,只需执行与实际浏览器手动操作相同的操作:访问报表生成器,选择所需的选项,然后单击图标:

from selenium.webdriver.support.select import Select

driver.get("http://gestorpcd.ana.gov.br/exportarDados.aspx")

def select_xpath(header):
    return (
        "//select[./preceding-sibling::*[contains(./text(), '{}')]]".format(header))

states = Select(
    driver.find_element_by_xpath(select_xpath("Estados")))
states.select_by_visible_text("AC")

# wait for season options to update

seasons = Select(
    driver.find_element_by_xpath(select_xpath("Estações")))
seasons.select_by_visible_text("MÂNCIO LIMA")

export = driver.find_element_by_xpath("input[@title='Exportar Dados para .TXT']")
export.click()

相关问题 更多 >