我已经得到了以下代码片段,大胆地告诉我它是“FAIL加载未定义”(神经......)我正在尝试将经过身份验证的会话传递给使用javascript的系统调用。
import requests
from requests_ntlm import HttpNtlmAuth
from subprocess import call
# THIS WORKS - 200 returned
s = requests.Session()
r = s.get("http://example.com",auth=HttpNtlmAuth('domain\MyUserName','password'))
call(["phantomjs", "yslow.js", r.url])
问题是当“calL”被调用时 - 我得到的是以下
FAIL to load undefined.
我猜测只传递正确的经过身份验证的会话应该有效 - 但问题是我该怎么做才能提取我想要的信息。在所有其他尝试中,这是最富有成果的。请帮忙 - 谢谢!
答案 0 :(得分:3)
这里似乎有几件事情,所以我会逐一解决。
python中的subprocess
模块用于调用系统,就像使用命令行一样。它不知道“经过身份验证的会话”,并且命令行(或shell)不知道如何使用python对象(如会话)来使用phantomjs
。
phantomjs
有python绑定since version 1.8所以我希望通过使用它们可以更容易。但是,我没有使用过它们,所以我不能肯定地告诉你它们会有所帮助。
我查看了yslow
的{{3}},似乎没有办法将要下载的内容传递给它。即使这样,内容也不会包含所有内容(例如:任何由selenium
/ phantomjs
或浏览器加载的外部托管的javascript都不会被请求加载)
yslow
好像通常只为您下载网址并执行分析。但是,当网站落后NTLM
时,它首先向客户端发送401响应,该响应应向客户端指示它必须进行身份验证。此外,信息被发送到客户端,告知它如何进行身份验证,并提供在NTLM
身份验证时使用的参数。这就是requests_ntlm
与requests
一起使用的方式。第一个请求生成并生成401响应,然后身份验证处理程序生成正确的标头并重新发送请求,这就是您看到200响应绑定到r
的原因。
yslow
接受您要发送的标头的JSON表示,这样您就可以尝试使用r.request.headers
中的标头,但我怀疑它们是否有效。
简而言之,这不是通常遵循requests
标记的人可以帮助您的问题。查看yslow
的文档似乎(技术上)不支持任何类型的身份验证。 yslow
开发人员可能会争辩说它支持基本身份验证,因为它允许您指定标头。