2008-11-19 23 views
52

मैं पाइथन में एक लॉगिन अनुक्रम स्क्रिप्ट करके एक वेब ऐप की कार्यक्षमता का परीक्षण करने की कोशिश कर रहा हूं, लेकिन मुझे कुछ परेशानी हो रही है।पायथन: urllib/urllib2/httplib भ्रम

  1. कुछ मापदंडों और हेडर के साथ एक पोस्ट कार्य करें:

    यहाँ मैं क्या करने की जरूरत है।

  2. एक रीडायरेक्ट का पालन करें
  3. HTML निकाय पुनर्प्राप्त करें।

अब, मैं पाइथन के लिए अपेक्षाकृत नया हूं, लेकिन अब तक जिन दो चीजों का मैंने परीक्षण किया है, वे काम नहीं कर पाए हैं। सबसे पहले मैंने presreplib का उपयोग किया, putrequest() (यूआरएल के भीतर पैरामीटर पास करना), और putheader() के साथ। यह रीडायरेक्ट का पालन नहीं करता प्रतीत होता है।

तब मैंने यूरिलिब और urllib2 की कोशिश की, दोनों शीर्षलेखों और पैरामीटर को डिक्ट्स के रूप में पारित किया। ऐसा लगता है कि जिस पृष्ठ पर मैं लॉगिन करने का प्रयास कर रहा हूं, उसके बजाय लॉगिन पृष्ठ लौटा रहा है, मुझे लगता है कि यह कुकीज़ या कुछ की कमी के कारण है।

क्या मुझे कुछ आसान याद आ रही है?

धन्यवाद।

+1

पायथन अनुरोध पुस्तकालय का उपयोग करें। – hughdbrown

उत्तर

31

इस पर urllib2 पर फ़ोकस करें, यह काफी अच्छा काम करता है। httplib के साथ गड़बड़ न करें, यह शीर्ष-स्तर API नहीं है।

आप जो भी नोट कर रहे हैं वह है कि urllib2 पुनर्निर्देशन का पालन नहीं करता है।

आपको HTTPRedirectHandler के उदाहरण में फोल्ड करने की आवश्यकता है जो रीडायरेक्ट को पकड़ और पालन करेगा।

आगे, आप उस जानकारी को कैप्चर करने के लिए डिफ़ॉल्ट HTTPRedirectHandler को उपclass करना चाहेंगे, जिसे आप अपने यूनिट परीक्षण के हिस्से के रूप में जांचेंगे।

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

फिर आप उस पोस्ट को यह opener वस्तु का उपयोग करें और हो सकता है, रीडायरेक्ट और कुकीज़ निपटने ठीक से।

आप विभिन्न त्रुटि कोडों को कैप्चर और लॉग इन करने के लिए HTTPHandler का अपना सबक्लास जोड़ना चाह सकते हैं।

+12

urllib2.urlopen रीडायरेक्ट को ठीक से संभालता प्रतीत होता है। –

+0

@ श्रीधर मुझे यह भी मिला है - urllib2.urlopen पूरी तरह रीडायरेक्ट का पालन करता है। – mikemaccana

0

इस तथ्य के अलावा कि आप कुकी खो रहे हैं, इस फ़ॉर्म में कुछ फ़ील्ड हो सकते हैं कि आप वेबसर्वर पर पोस्ट नहीं कर रहे हैं। वेब ब्राउज़र से वास्तविक पोस्ट को कैप्चर करना सबसे अच्छा तरीका होगा। आप ट्रैफिक को स्नूप करने और अपनी स्क्रिप्ट में एक ही व्यवहार की नकल करने के लिए LiveHTTPHeaders या WireShark का उपयोग कर सकते हैं।

+0

एक अच्छा फ़ायरफ़ॉक्स एडन टिप के लिए धन्यवाद :) लेकिन नहीं, मुझे आवश्यक शीर्षलेख और डेटा गुजरना प्रतीत होता है। – Ace

6

twill आज़माएं - एक साधारण भाषा जो उपयोगकर्ताओं को कमांड लाइन इंटरफ़ेस से वेब ब्राउज़ करने की अनुमति देती है। टवील के साथ, आप उन वेब साइटों के माध्यम से नेविगेट कर सकते हैं जो फॉर्म, कुकीज़ और सबसे मानक वेब सुविधाओं का उपयोग करते हैं। अधिक बात करने के लिए, टवीलPython में लिखा है और एक python API है, उदा है:

from twill import get_browser 
b = get_browser() 

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

मैं मशीनीकरण (http://wwwsearch.sourceforge.net/mechanize/) एक शॉट देने के चाहते हैं। यह आपके कुकी/शीर्षकों को पारदर्शी रूप से संभाल सकता है।

0

Funkload एक शानदार वेब ऐप परीक्षण उपकरण भी है। यह ब्राउज़र अनुकरण को संभालने के लिए वेबुनिट लपेटता है, फिर आपको शीर्ष पर कार्यात्मक और लोड परीक्षण सुविधाएं प्रदान करता है।

11

मैं हाल ही में इस सटीक बात अपने आप को करना था। मुझे केवल मानक पुस्तकालय से कक्षाओं की आवश्यकता थी। यहां मेरे कोड से एक अंश दिया गया है:

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") 
13

@ एसएलॉट, धन्यवाद। कुछ सुझाव के साथ, आपके सुझाव ने मेरे लिए काम किया। यहां मैंने यह कैसे किया है।

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) 
15

यहां इस मुद्दे पर मेरा निर्णय लिया गया है।

#!/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',{}) 
+0

यह एकमात्र उत्तर है जो वास्तव में इस प्रक्रिया को सरल बनाता है। – EMI