使用wget从需要设置cookie的站点下载PDF文件


8

我想访问一个报纸网站,然后下载他们的电子报纸副本(PDF格式)。该网站要求我使用我的电子邮件地址和密码登录,然后它允许我访问这些PDF URL。

我在Wget中设置“会话”时遇到了麻烦。当我从浏览器登录网站时,它会设置两个cookie值:

UserID=abc@gmail.com
Password=12345

我试过了:

wget --post-data "UserID=abc@gmail.com&Password=12345" http://epaper.abc.com/login.aspx

但是,刚刚下载了登录页面并将其保存在本地。

登录页面上的FORM有两个字段:

txtUserID
txtPassword

和radiobuttons像这样:

<input id="rbtnManchester" type="radio" checked="checked" name="txtpub" value="44">

另一个按钮:

<input id="rbtnLondon" type="radio" name="txtpub" value="64">

如果我将其发布到login.aspx页面,我会得到相同的输出

wget --post-data "txtUserID=abc@gmail.com&txtPassword=12345&txtpub=44" http://epaper.abc.com/login.aspx

如果我做:

--save-cookies abc_cookies.txt

除了默认内容之外,它似乎没有任何其他内容。

最后,如果我这样做--debug,它说:

...
Set-Cookie: ASP.NET_SessionId=05kphcn4hjmblq45qgnjoe41; path=/; HttpOnly
...
Stored cookie epaper.abc.com -1 (ANY) / <session> <insecure> [expiry none] ASP.NET_SessionId 05kphcn4hjmblq45qgnjoe41
Length: 107253 (105K) [text/html]
Saving to: `login.aspx'
...
Saving cookies to abc_cookies.txt.

但是,abc_cookies.txt仅显示以下内容:

# HTTP cookie file.
# Generated by Wget on 2011-08-16 08:03:05.
# Edit at your own risk.

(我不知道为什么我没有得到任何关于Stack Overflow的回复 - 也许超级用户是一个更好的网站 - 使用Wget从需要设置cookie的网站下载PDF文件。)


编辑1

C:\Temp>wget --cookies=on --keep-session-cookies --save-cookies abc_cookies.txt --post-data "txtUserID=abc%40gmail.com&txtPassword=password&txtpub=44&chkbox=checkbox&submit.x=48&submit.y=7" http://epaper.abc.com/login.aspx --debug
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = C:\Program Files (x86)\GnuWin32/etc/wgetrc
DEBUG output created by Wget 1.11.4 on Windows-MinGW.

--2011-08-18 08:15:59--  http://epaper.abc.com/login.aspx
Resolving epaper.abc.com... seconds 0.00, 999.999.99.99
Caching epaper.abc.com => 999.999.99.99
Connecting to epaper.abc.com|999.999.99.99|:80... seconds 0.00, connected.
Created socket 300.
Releasing 0x00a2ae80 (new refcount 1).

---request begin---
POST /login.aspx HTTP/1.0
User-Agent: Wget/1.11.4
Accept: */*
Host: epaper.abc.com
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 100

---request end---
[POST data: txtUserID=abc%40gmail.com&txtPassword=password&txtpub=44&chkbox=checkbox&submit.x=48&submit.y=7]
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 200 OK
Connection: keep-alive
Date: Thu, 18 Aug 2011 02:46:17 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=owcrje55yl45kgmhn43gq145; path=/; HttpOnly
Cache-Control: private
Content-Type: text/html; charset=utf-8
Content-Length: 107253

---response end---
200 OK
Registered socket 300 for persistent reuse.

Stored cookie epaper.abc.com -1 (ANY) / <session> <insecure> [expiry none] ASP.NET_SessionId owcrje55yl45kgmhn43gq145
Length: 107253 (105K) [text/html]
Saving to: `login.aspx.1'

100%[======================================================================================================================>] 107,253     24.9K/s   in 4.2s

2011-08-18 08:16:05 (24.9 KB/s) - `login.aspx.1' saved [107253/107253]

Saving cookies to abc_cookies.txt.
Done saving cookies.

C:\Temp>wget --referer=http://epaper.abc.com/login.aspx --cookies=on --load-cookies abc_cookies.txt --keep-session-cookies --save-cookies abc_cookies.txt http://epaper.abc.com/PagePrint/16_08_2011_001.pdf --debug
SYSTEM_WGETRC = c:/progra~1/wget/etc/wgetrc
syswgetrc = C:\Program Files (x86)\GnuWin32/etc/wgetrc
DEBUG output created by Wget 1.11.4 on Windows-MinGW.


Stored cookie epaper.abc.com -1 (ANY) / <session> <insecure> [expiry none] ASP.NET_SessionId owcrje55yl45kgmhn43gq145
--2011-08-18 08:16:12--  http://epaper.abc.com/PagePrint/16_08_2011_001.pdf
Resolving epaper.abc.com... seconds 0.00, 999.999.99.99
Caching epaper.abc.com => 999.999.99.99
Connecting to epaper.abc.com|999.999.99.99|:80... seconds 0.00, connected.
Created socket 300.
Releasing 0x00598290 (new refcount 1).

---request begin---
GET /PagePrint/16_08_2011_001.pdf HTTP/1.0
Referer: http://epaper.abc.com/login.aspx
User-Agent: Wget/1.11.4
Accept: */*
Host: epaper.abc.com
Connection: Keep-Alive
Cookie: ASP.NET_SessionId=owcrje55yl45kgmhn43gq145

---request end---
HTTP request sent, awaiting response...
---response begin---
HTTP/1.1 200 OK
Connection: keep-alive
Date: Thu, 18 Aug 2011 02:46:30 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
content-disposition: attachement; filename=Default_logo.gif
Cache-Control: private
Content-Type: image/GIF
Content-Length: 4568

---response end---
200 OK
Registered socket 300 for persistent reuse.
Length: 4568 (4.5K) [image/GIF]
Saving to: `16_08_2011_001.pdf'

100%[======================================================================================================================>] 4,568       7.74K/s   in 0.6s

2011-08-18 08:16:14 (7.74 KB/s) - `16_08_2011_001.pdf' saved [4568/4568]

Saving cookies to abc_cookies.txt.
Done saving cookies.

abc_cookies.txt的内容

epaper.abc.com       FALSE   /       FALSE   0       ASP.NET_SessionId       owcrje55yl45kgmhn43gq145

我怀疑你没有得到回复,因为很少有专家对wget的更高级用法。:(
jcrawfordor 2011年

@Frank - 尝试在初始登录wget中使用--keep-session-cookies,请参阅下面的答案。
EightBitTony 2011年

login.aspx是登录页面的URL,还是登录页面提交的URL?
爱德华·斯特恩2013年

Answers:


4

我认为你需要使用--keep-session-cookies保存会话cookie,而不仅仅是--save-cookies(你需要两者)。

基本上,你

wget --keep-session-cookies --save-cookies ..... url

登录并获取会话cookie。

然后

wget --load-cookie ...... url

下载PDF。


:(没有工作......没有骰子......
硅胶2011年

@Frank - 那么在每个阶段发生了什么,你是否按预期在磁盘上获得了cookie,如果你包含了你正在获得的回复的标题,等等。你能用你现在尝试的内容和返回的内容更新问题。
EightBitTony 2011年

嗨托尼 - 谢谢你试图帮忙 - 我对这件事情感到困惑!
Siliconpi 2011年

嗨托尼 - 你有机会看看详细的Edit1吗?
Siliconpi 2011年

是的,什么都没有跳出来。当你从第一个wget取回时,我唯一的查询是login.aspx中的内容吗?它是否表示您已成功登录?
EightBitTony 2011年

2

也许这会有所帮助。我尝试登录的网站有一些隐藏的字段,我需要在成功登录之前获取。因此,第一个wget获取登录页面以查找额外字段,第二个wget登录到站点并保存cookie,第三个wget然后使用这些cookie来获取您所追求的页面。

#!/bin/bash

# get the login page to get the hidden field data
wget -a log.txt -O loginpage.html http://foobar/default.aspx
hiddendata=`cat loginpage.html | grep value | grep foobarhidden | tr '=' ' ' | awk '{print $9}' | sed s/\"//g`
rm loginpage.html

# login into the page and save the cookies
postData=user=fakeuser'&'pw=password'&'foobarhidden=${hiddendata}
wget -a log.txt -O /dev/null --post-data ${postData} --keep-session-cookies --save-cookies cookies.txt http://foobar/default.aspx

# get the page you're after
wget -a log.txt -O results.html --load-cookies cookies.txt http://foobar/lister.aspx?id=42
rm cookies.txt

关于这个其他 SO帖子有一些有用的信息:


1
请尝试对您的答案进行去个性化(删除“我”)。除此之外,对于你们其中一个人的第一个答案,你们做得很好。
wizlog
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.