我正在尝试通过一个via服务器自动下载文件。我计划使用wget或curl或python / urllib2。
大多数解决方案使用wget、urllib和urllib2。他们都谈到了基于HHTP的认证和基于cookie的身份验证。我的问题是,我不知道哪一个是用于存储我的数据的网站。以下是与网站的互动:
浏览器为我提供了保存文件的机会
我想知道如何确定站点是使用HTTP还是基于cookie的身份验证。在此之后,我假设我可以使用python中的urllib2或urllib2连接到它,获取文件和文件夹的列表,并在保持连接的同时递归下载所有内容。
p.S:我已经尝试过通过wget和wget连接的方式--http--用户"uname“--http-密码"passwd”http://www.anysite.com/index.cgi?,但是他们只将网页表单返回给我。
发布于 2010-10-15 18:00:13
如果您使用网页登录,网站可能使用基于cookie的身份验证。(从技术上讲,它可以通过在URI中嵌入凭据来使用HTTP,但在大多数情况下这是一件愚蠢的事情。)如果您使用用户名和密码字段(就像这个)获得一个单独的小型对话框,则它使用的是HTTP身份验证。
如果您尝试使用HTTP登录,并返回登录页面,就像发生在您身上的情况一样,这是站点没有使用HTTP的一个特定指示。
如今,大多数网站都使用基于cookie的身份验证。要使用HTTP (如urllib2 )来实现这一点,您需要在登录表单中对字段执行HTTP。(您可能需要首先请求登录表单,因为站点可能包含您甚至需要登录的cookie,但这通常是不必要的。)这应该会返回一个您可以测试的“成功登录”页面。保存从这个请求中得到的cookie。在提出下一个请求时,请包括这些cookie。您提出的每个请求都可以使用cookie进行响应,您需要保存这些文件,并在下一个请求中再次发送它们。
urllib2有一个名为"cookie jar“的函数,它将在发送请求和接收网页时自动为您处理cookie。这就是你想要的。
发布于 2010-10-16 09:28:37
你可以这样使用吡咯烷醇:
import pycurl
COOKIE_JAR = 'cookiejar' # file to store the cookies
LOGIN_URL = 'http://www.yoursite.com/login.cgi'
USER_FIELD = 'user' # Name of the element in the HTML form
USER = 'joe'
PASSWD_FIELD = 'passwd' # Name of the element in the HTML form
PASSWD = 'MySecretPassword'
def read(html):
"""Read the body of the response, with posible
future html parsing and re-requesting"""
print html
com = pycurl.Curl()
com.setopt(pycurl.WRITEFUNCTION, read)
com.setopt(pycurl.COOKIEJAR, COOKIE_JAR)
com.setopt(pycurl.FOLLOWLOCATION, 1) # follow redirects
com.setopt(pycurl.POST, 1)
com.setopt(pycurl.POSTFIELDS, '%s=%s;%s=%s'%(USER_FIELD, USER,
PASSWD_FIELD, PASSWD))
com.setopt(pycurl.URL, LOGIN_URL )
com.perform()简单的pycurl --它可能缝得非常“原始”(使用有限的setopt方法),但是它完成了工作,并且很好地处理了cookie jar选项。
发布于 2010-10-15 18:26:08
基于AFAIK cookie的身份验证只在您成功登录至少一次之后才会使用。如果仍然能够下载应该是基于HTTP的身份验证的文件,则可以尝试通过更改浏览器设置从该域禁用cookie。
尝试为登录(可能是POST)登录请求执行一个等效的GET请求,这个请求现在可能发生在登录中。使用firebug或fiddler查看发送的登录请求。还请注意,如果存在一些javascript代码,它将根据您的useragent字符串或其他参数返回一个不同的输出。
看看httplib,机械化是否有帮助。
https://stackoverflow.com/questions/3944624
复制相似问题