当前位置:  开发笔记 > 编程语言 > 正文

Python:urllib/urllib2/httplib混淆

如何解决《Python:urllib/urllib2/httplib混淆》经验,为你挑选了6个好方法。

我试图通过在Python中编写登录序列脚本来测试Web应用程序的功能,但我遇到了一些麻烦.

这是我需要做的事情:

    使用一些参数和标题执行POST.

    遵循重定向

    检索HTML正文.

现在,我对python相对较新,但到目前为止我测试过的两件事都没有用.首先我使用了httplib,putrequest()(传递URL中的参数)和putheader().这似乎没有遵循重定向.

然后我尝试了urllib和urllib2,将标题和参数作为dicts传递.这似乎返回登录页面,而不是我尝试登录的页面,我想这是因为缺少cookie或其他东西.

我错过了一些简单的事吗?

谢谢.



1> S.Lott..:

专注urllib2于此,它运作良好.不要乱用httplib,它不是顶级API.

您注意到的是urllib2不遵循重定向.

您需要折叠一个实例HTTPRedirectHandler,以捕获并遵循重定向.

此外,您可能希望将默认值子类HTTPRedirectHandler化为捕获信息,然后将其作为单元测试的一部分进行检查.

cookie_handler= urllib2.HTTPCookieProcessor( self.cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)

然后,您可以使用此opener对象进行POST和GET,正确处理重定向和cookie.

您可能还想添加自己的子类HTTPHandler来捕获和记录各种错误代码.


urllib2.urlopen似乎处理重定向就好了.

2> Jason Pepas..:

这是我对这个问题的看法.

#!/usr/bin/env python

import urllib
import urllib2


class HttpBot:
    """an HttpBot represents one browser session, with cookies."""
    def __init__(self):
        cookie_handler= urllib2.HTTPCookieProcessor()
        redirect_handler= urllib2.HTTPRedirectHandler()
        self._opener = urllib2.build_opener(redirect_handler, cookie_handler)

    def GET(self, url):
        return self._opener.open(url).read()

    def POST(self, url, parameters):
        return self._opener.open(url, urllib.urlencode(parameters)).read()


if __name__ == "__main__":
    bot = HttpBot()
    ignored_html = bot.POST('https://example.com/authenticator', {'passwd':'foo'})
    print bot.GET('https://example.com/interesting/content')
    ignored_html = bot.POST('https://example.com/deauthenticator',{})



3> Ace..:

@ S.Lott,谢谢.你的建议对我有用,经过一些修改.这就是我做到的.

data = urllib.urlencode(params)
url = host+page
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)

cookies = CookieJar()
cookies.extract_cookies(response,request)

cookie_handler= urllib2.HTTPCookieProcessor( cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)

response = opener.open(request)



4> Eli Courtwri..:

我最近必须自己做这件事.我只需要标准库中的类.这是我的代码的摘录:

from urllib import urlencode
from urllib2 import urlopen, Request

# encode my POST parameters for the login page
login_qs = urlencode( [("username",USERNAME), ("password",PASSWORD)] )

# extract my session id by loading a page from the site
set_cookie = urlopen(URL_BASE).headers.getheader("Set-Cookie")
sess_id = set_cookie[set_cookie.index("=")+1:set_cookie.index(";")]

# construct headers dictionary using the session id
headers = {"Cookie": "session_id="+sess_id}

# perform login and make sure it worked
if "Announcements:" not in urlopen(Request(URL_BASE+"login",headers=headers), login_qs).read():
    print "Didn't log in properly"
    exit(1)

# here's the function I used after this for loading pages
def download(page=""):
    return urlopen(Request(URL_BASE+page, headers=headers)).read()

# for example:
print download(URL_BASE + "config")



5> Matthew Chri..:

我给机械师(http://wwwsearch.sourceforge.net/mechanize/)一个机会.它可以透明地处理您的cookie /标题.



6> gimel..:

尝试使用twill - 一种允许用户从命令行界面浏览Web的简单语言.使用斜纹,您可以浏览使用表​​单,cookie和大多数标准Web功能的网站.更重要的是,twill被编写Python并具有python API,例如:

from twill import get_browser
b = get_browser()

b.go("http://www.python.org/")
b.showforms()

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有