2017-08-03 78 views
2

我正在嘗試使用pdfkit對我們公司的wiki進行可視化備份。由於網站要求用戶登錄才能使用,因此我遇到了麻煩。我使用splinter開發了一個腳本,登錄到公司wiki中,但是當pdfkit執行時,它會返回登錄頁面。在這種情況下,PDFkit必須打開不同的會話。我如何能夠找出何時需要憑據(cookie)來訪問我網站上的頁面,並將它們保存爲變量,以便抓取這些屏幕截圖?在會話中保存憑證

我使用python 2.7.8分裂,請求和pdfkit

from splinter import Browser 
browser = Browser() 
browser.visit('https://companywiki.com') 
browser.find_by_id('login-link').click() 
browser.fill('os_username', 'username') 
browser.fill('os_password', 'password') 
browser.find_by_name('login').click() 
import pdfkit 
pdfkit.from_url("https://pagefromcompanywiki.com", "c:/out.pdf") 

我也發現下面的腳本將登錄我和保存憑據,但我不知道如何配合它在以我正在嘗試做什麼。

import requests 
import sys 
EMAIL = '' 
PASSWORD = '' 
URL = 'https://company.wiki.com' 
def main(): 
    session = requests.session(config={'verbose': sys.stderr}) 
    login_data = { 
     'loginemail': EMAIL, 
     'loginpswd': PASSWORD, 
     'submit': 'login', 
    } 
    r = session.post(URL, data=login_data) 
    r = session.get('https://pageoncompanywiki.com'). 

if __name__ == '__main__': 
    main() 

如何完成這一任務的任何想法表示讚賞

回答

2

當你與你的分裂browser登錄時,該網站向您發送HTTP cookies標識授權的會話,並browser記住這些進一步的請求。

但PDFKit對您的browser一無所知。它只是將您放棄的URL傳遞給底層wkhtmltopdf工具,然後該工具使用其自己的默認設置來獲取頁面。

你需要做的是將cookies從browser轉移到wkhtmltopdf。謝天謝地,用這種方式連接Splinter和PDFKit很容易:

options = {"cookie": browser.cookies.all().items()} 
pdfkit.from_url("https://pagefromcompanywiki.com", "c:/out.pdf", options=options) 
+0

這結束了工作。感謝您的幫助。但它只能屏蔽頁面的頂部。任何想法,如果有方法來設置參數,或確保它屏幕截圖整個頁面? –

+0

@ChaseRaab不知道,對不起。請參閱[wkhtmltopdf選項列表](https://wkhtmltopdf.org/usage/wkhtmltopdf.txt) - 所有這些都可以通過pdfkit的「選項」字典傳遞,如[pdfkit docs](https:// pypi .python.org /的PyPI/pdfkit)。如果這沒有幫助,請嘗試單獨提問。 –

0

你必須處理Cookie:

class CookieJar(cookielib.CookieJar): 
    def _cookie_from_cookie_tuple(self, tup, request): 
     name, value, standard, rest = tup 
     version = standard.get('version', None) 
     if version is not None: 
      version = version.replace('"', '') 
      standard["version"] = version 
     return cookielib.CookieJar._cookie_from_cookie_tuple(self, tup, request) 

,你需要一個開瓶器以及

def getOpener(self): 
    handlers = [] 
    cj = CookieJar(); 
    cj.set_policy(cookielib.DefaultCookiePolicy(rfc2965=True)) 
    cjhdr = urllib2.HTTPCookieProcessor(cj) 
    handlers.append(cjhdr)            
    return urllib2.build_opener(*handlers)  

和你會做類似

urlHandle = self.getOpener().open(request) 
+0

是否有任何文檔可以幫助我理解此功能? –