2015-01-12 4 views
2

Я использую селен, чтобы сделать функцию щелчка по гиперссылке, которая загружается на определенную страницу. Скрипт работает для google chrome, но не для phantomjs. Почему это не работает?Загрузить файл через гиперссылку в PhantomJS с помощью Selenium

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() 

Это работает в хромированном состоянии, но для выполнения задачи всегда открывается новое хромированное окно. Я читал, что я должен использовать phantomjs, чтобы он запускался за кулисами, однако, когда я переключаю драйверы на phantomjs, загрузка, похоже, не проходит. Снимок экрана захватывает, и он действительно находится на правильной странице, и «Скачать» определенно существует. Так

elem.click() 

не делать то, что он должен, или щелкает, но phantomjs не знают, как бороться с загрузкой ссылкой прямой. Пожалуйста, помогите, я был в этом часами.

+2

PhantomJS не (никогда) триггер скачать. Вы должны явно загрузить его, используя XHR или что-то еще с прямым URL-адресом, но есть ограничение, что оно перестанет загружаться с отметкой 30 секунд. –

+0

@ArtjomB. Хорошая точка, часть загрузки может обрабатываться через 'urlretrieve()', как показано ниже. – alecxe

ответ

4

С PhantomJS будет никогда не продолжить загрузку, нам необходимо загрузить файл вручную.

Идея заключается в том, чтобы нажать на кнопку, wait for the "Download" link to appear, get 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 
+0

Спасибо за ответ! но, к сожалению, это не работает для меня. что вы заменяете «song.mp3»? Когда я запускаю ваш код выше, я получаю 'IOError: [Errno 13] Permission denied: 'song.mp3'' –

+1

@ user2565883 может быть, у вас нет разрешения на запись в каталог. Попробуйте указать абсолютный путь к файлу. – alecxe

+0

Это исправлено! Однако теперь, если бы только я мог найти способ получить название видео youtube для сохранения как .mp3, вместо «song» ... –

Смежные вопросы