通过模拟点击使用Python+PhantomJS下载



我正在尝试编写一个从网站下载zip文件的脚本,但是该文件是通过javascript调用而不是已知的URL提供的,所以我正在尝试模拟单击元素以下载文件:

#! /usr/bin/env python
# -*- coding: utf-8 -*
from selenium import webdriver

meff_data_download_url = "http://www.meff.com/aspx/DerEnergia/DescargaFicheros.aspx?id=esp"
zip_file_javascript_call = "sacaVentana('/docs/Ficheros/Descarga/dME/ME170523.zip')"
if __name__ == '__main__':
    browser = webdriver.PhantomJS()
    browser.get(meff_data_download_url)        
    browser.find_elements_by_class_name('zip')[0].click()

程序脚本结束时没有错误,但不会下载任何文件。我在其他 SO 问题中看到示例,他们没有做任何其他额外的事情来实际存储下载的文件,这似乎很奇怪,但我不知道这是否是问题所在。

有什么帮助吗?

这是我想到的。您只需要将文件位置换出到phantomJS可执行文件所在的位置即可。您还可以修改在最后一行存储下载文件的文件位置:

def Download_PDF():
    phantomJSdriver = r'C:Program FilesPhantomJSbinphantomjs.exe'
    meff_data_download_url = "http://www.meff.com/aspx/DerEnergia/DescargaFicheros.aspx?id=esp"
    main_link = "http://www.meff.com"
    driver = webdriver.PhantomJS(phantomJSdriver) # webdriver.PhantomJS() if not Windows
    driver.get(meff_data_download_url)
    links = driver.find_elements_by_css_selector("a[href*='/docs/Ficheros/Descarga/dME']")
    thelinks = [main_link + str(link.get_attribute('href')).split("javascript:sacaVentana('")[1].split("')")[0]
                for link in links]
    for i in range(0, len(thelinks)):
        urllib.request.urlretrieve(thelinks[i], str(i)+'.zip')

目前,PhantomJS不支持下载。 这是他们这边对该功能的跟踪票:https://github.com/ariya/phantomjs/issues/10052

您可以尝试使用Chrome的新无头版本,应该可以很好地与您当前的实现配合使用。https://intoli.com/blog/running-selenium-with-headless-chrome/

或者,您可以使用PhantomJS来获取所需的内容,当您拥有元素时,提取href,并使用python-requests或urllib来检索文件。

最新更新