通过模拟点击

时间:2017-05-24 20:11:36

标签: python selenium 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问题中看到了一些示例,他们没有做任何其他额外的事情来实际存储下载的文件,这看起来很奇怪,但我不知道这是不是问题。

任何帮助?

2 个答案:

答案 0 :(得分:1)

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

def Download_PDF():
    phantomJSdriver = r'C:\Program Files\PhantomJS\bin\phantomjs.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')

答案 1 :(得分:0)

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

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

或者,你可以使用PhantomJS来获取你需要的东西,当你拥有元素时,提取href,并使用python-requests或urllib来检索文件。