我正在尝试递归下载网站,该网站通常仅在您登录时才可用。
我有有效的用户名和密码,但问题是我需要通过网络界面登录,所以使用--user=user and --password=password
没有帮助。
wget
仅下载一个包含文本的网页:
抱歉,此页面不可用,也许您忘记登录?
可以下载吗?
即使在登录页面,我也无法使用 --user, --password,因为没有 FTP/HTTP 文件检索登录,如以下所述man wget
:
--user=user
--password=password
Specify the username user and password password for both FTP and
HTTP file retrieval.
经典的图形登录就在那里。
如果我尝试这样做:wget --save-cookies coookies --keep-session-cookies --post-data='j_username=usr&j_password=pwd' 'https://idp2.civ.cvut.cz/idp/Authn/UserPassword'
.使用POST方法登录并尝试保存cookie,cookie文件为空,保存的页面是一些错误页面。
网址是https://idp2.civ.cvut.cz/idp/Authn/UserPassword
。实际上,当我想登录时,它会将我重定向到此页面,当我成功登录时,它会将我重定向回我之前所在的页面或登录后我想要进入的某个页面(例如:https://progtest.fit.cvut.cz/
.
答案1
会话信息可能保存在 cookie 中,以便您在登录后导航到其他页面。
如果是这种情况,您可以分两步执行此操作:
- 在网站登录页面上使用
wget
和--save-cookies mycookies.txt
选项以及您的和选项--keep-session-cookies
--username
--password
- 在您尝试检索的后续页面上使用
wget
的选项。--load-cookies mycookies.txt
编辑
如果--password
and--username
选项不起作用,您必须找出登录页面发送到服务器的信息并模仿它:
- 对于
GET
请求,您可以GET
直接在 wget 必须获取的地址中添加参数(确保正确引用&
,=
和其他特殊字符)。该网址可能类似于https://the_url?user=foo&pass=bar
。 - 对于
POST
请求,您可以使用wget
的--post-data=the_needed_info
选项对所需的登录信息使用 post 方法。
编辑2
看来您确实需要POST
带有j_username
and j_password
set 的方法。尝试--post-data='j_username=yourusername&j_password=yourpassword
选择wget
.
编辑3
通过原始页面,我能够更多地了解正在发生的事情。话虽如此,我无法确定它是否有效,因为我没有(也不想要)有效的凭据。
话虽如此,这就是发生的事情:
- 该页面
https://progtest.fit.cvut.cz/
会设置PHPSESSID
cookie 并为您提供登录选项。 - 单击该
login
按钮会发送一个请求,https://progtest.fit.cvut.cz/shibboleth-fit.php
该请求会获取 PHPSESSID cookie(不确定它是否使用它),并将您重定向到 SSO 引擎,其中包含专门为您设计的 URL,如下所示:https://idp2.civ.cvut.cz/idp/profile/SAML2/Redirect/SSO?SAMLRequest=SOME_VERY_LONG_AND_UNIQUE_ID
- SSO 响应设置一个名为 的新 cookie ,并将您重定向到再次重定向到的
_idp_authn_lc_key
页面(真正的登录页面)https://idp2.civ.cvut.cz:443/idp/AuthnEngine
https://idp2.civ.cvut.cz:443/idp/Authn/UserPassword
- 您输入您的凭据并发送发布数据
j_username
以及j_password
来自 SSO 响应的 cookie - ???
wget
前四个步骤可以这样完成:
origin='https://progtest.fit.cvut.cz/'
# Get the PHPSESSID cookie
wget --save-cookies phpsid.cki --keep-session-cookies "$origin"
# Get the _idp_authn_lc_key cookie
wget --load-cookies phpsid.cki --save-cookies sso.cki --keep-session-cookies --header="Referer: $origin" 'https://progtest.fit.cvut.cz/shibboleth-fit.php'
# Send your credentials
wget --load-cookies sso.cki --save-cookies auth.cki --keep-session-cookies --post-data='j_username=usr&j_password=pwd' 'https://idp2.civ.cvut.cz/idp/Authn/UserPassword'
请注意,wget
重定向完全由他自己完成,这在这种情况下对我们有很大帮助。
答案2
你为什么要玩弄wget
?最好用一些无头浏览器来自动执行此任务。
您问什么是无头浏览器?
无头浏览器是没有图形用户界面的网络浏览器。它们在类似于流行 Web 浏览器的环境中提供网页的自动控制,但通过命令行界面或使用网络通信来执行。
两种流行的无头浏览器是phantomjs
(javascript)和Ghost.py
(python)。
使用phantomjs的解决方案
首先您需要安装phantomjs
.在基于 Ubuntu 的系统上,您可以使用包管理器安装它,也可以从他们的源代码构建它主页。
sudo apt-get install phantomjs
之后,您编写 javascript 脚本并使用 phantomjs 运行它:
phantomjs script.js
就是这样。
现在,要了解如何针对您的案例实施它,请前往其快速入门指南。举个例子,要自动登录 Facebook 并拍摄快照,可以使用提供的要点这里:
// This code login's to your facebook account and takes snap shot of it.
var page = require('webpage').create();
var fillLoginInfo = function(){
var frm = document.getElementById("login_form");
frm.elements["email"].value = 'your fb email/username';
frm.elements["pass"].value = 'password';
frm.submit();
}
page.onLoadFinished = function(){
if(page.title == "Welcome to Facebook - Log In, Sign Up or Learn More"){
page.evaluate(fillLoginInfo);
return;
}
else
page.render('./screens/some.png');
console.log("completed");
phantom.exit();
}
page.open('https://www.facebook.com/');
查看文档以针对您的具体情况实施它。如果您的网站由于 ssl 错误而遇到一些问题https
,请像这样运行脚本:
phantomjs --ssl-protocol=any script.js
使用 Ghost.py 的解决方案
要安装 Ghost.py,您将需要pip
:
sudo apt-get install python-pip #On a Debian based system
sudo pip install Ghost.py
现在您已经安装了 Ghost.py。现在,要在 python 脚本中使用它,只需按照其中给出的文档进行操作即可主页。我尝试过在 https 网站上使用 Ghost.py,但不知何故它对我不起作用。请尝试一下,看看是否有效。
更新:基于 GUI 的解决方案
您还可以使用类似的工具硒自动执行登录过程并检索信息。它非常容易使用。您只需要为您的浏览器安装一个插件这里。然后您可以记录您的过程并稍后重播。
答案3
尝试使用'curl'
curl --data "j_username=value1&j_password=value2" https://idp2.civ.cvut.cz/idp/Authn/UserPassword
您可能需要查看响应类型并设置'content-type'
标头以匹配;即:XML、json 等
答案4
我的做法是:首先,我将使用 firefox 的实时 HTTP headers 插件来分析通信。可能需要推荐人和所有这些东西。一旦我掌握了这些信息,我就会模仿wget
保存 cookie 并在需要时加载。