【问题标题】:Download file via hyperlink in PhantomJS using Selenium使用 Selenium 通过 PhantomJS 中的超链接下载文件
【发布时间】:2015-01-12 21:54:50
【问题描述】:

我正在使用 selenium 在某个页面上加载的超链接上执行点击功能。该脚本适用于谷歌浏览器,但不适用于 phantomjs。为什么这不起作用?

from selenium import webdriver

driver = webdriver.Chrome()   
#driver = webdriver.PhantomJS(executable_path = "/Users/jameslemieux/PythonProjects/phantomjs-1.9.8-macosx/bin/phantomjs")

driver.get("http://www.youtube-mp3.org/?e=t_exp&r=true#v=hC-T0rC6m7I")

elem = driver.find_element_by_link_text('Download')
elem.click()


driver.save_screenshot('/Users/jameslemieux/Desktop/Misc./test_image.png')

driver.quit()

这适用于 chrome,但它总是会打开一个新的 chrome 窗口来完成任务。我读到我应该使用 phantomjs 让它在幕后运行,但是当我将驱动程序切换到 phantomjs 时,下载似乎没有通过。截图抓取,确实在正确的页面,“下载”肯定在那里。所以

elem.click()

没有做它应该做的,或者它正在点击,但 phantomjs 不知道如何处理直接下载链接。请帮忙,我已经连续几个小时了。

【问题讨论】:

  • PhantomJS 不会(从不)触发下载。您必须使用 XHR 或其他带有直接 url 的东西显式下载它,但有一个限制,它将在 30 秒标记处停止下载。
  • @ArtjomB。好点,下载部分可以通过urlretrieve()处理如下图。

标签: python selenium selenium-webdriver webdriver phantomjs


【解决方案1】:

由于PhantomJS永远不会进行下载请求,我们需要手动下载文件。

这里的想法是点击“转换”按钮,wait for the "Download" link to appearget the href attribute,包含生成的mp3文件的链接,并通过urllib.urlretrieve()下载:

import urllib
from urlparse import urljoin

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

base_url = 'http://www.youtube-mp3.org/'

driver = webdriver.PhantomJS()
driver.get("http://www.youtube-mp3.org/?e=t_exp&r=true#v=hC-T0rC6m7I")

# convert the video to mp3
driver.find_element_by_id('submit').click()

# wait for download link to appear
element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, "Download")))
link = element.get_attribute('href')
url = urljoin(base_url, link)

# download the song
urllib.urlretrieve(url, 'song.mp3')

driver.quit()

# enjoy the great song

【讨论】:

  • 感谢您的回答!但不幸的是,它对我不起作用。你用什么代替'song.mp3'?当我运行上面的代码时,我得到IOError: [Errno 13] Permission denied: 'song.mp3'
  • @user2565883 可能是您没有写入目录的权限。尝试指定文件的绝对路径。
  • 解决了!但是,现在如果我能找到一种方法将 youtube 视频的标题保存为 .mp3,而不是“歌曲”...
  • @user2565883 好吧,你可以让urlretrieve() 来做——只是根本不提供文件名。
  • 喜欢urllib.urlretrieve(url) ?据我所知,它运行脚本但不下载任何内容。我也试过urllib.urlretrieve(url, 'C:\Users\user_name\Downloads')我再次被拒绝权限。
猜你喜欢
  • 2019-10-10
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多