2017-09-03 26 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とストアを介してファイルをダウンロードすることができます

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 

すべてのクッキー

で要求セッションを取得それはブロブとして。次に、 in this answerのように、seliniumの実行スクリプトを使ってPythonにデータを抽出することができます。あなたの場合

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:引数は、 'NoneType'ではなく、バイトのようなオブジェクトまたはASCII文字列でなければなりません。私は再び下に自分のコードを掲載します。あなたは見ていただけますか? – thomas2013ch

+0

2番目の部分の前に待機を追加してみてください。私はこれが起こっていると思います。あなたがonload関数が完了する前に変数の内容を取得しようとしているからです。 – TheChetan

+0

こんにちはTheChetan、私はより長い休止を設定し、確かに、PDFがダウンロードされます。どうもありがとう! – thomas2013ch

3

ブラウザでファイルを開かないでください。一度あなたは、ファイルのURLを持っています。あなたはタルンの溶液から同じ

別に
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のサイズは、ダウンロードしたPDFのサイズよりもはるかに小さいことがわかりました。私は私の全体のコードを再度以下に掲示します。見ていただけますか? – thomas2013ch

0

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

こんにちはAnurg、私はあなたのコードを後で試してみます。 – thomas2013ch

関連する問題