在会话中保存凭据

时间:2017-08-03 12:21:42

标签: python web-scraping python-requests pdfkit splinter

我正在尝试使用pdfkit对我们公司的wiki进行可视化备份。我遇到了麻烦,因为网站要求用户登录才能使用。我使用splinter开发了一个脚本,该脚本登录到公司wiki,但是当pdfkit执行时,它会返回登录页面。在这种情况下,PDFkit必须打开一个不同的会话。我怎样才能找到访问我网站上的页面需要凭据(cookie)的时间,并将它们保存为变量以便我可以抓住这些屏幕截图?

我正在使用python 2.7.8 splinter,requests和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 个答案:

答案 0 :(得分:2)

当您使用Splinter browser登录时,该网站会向您发送标识您的授权会话的HTTP cookiesbrowser会记住这些会话以获取进一步的请求。

但是PDFKit对你的browser一无所知。它只是将您提供的URL传递给基础wkhtmltopdf工具,该工具然后使用自己的默认设置获取页面。

您需要做的是将Cookie从browser转移到wkhtmltopdf。值得庆幸的是,以这种方式连接Splinter和PDFKit很容易:

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

答案 1 :(得分:0)

你必须处理cookies:

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)