1

当我访问 IIS 服务器上的页面以检索 xml 时,通过浏览器使用查询参数(使用下面示例中的 http)我会弹出一个用户名和密码登录对话框(似乎是系统标准对话框/形式)。一旦提交,数据就会到达。作为一个xml页面。

如何使用 urllib 处理这个问题?当我执行以下操作时,我永远不会提示输入 uid/psw。我只是得到一个回溯,指示服务器(正确)id 是我未授权的。在 Ipython 笔记本中使用 python 2.7

f = urllib.urlopen("http://www.nalmls.com/SERetsHuntsville/Search.aspx?SearchType=Property&Class=RES&StandardNames=0&Format=COMPACT&Query=(DATE_MODIFIED=2012-09-28T00:00:00%2B)&Limit=10")
s = f.read()
f.close()

指向 doc 的指针也很感激!没有找到这个确切的用例。

我计划将 xml 解析为 csv,如果这有影响的话。

4

3 回答 3

7

您正在处理http authentication。我一直觉得快速使用 urllib 库很棘手。requests python包使它超级简单。

url = "http://www.nalmls.com/SERetsHuntsville/Search.aspx?SearchType=Property&Class=RES&StandardNames=0&Format=COMPACT&Query=(DATE_MODIFIED=2012-09-28T00:00:00%2B)&Limit=10"
r = requests.get(url, auth=('user', 'pass'))
page = r.text

如果您查看该 url 的标头,您会发现它正在使用摘要身份验证:

{'content-length': '1893', 'x-powered-by': 'ASP.NET', 'x-aspnet-version': '4.0.30319', 'server': 'Microsoft-IIS/7.5' , 'cache-control': 'private', 'date': 'Fri, 05 Oct 2012 18:20:54 GMT', 'content-type': 'text/html; charset=utf-8', 'www-authenticate': 'Digest realm= "Solid Earth", nonce="MTAvNS8yMDEyIDE6MjE6MjUgUE0", opaque="0000000000000000", stale=false, algorithm=MD5, qop="auth"'}

所以你需要:

from requests.auth import HTTPDigestAuth
r = requests.get(url, auth=HTTPDigestAuth('user', 'pass'))
于 2012-10-05T17:36:55.347 回答
1

有很多方法可以做到,但我建议你从urllib2开始,它包括电池。

import urllib2, base64

req = urllib2.Request("http://webpage.com//user")
b64str = base64.encodestring('%s:%s' % (username, password)).replace('\n', '')
request.add_header("Authorization", "Basic %s" % b64str)   
result = urllib2.urlopen(req)

如果您的任务变得更难,您可以使用requestsbeautifulsoupmechanizeselenium 。谷歌搜索将为您提供足够的示例,

于 2012-10-05T17:39:41.950 回答
0

这可以通过以下几种方式完成:

  1. 使用urllib/urllib2requests其他人建议的那样
  2. 用于Mechanize模拟手动填表并取回响应
于 2012-10-05T17:53:52.773 回答