Python:urllib/urllib2/존하는 소프트웨어를 돌리는 혼란
문제
하려고 해요 기능을 테스트하는 웹 응용 프로그램의에 의해 스크립트 로그인 시퀀스에서는 파이썬지만,나는 몇 가지 문제입니다.
여기에 내가 무엇을 할 필요가 있다:
- 당시와 함께 몇 가지 매개 변수와 합니다.
- 따라 리디렉션
- 검색 HTML 체.
지금,나는 상대적으로 새로운 python,하지만 두 가지를 내가 지금까지 테스트하지 않은 일.첫 번째 사용존하는 소프트웨어를 돌로,putrequest()(전달하는 매개 변수 내에서 URL)및 putheader().이 보이지 않았을 따라 리디렉션합니다.
을 urllib 및 urllib2,모두 통과 헤더와 매개변수로 dicts.이를 반환하의 로그인 페이지 대신 페이지의하는 로그인하면 나는 그것 때문에 부족의 쿠키 또는 무언가이다.
나는 뭔가가 간단합니까?
감사합니다.
해결책
집중하십시오 urllib2
이를 위해서는 아주 잘 작동합니다. 엉망이되지 마십시오 httplib
, 그것은 최상위 API가 아닙니다.
당신이 지적하는 것은 그게 그게됩니다 urllib2
리디렉션을 따르지 않습니다.
인스턴스에서 접어야합니다 HTTPRedirectHandler
그것은 리디렉션을 잡고 따를 것입니다.
또한 기본값을 서브 클래스 할 수 있습니다 HTTPRedirectHandler
정보를 캡처하려면 장치 테스트의 일부로 확인하십시오.
cookie_handler= urllib2.HTTPCookieProcessor( self.cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)
그런 다음 이것을 사용할 수 있습니다 opener
게시하고 얻을 수있는 객체를 올바르게 리디렉션과 쿠키를 처리합니다.
자신의 서브 클래스를 추가하고 싶을 수도 있습니다 HTTPHandler
다양한 오류 코드를 캡처하고 로그인합니다.
다른 팁
이 문제에 대한 나의 취향은 다음과 같습니다.
#!/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',{})
@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)
나는 최근 에이 정확한 일을해야했다. 표준 라이브러리에서만 수업이 필요했습니다. 다음은 내 코드의 발췌문입니다.
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")
고 기계화(http://wwwsearch.sourceforge.net/mechanize/)습니다.그것은 잘 처리하는 쿠키/헤더 제어됩니다.
쿠키가 없을 수 있다는 사실 외에도 웹 서버에 게시하지 않는 형태의 일부 필드가있을 수 있습니다. 가장 좋은 방법은 웹 브라우저에서 실제 게시물을 캡처하는 것입니다. 당신이 사용할 수있는 LivehttPheaders 또는 Wireshark 트래픽을 스누핑하고 스크립트에서 동일한 동작을 모방합니다.
펑크로드 훌륭한 웹 앱 테스트 도구이기도합니다. 브라우저 에뮬레이션을 처리하기 위해 WebUnit을 랩핑 한 다음 기능 및로드 테스트 기능을 모두 제공합니다.