如何使用Wget跳过登录页面?

314

我正在尝试使用Wget下载一个页面,但是我无法通过登录屏幕。

如何在登录页面上使用post数据发送用户名/密码,然后以经过身份验证的用户下载实际页面?


4
使用curl:https://dev59.com/questions/WGct5IYBdhLWcg3wCZIT使用curl访问需要登录的页面,该页面可以从另一个页面登录。 - Ciro Santilli OurBigBook.com
11个回答

386

根据手册页面:

# Log in to the server.  This only needs to be done once.
wget --save-cookies cookies.txt \
     --keep-session-cookies \
     --post-data 'user=foo&password=bar' \
     --delete-after \
     http://server.com/auth.php

# Now grab the page or pages we care about.
wget --load-cookies cookies.txt \
     http://server.com/interesting/article.php

确保--post-data参数被正确地百分号编码(尤其是&符号!),否则请求可能会失败。同时,确保userpassword是正确的键;您可以通过查看登录页面的HTML(使用浏览器的“检查元素”功能并找到用户名和密码字段上的name属性)来确定正确的键。


10
将--keep-session-cookies添加到第一个命令还是第二个命令? - Felipe Alvarez
4
针对此操作,您无需使用“-p”(“--page-requisites”)参数。 - ændrük
14
值得一提的是,在第一次检索时加入--delete-after选项,这样您就不会把登录后的结果页保存下来。 - Jim Hunziker
2
我遇到了错误"WGET64:缺少URL",我将整个wget命令放在一行中并删除了"\"。 - Mowgli
6
--keep-session-cookies 参数仅在第一个命令中需要。它告诉第一个命令在将 cookies 保存到文件时包括会话 cookies。第二个命令只需从提供的文件中读取所有 cookies。 - wadim
显示剩余6条评论

117

您可以通过Firefox登录,然后复制所需的标头:

screenshot

在Firefox的浏览器开发者工具的网络选项卡中使用“复制为cURL”,将curl的标志-H替换为wget的--header(如果需要,还要将--data替换为--post-data)。

太棒了!还指引我使用curl而不是wget选项,因为它可以完成相同的任务,而且我甚至不需要更改参数。 - Jan
这对我起作用了,而带有正确 cookie 的 wget 却没有;我怀疑 Web 服务检查多个不同的 GET 标头,甚至是看似不重要的标头,如“User-Agent”或“Cache-Control”。 - Arthur
1
@Arthur 对我来说,这个解决方案是唯一有效的。我尝试尽可能从URL中删除头数据,最终得到了基本上是cookie数据的东西。因此,我怀疑wget以错误的方式提供了数据。 - Florian Blume
你怎么能只说“通过浏览器”,是指Chrome还是Firefox? - barlop
这也可以在Opera中完成。在那种情况下,对于我来说会显示两个不同的选项,即“复制为cURL(cmd)”和“复制为cURL(bash)”。在我的案例中,选择“复制为cURL(cmd)”选项后,我还需要进行以下更改:
  • 将参数值中的某些特殊字符(如冒号“:”)替换为它们的百分比编码(%3A表示冒号)。
  • 删除复制命令中遍布的符号“^”。
- J. D.

77

我使用 --no-cookies 和 Cookie HTTP 请求头直接将现有连接的 cookie 传递给 wget。在我的情况下,这是一个 Moodle 大学登录,登录看起来更加复杂(使用带有登录票据的多个请求)。我添加了 --post-data,因为这是一个 POST 请求。

例如,获取所有 Moodle 用户列表:

wget --no-cookies --header "Cookie: <name>=<value>" --post-data 'tab=search&name=+&personsubmit=Rechercher&keywords=&keywordsoption=allmine' https://moodle.unistra.fr/message/index.php

8
很棒的提示。当您能够从自己的计算机访问 cookie,然后可以在另一台无界面机器上通过命令行使用该 cookie 时,此技巧非常有用。 :) - Tuxdude
4
您可以同时设置多个 cookies,即:--header "Cookie: access_token=IKVYJ;XSRF-TOKEN=5e10521d"。 - Phil C

32

我曾经遇到同样的问题。我的解决方法是通过Chrome登录并将cookie数据保存到文本文件中。可以使用此Chrome扩展轻松完成此操作:Chrome cookie.txt export extension

获取cookie数据时,还提供了使用wget的示例。您可以获得一个简单的复制粘贴命令行。


1
很遗憾,在自动化脚本中不适用。 - Znik
1
问题没有指定自动化脚本。这个解决方案允许99%的工作自动化。 - Will Sheppard
1
不幸的是,Google可能对这个技巧太聪明了。我仍然会得到一个登录页面。 - Josiah Yoder
1
当然,谷歌使用秘密的reCAPTCHA...正如我在许多地方看到的那样,在这种情况下使用标准编程API是最实际的选择。 - Josiah Yoder
你贴的链接不幸地失效了。这个链接可以使用:https://chrome.google.com/webstore/detail/get-cookiestxt/bgaddhkoddajcdgocldbbfleckgcbcid要与wget一起使用:wget --load-cookies /path/to/cookies.txt - Andreas Schwarz

10

我想要一行代码,不需要下载任何文件;以下是将cookie输出导入到下一个请求的示例。我只在Gentoo上测试过以下代码,但它应该适用于大多数*nix环境:

wget -q -O /dev/null --save-cookies /dev/stdout --post-data 'u=user&p=pass' 'http://example.com/login' | wget -q -O - --load-cookies /dev/stdin 'http://example.com/private/page'

(这是一行内容,但它可能会在您的浏览器上换行)

如果您想将输出保存到文件中,请将-O -更改为-O /some/file/name.ext


9
您不需要使用cURL来进行POST表单数据的操作。使用--post-data 'key1=value1&key2=value2'即可。注意:您也可以将POST数据保存在文件中,并使用wget命令并传递该文件名进行操作。

8
如果他们正在使用基本身份验证:
wget http://username:password@www.domain.com/page.html

如果他们正在使用POST表单数据,您需要使用类似cURL的东西。

我没有更改服务器上任何内容的权限,它是只读的。 - Señor Reginold Francis
7
那么?这并不需要你在服务器上做任何更改。 - ceejayoz
Op要求使用wget,并明确需要带有cookies的答案。 - hiburn8
@hiburn8,你是跳过了“如果他们使用基本身份验证”这一部分吗?如果 OP 十二年后需要*任何东西,他们可能会遇到麻烦。 - ceejayoz

7

使用lynx和wget的解决方案。

注意: 要使此方法生效,Lynx必须使用--enable-persistent-cookies 标志进行编译。

当你想要使用wget从需要登录的网站下载文件时,你只需要一个cookie文件。 为了生成cookie文件,我选择了lynx。 lynx是一个文本浏览器。 首先,你需要一个lynx的配置文件来保存cookie。 创建一个名为lynx.cfg的文件。将以下配置写入文件中。

SET_COOKIES:TRUE
ACCEPT_ALL_COOKIES:TRUE
PERSISTENT_COOKIES:TRUE
COOKIE_FILE:cookie.file

然后使用以下命令启动lynx:

lynx -cfg=lynx.cfg http://the.site.com/login

在您输入用户名和密码并选择“保存此计算机”的选项后,如果成功登录,您将看到该网站的一个美丽的文本网页。然后您可以注销。

在当前目录中,您会发现一个名为cookie.file的cookie文件。这是我们使用wget所需要的。

然后,您可以使用以下命令使用wget从该网站下载文件:

wget --load-cookies ./cookie.file http://the.site.com/download/we-can-make-this-world-better.tar.gz

3
如果登录需要 JavaScript,那怎么办?Lynx 似乎不支持 JavaScript。 - Tiberiu

7

以下是使用wget在服务器上下载大文件的示例链接,这个链接可以在你的浏览器中获取。

例如,使用Google Chrome浏览器。

登录到需要下载的网站,点击下载按钮。然后转到下载页面并复制你的链接。

enter image description here

接着,在登录状态下打开一个页面,打开开发者工具,转到控制台,输入document.cookie来获取你的Cookie信息。

enter image description here

现在,转到服务器并下载你的文件:wget --header "Cookie: <YOUR_COOKIE_OUTPUT_FROM_CONSOLE>" <YOUR_DOWNLOAD_LINK>

enter image description here


这个答案似乎无法很好地适用于谷歌——那里有两页的cookies! - Josiah Yoder
当然,谷歌使用秘密的reCAPTCHA...正如我看到的那么多地方所述,在这种情况下使用标准编程API是最实际的选择。 - Josiah Yoder

1
我使用这个Chrome扩展程序。它会为您打开的任何下载链接提供wget命令。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接