【问题标题】:downloading a file from a webpage using python script without url , calling onClick function使用没有url的python脚本从网页下载文件,调用onClick函数
【发布时间】:2015-03-24 16:39:54
【问题描述】:

有一个网页有一个链接“点击下载”点击一个文件被下载。 我可以通过转到网页并单击此链接手动下载此文件,但是我需要通过 python 脚本下载此文件。

如果我看到源代码,我可以看到锚标记将运行一个 js 函数

<a class="download-data-link1" onclick=" document.forms['dataform'].submit()" style="cursor:pointer; vertical-align: middle;">Download in csv</a>

但我不知道 csv 文件的 url,我正在寻找一种通过 python 下载它的方法。

我知道如果我们有使用 httplib 的 url 但不明白如何获取没有 url 的文件,我们可以下载文件。

尝试了一些东西,比如在标题中添加 '内容处置':'附件;文件名="data.csv"'}

但它似乎有效。有什么想法吗?

【问题讨论】:

  • 必须是python?因为链接倾向于(尤其是现在)稍后添加到 DOM 中,或者响应由用户触发的某些事件,这使得无头浏览器成为更好的选择(恕我直言)。我会研究 PhantomJS 或类似工具
  • 好吧,即使它不是 python 也可能是我可以从 python 脚本调用的东西。根据您的建议,刚刚看到phantomjs.org。需要进一步研究
  • PhantomJS 可以通过selenium 自动化——所以它可以是python。
  • @paarthbatra: Selenium + chromedriver 也是一个选项(链接到 2 个脚本:get-drivers 下载您需要的内容,codeception-start 启动/停止 selenium),然后您可以使用该设置用python脚本很容易

标签: javascript python html


【解决方案1】:

感谢大家的回答,但我想补充一下,我是如何实现它的。

  1. 首先,您可以创建一个 Firefox 配置文件。为此:
  2. 关闭所有火狐浏览器
  3. 进入cmd提示符并执行firefox.exe -P
  4. 创建配置文件并记下创建新配置文件的文件夹名称

您可以在此处为您的个人资料设置一些选项,例如 - 从内容中自动下载此类文件等。

现在下载 selenium for python 并使用下面的代码

import os
from selenium import webdriver

download_dir="D:\a"

fp = webdriver.FirefoxProfile(<profile directory here as in step 4>)
fp.set_preference("browser.download.dir", download_dir)
fp.set_preference("browser.download.manager.showWhenStarting",False)
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/octet-stream");

browser = webdriver.Firefox(firefox_profile=fp)
browser.get("http://pypi.python.org/pypi/selenium")
# you can use your url here 
browser.find_element_by_partial_link_text("selenium-2").click()
# Use your method to identify class or link text here
browser.close();

希望这可以帮助其他人:)

【讨论】:

    【解决方案2】:

    这里可以应用两个基本选项:

    • 模仿onclick() 调用中涉及的逻辑 - 在您的情况下,使用requestsmechanize 提交dataform 表单
    • 高级方法 - 使用 selenium 自动化真正的浏览器,无论是否无头 (PhantomJS) - 找到链接并单击它:

      from selenium import webdriver
      
      driver = webdriver.PhantomJS()
      driver.get('url here')
      
      driver.find_element_by_class_name('download-data-link1').click()
      

    不过,据我了解,单击该链接会触发“下载”浏览器对话框出现 - 然后PhantomJS 不是一个选项,因为它不支持下载。如果是ChromeFirefox,您需要调整浏览器功能以在不打开弹出窗口的情况下自动下载文件,请参阅:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 2023-02-23
      • 1970-01-01
      • 1970-01-01
      • 2014-03-14
      • 1970-01-01
      相关资源
      最近更新 更多