1

我正在尝试通过网络服务器自动下载文件。我打算使用 wget 或 curl 或 python urllib / urllib2。

大多数解决方案使用 wget 和 urllib 和 urllib2。他们都在谈论基于 HHTP 的身份验证和基于 cookie 的身份验证。我的问题是我不知道在存储我的数据的网站中使用了哪一个。以下是与网站的互动:

  1. 通常我登录网站http://www.anysite.com/index.cgi
  2. 我得到一个带有登录名和密码的表格。我输入两者并按回车键。
  3. 网址保持为http://www.anysite.com/index.cgi?在整个交互过程中。但现在我有一个文件夹和文件列表
  4. 如果我单击文件夹或文件,URL 将更改为http://shamrockstructures.com/cgi-bin/index.cgi?page=download&file=%2Fhome%2Fjanysite%2Fpublic_html%2Fuser_data%2Fuserareas%2Ffile.tar.bz2

浏览器为我提供了保存文件的机会

我想知道如何确定该站点是使用 HTTP 还是基于 cookie 的身份验证。之后我假设我可以在 python 中使用 cookielib 或 urllib2 来连接它,获取文件和文件夹列表并在保持连接的同时递归下载所有内容。

pS:我已经尝试过通过 wget 和 wget --http-user "uname" --http-password "passwd" http://www.anysite.com/index.cgi连接的千篇一律的方法?,但他们只将网络表单返回给我。

4

3 回答 3

2

如果您使用网页登录,则该站点可能正在使用基于 cookie 的身份验证。(从技术上讲,它可以通过将您的凭据嵌入到 URI 中来使用 HTTP 基本身份验证,但在大多数情况下,这将是一件愚蠢的事情。)如果您得到一个单独的、带有用户名和密码字段的小对话框(就像这个),它使用 HTTP 基本身份验证。

如果您尝试使用 HTTP 基本身份验证登录,并返回登录页面,就像发生在您身上的那样,这表明该站点没有使用 HTTP 基本身份验证。

如今,大多数网站都使用基于 cookie 的身份验证。要使用 urllib2 等 HTTP 客户端执行此操作,您需要对登录表单中的字段进行 HTTP POST。(您可能需要首先实际请求登录表单,因为站点可能包含您甚至需要登录的 cookie,但通常这不是必需的。)这应该返回一个您可以测试的“成功登录”页面. 保存您从此请求返回的 cookie。发出下一个请求时,包括这些 cookie。您发出的每个请求都可能使用 cookie 进行响应,您需要保存它们并在下一个请求时再次发送它们。

urllib2 有一个称为“cookie jar”的功能,它会在您发送请求和接收网页时自动为您处理 cookie。那就是你想要的。

于 2010-10-15T18:00:13.947 回答
1

您可以像这样使用 pycurl:

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 选项很好地处理 cookie。

于 2010-10-16T09:28:37.027 回答
0

仅在您至少成功登录一次后才使用基于 AFAIK cookie 的身份验证。如果您仍然能够下载应该是基于 HTTP 的身份验证的文件,您可以尝试通过更改浏览器设置来禁用从该域存储 cookie。

尝试对可能正在发生的登录请求(可能是 POST)执行等效的 GET 请求。使用 firebug 或 fiddler 查看发送的登录请求。另请注意,是否有一些 javascript 代码根据您的用户代理字符串或其他参数返回不同的输出。

看看httplibmechanize是否有帮助。

于 2010-10-15T18:26:08.600 回答