【问题标题】:Save Credentials in a Session在会话中保存凭据
【发布时间】:2017-08-03 12:21:41
【问题描述】:

我正在尝试使用 pdfkit 对我们公司的 wiki 进行可视化备份。我遇到了麻烦,因为该网站要求用户登录才能使用。我使用登录公司 wiki 的 splinter 开发了一个脚本,但是当 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()

对如何完成此任务的任何想法表示赞赏

【问题讨论】:

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


    【解决方案1】:

    当您使用 Splinter browser 登录时,该网站会向您发送 HTTP cookies 以识别您的授权会话,browser 会记住它们以供进一步请求。

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

    【讨论】:

    • 这最终奏效了。感谢您的帮助。然而,它只覆盖了页面的顶部。是否有办法设置参数或确保它截屏整个页面?
    • @ChaseRaab 不确定,抱歉。请参阅list of wkhtmltopdf options — 所有这些都可以通过 pdfkit 的 options 字典传递,如 pdfkit docs 中所述。如果这没有帮助,请尝试提出一个单独的问题。
    【解决方案2】:

    您必须处理 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)
    

    【讨论】:

    • 你有什么文档可以帮助我理解它的功能吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-28
    • 2014-04-28
    • 1970-01-01
    • 1970-01-01
    • 2023-01-28
    • 2019-03-14
    相关资源
    最近更新 更多