2012-12-18 41 views
33

ठीक है, इसलिए मैं इसे रेडडिट बॉट के लिए उपयोग कर रहा हूं, लेकिन मैं किसी भी वेबसाइट पर लॉग इन करने के तरीके को समझने में सक्षम होना चाहता हूं। यदि यह समझ में आता है ....urllib2 का उपयोग कर वेबसाइट पर लॉग इन करें - पायथन 2.7

मुझे एहसास है कि विभिन्न वेबसाइटें अलग-अलग लॉगिन फॉर्म आदि का उपयोग करती हैं। तो मैं कैसे समझूं कि प्रत्येक वेबसाइट के लिए इसे कैसे अनुकूलित किया जाए? मुझे लगता है कि मुझे HTML फ़ाइल में कुछ देखने की ज़रूरत है लेकिन मुझे कोई जानकारी नहीं है।

मैं मैकेनाइजेशन या किसी अन्य लाइब्रेरी का उपयोग नहीं करना चाहता (जो कि अन्य सभी उत्तर यहां पर हैं और वास्तव में मुझे यह जानने में मदद नहीं करते कि क्या हो रहा है), क्योंकि मैं खुद से सीखना चाहता हूं कि वास्तव में यह सब काम करता है।

urllib2 दस्तावेज़ वास्तव में मेरी मदद नहीं कर रहा है।

धन्यवाद।

उत्तर

45

मैं यह कहकर इसका प्रस्ताव दूंगा कि मैंने थोड़ी देर के लिए इस तरह से लॉग इन नहीं किया है, इसलिए मुझे इसे करने के कुछ और 'स्वीकार्य' तरीके याद आ रहे हैं।

मुझे यकीन है कि अगर यह क्या आप के बाद कर रहे हैं है नहीं कर रहा हूँ, लेकिन या mechanize की तरह एक पुस्तकालय selenium की तरह एक और अधिक मजबूत ढांचे के बिना, बुनियादी मामले में आप सिर्फ रूप में ही देखते हैं और inputs चाहते हैं। उदाहरण के लिए, www.reddit.com को देख, और फिर गाया पेज के स्रोत देख कर आप इस फॉर्म मिलेगा:

<form method="post" action="https://ssl.reddit.com/post/login" id="login_login-main" 
    class="login-form login-form-side"> 
    <input type="hidden" name="op" value="login-main" /> 
    <input name="user" placeholder="username" type="text" maxlength="20" tabindex="1" /> 
    <input name="passwd" placeholder="password" type="password" tabindex="1" /> 

    <div class="status"></div> 

    <div id="remember-me"> 
     <input type="checkbox" name="rem" id="rem-login-main" tabindex="1" /> 
     <label for="rem-login-main">remember me</label> 
     <a class="recover-password" href="/password">reset password</a> 
    </div> 

    <div class="submit"> 
     <button class="btn" type="submit" tabindex="1">login</button> 
    </div> 

    <div class="clear"></div> 
</form> 

यहाँ हम कुछ input की देख - op, user, passwd और rem। इसके अलावा, action पैरामीटर देखें - वह यूआरएल है जिस पर फॉर्म पोस्ट किया जाएगा, और इसलिए हमारा लक्ष्य होगा। तो अब अंतिम चरण पैरामीटर में पैरामीटर पैक कर रहा है और इसे action यूआरएल के लिए भेज रहा है। इसके अलावा नीचे, हम एक नए opener बनाने के लिए, कुकीज़ संभालने के लिए और साथ ही शीर्ष लेख जोड़ने के लिए, हमें एक से थोड़ा अधिक मजबूत सलामी बल्लेबाज दे अनुरोध निष्पादित करने के लिए) करने की क्षमता जोड़ें:

import cookielib 
import urllib 
import urllib2 


# Store the cookies and create an opener that will hold them 
cj = cookielib.CookieJar() 
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) 

# Add our headers 
opener.addheaders = [('User-agent', 'RedditTesting')] 

# Install our opener (note that this changes the global opener to the one 
# we just made, but you can also just call opener.open() if you want) 
urllib2.install_opener(opener) 

# The action/ target from the form 
authentication_url = 'https://ssl.reddit.com/post/login' 

# Input parameters we are going to send 
payload = { 
    'op': 'login-main', 
    'user': '<username>', 
    'passwd': '<password>' 
    } 

# Use urllib to encode the payload 
data = urllib.urlencode(payload) 

# Build our Request object (supplying 'data' makes it a POST) 
req = urllib2.Request(authentication_url, data) 

# Make the request and read the response 
resp = urllib2.urlopen(req) 
contents = resp.read() 

ध्यान दें कि यह और अधिक जटिल प्राप्त कर सकते हैं - उदाहरण के लिए, आप जीमेल के साथ भी ऐसा कर सकते हैं, लेकिन आपको पैरामीटर में खींचने की ज़रूरत है जो हर बार बदल जाएगी (जैसे GALX पैरामीटर)। दोबारा, सुनिश्चित नहीं है कि यह वही है जो आप चाहते थे, लेकिन उम्मीद है कि यह मदद करता है।

+0

वह/अद्भुत/धन्यवाद, धन्यवाद! काफी वही है जो मैं चाहता था, अब मुझे पता है कि मुझे इसके बारे में और क्या पढ़ना है। उत्तम! – tommo

+1

@tommo कोई समस्या नहीं मेरे दोस्त - मुझे याद है कि जब मैं उस सामान को हल करने की कोशिश कर रहा था तो मुझे उस सटीक पंक्ति के माध्यम से जा रहा था :) सब कुछ के साथ शुभकामनाएं! – RocketDonkey

+0

धन्यवाद दोस्त :) मेरे पास वास्तव में एक और सवाल है कि मुझे जवाब नहीं मिल रहा है, अगर आपको जवाब देने में कोई फर्क नहीं पड़ता - आपने [[) 'उपयोगकर्ता-एजेंट' में [()] ब्रैकेट का उपयोग क्यों किया, 'RedditTesting')] "? प्रलेखन में इसमें केवल सामान्य कोष्ठक होते हैं। – tommo