2011-12-31 98 views
5

有一个登录表单页面通常可以用如何下载登录后重定向的页面?

wget --no-check-certificate --save-cookies cookies --keep-session-cookies \ 
    --post-data="username=example&password=example" \ 
    "https://example.com/index.php?title=Special:Userlogin&returntotitle=" 

wget --no-check-certificate --load-cookies=cookies \ 
    --no-parent -r --level=2 -nc -E \ 
    https://example.com/Special:Sitemap 

下载,但在DekiWiki网站的情况下,如果需要登录这不起作用。在man wget

注被描述

问题缝线:如果wget重定向POST请求完成后,它不会 POST数据发送到重定向的URL。这是因为处理POST的URL通常会响应 ,并重定向到不需要或接受POST的常规页面。这不是 完全清楚,这种行为是最佳的;如果不能解决问题,可能会在将来更改 。

问题

可以这样使用Perl例如完成也许HTML::TreeBuilder 3HTML::TokeParserMechanize或任何其他Perl模块?

回答

4

某些需要登录的网站不会将cookie发回给回应。

相反,他们发送重定向响应(302对象移动),大多数浏览器会自动遵循该响应,然后在该重定向页面的响应中发送Cookie。

我使用curl通过启用curl_opt FOLLOW_LOCATION来执行此操作,对于使用-location选项的命令行工具。这是一个像wget这样的免费工具。

curl --cookie cookie.txt --cookie-jar cookie.txt \ 
    --data-urlencode "username=example&password=example" \ 
    --insecure --location https://example.com/index.php?title=Special:Userlogin&returntotitle= -o downloadedfile.html https://example.com/Special:Sitemap 

http://curl.haxx.se/download.html

此外,有时一个登录表单预计的多部分/格式数据后,而不是仅仅一个应用程序/ x-WWW窗体-urlencoded交。为了让curl做一个多部分/表单数据的post转换,他将--data-urlencode改为-F。

+0

非常有趣。是否也可以镜像该网站?在我的例子中,我使用wget的'--no-parent -r --level = 2'。 – 2011-12-31 18:36:16

+1

您的意思是递归下载从原始页面指向的所有页面?不,curl的no -r --level = 2等效,但是,API接口libcurl可以很容易地编程来解析html页面,并下载该页面中的所有链接。 Libcurl具有以下语言(以及更多)的绑定: @Motes,“-cookie-jar”C++,Java,Lisp,.NET,Object-Pascal,Pascal,Perl,PHP,Python,Ruby,Visual Basic – Motes 2012-01-02 03:28:18

+0

@需要改成“--cookie-jar”,对吧? – Sathish 2012-05-26 03:25:45