2017-09-03 84 views
0

我想下載一個來自Online-Magazin的PDF。要打開它,必須先登錄。然後打開PDF並下載它。如何使用Python 3中的Selenium Module(FireFox)下載PDF

以下是我的代碼。它可以登錄到頁面並且PDF也可以打開。但是PDF不能下載,因爲我不確定如何模擬點擊保存。我使用FireFox。

import os, time 
from selenium import webdriver 
from bs4 import BeautifulSoup 

# Use firefox dowmloader to get file 
fp = webdriver.FirefoxProfile() 
fp.set_preference("browser.download.folderList",2) 
fp.set_preference("browser.download.manager.showWhenStarting",False) 
fp.set_preference("browser.download.dir", 'D:/eBooks/Stocks_andCommodities/2008/Jul/') 
fp.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/pdf") 
fp.set_preference("pdfjs.disabled", "true") 

# disable Adobe Acrobat PDF preview plugin 
fp.set_preference("plugin.scan.plid.all", "false") 
fp.set_preference("plugin.scan.Acrobat", "99.0") 

browser = webdriver.Firefox(firefox_profile=fp) 

# Get the login web page 
web_url = 'http://technical.traders.com/sub/sublogin2.asp' 
browser.get(web_url) 

# SImulate the authentication 
user_name = browser.find_element_by_css_selector('#SubID > input[type="text"]') 
user_name.send_keys("[email protected]") 
password = browser.find_element_by_css_selector('#SubName > input[type="text"]') 
password.send_keys("LastName") 
time.sleep(2) 
submit = browser.find_element_by_css_selector('#SubButton > input[type="submit"]') 
submit.click() 
time.sleep(2) 

# Open the PDF for downloading 
url = 'http://technical.traders.com/archive/articlefinal.asp?file=\V26\C07\\131INTR.pdf' 
browser.get(url) 
time.sleep(10) 

# How to simulate the Clicking to Save/Download the PDF here? 

回答

0

除了塔倫的解決方案,你也可以下載文件,通過js和商店下載文件它作爲一個blob。然後你可以通過selinium的執行腳本將數據提取到python中,如in this answer所示。

在你的情況下,

url = 'http://technical.traders.com/archive/articlefinal.asp?file=\V26\C07\\131INTR.pdf' 
browser.execute_script(""" 
    window.file_contents = null; 
    var xhr = new XMLHttpRequest(); 
    xhr.responseType = 'blob'; 
    xhr.onload = function() { 
     var reader = new FileReader(); 
     reader.onloadend = function() { 
      window.file_contents = reader.result; 
     }; 
     reader.readAsDataURL(xhr.response); 
    }; 
    xhr.open('GET', %(download_url)s); 
    xhr.send(); 
""".replace('\r\n', ' ').replace('\r', ' ').replace('\n', ' ') % { 
    'download_url': json.dumps(url), 
}) 

現在你的數據存在作爲窗口對象上的斑點,所以你可以很容易地提取到蟒蛇:

time.sleep(3) 
downloaded_file = driver.execute_script("return (window.file_contents !== null ? window.file_contents.split(',')[1] : null);") 
with open('/Users/Chetan/Desktop/dummy.pdf', 'wb') as f: 
    f.write(base64.b64decode(downloaded_file)) 
+0

我的代碼附加到我的代碼後#如何...但在我運行該程序時出現錯誤:TypeError:參數應該是類似字節的對象或ASCII字符串,而不是'NoneType'。我在下面再次發佈我的代碼。你能看看嗎? – thomas2013ch

+0

嘗試在第二部分之前添加一個等待。我認爲這是因爲你試圖在onload函數完成之前獲取變量的內容 – TheChetan

+0

嗨TheChetan,我設置了一個更長的暫停,並且確實下載了PDF。非常感謝! – thomas2013ch

3

您不應該在瀏覽器中打開該文件。一旦你有文件的網址。獲取與所有cookie的請求會話

def get_request_session(driver): 
    import requests 
    session = requests.Session() 
    for cookie in driver.get_cookies(): 
     session.cookies.set(cookie['name'], cookie['value']) 

    return session 

一旦你的會話,你可以使用相同的

url = 'http://technical.traders.com/archive/articlefinal.asp?file=\V26\C07\\131INTR.pdf' 
session = get_request_session(driver) 
r = session.get(url, stream=True) 
chunk_size = 2000 
with open('/tmp/mypdf.pdf', 'wb') as file: 
    for chunk in r.iter_content(chunk_size): 
     file.write(chunk) 
+0

我在#後面附上你的代碼到我的代碼中如何...實際上下載了PDF文件。但它不是一個有效的PDF文件。當我打開它時,它無法打開。我發現下載的PDF的大小比正確的小得多。我在下面再次發佈我的整個代碼。你能看一下嗎? – thomas2013ch

0

嘗試

import urllib  
    file_path = "<FILE PATH TO SAVE>" 
    urllib.urlretrieve(<pdf_link>,file_path) 
+0

嗨安格爾,我會在稍後嘗試你的代碼。 – thomas2013ch

相關問題