2012-01-03 15 views
17

मैं एक मकड़ी के भीतर सत्र कुकी तक पहुंचने का प्रयास कर रहा हूं। मैं पहली बार एक मकड़ी में उपयोग करते हुए एक सामाजिक नेटवर्क के लिए लॉग इन:स्क्रैप स्पाइडर में एक्सेस सत्र कुकी

def parse(self, response): 

     return [FormRequest.from_response(response, 
       formname='login_form', 
       formdata={'email': '...', 'pass':'...'}, 
       callback=self.after_login)] 

after_login में, मैं आगे एक साथ पेज पर कार्रवाई करने के लिए एक और मॉड्यूल के लिए उन्हें पारित करने के लिए (सेलेनियम यहाँ) क्रम में, सत्र कुकीज़ का उपयोग करना चाहते हैं प्रमाणित सत्र।

 def after_login(self, response): 

     # process response 
     ..... 

     # access the cookies of that session to access another URL in the 
     # same domain with the autehnticated session. 
     # Something like: 
     session_cookies = XXX.get_session_cookies() 
     data = another_function(url,cookies) 

दुर्भाग्य से, response.cookies सत्र कुकीज़ वापस नहीं करता है:

मैं ऐसा ही कुछ करना चाहते हैं।

मैं सत्र कुकीज़ कैसे प्राप्त कर सकता हूं? मैं कुकीज मिडलवेयर देख रहा था: scrapy.contrib.downloadermiddleware.cookies और scrapy.http.cookies लेकिन सत्र कुकीज़ तक पहुंचने का कोई सीधा तरीका प्रतीत नहीं होता है।

मुक्केबाज़ी अपने मूल प्रश्न यहां कुछ और जानकारी:

दुर्भाग्य से, मैं अपने विचार थे, लेकिन मैं कुकीज़ देखने dind't, हालांकि मुझे यकीन है कि वे scrapy.contrib.downloadermiddleware के बाद से मौजूद है के लिए पता .cookies मिडलवेयर कुकीज प्रिंट करता है! ये बिल्कुल कुकीज़ हैं जिन्हें मैं पकड़ना चाहता हूं।

after_login (स्वयं, प्रतिक्रिया) विधि उचित प्रमाणीकरण के बाद प्रतिक्रिया चर प्राप्त करता है, और उसके बाद मैं सत्र डेटा के साथ एक URL तक पहुँचने:

def after_login(self, response): 

     # testing to see if I can get the session cookies 
     cookieJar = response.meta.setdefault('cookie_jar', CookieJar()) 
     cookieJar.extract_cookies(response, response.request) 
     cookies_test = cookieJar._cookies 
     print "cookies - test:",cookies_test 

     # URL access with authenticated session 
     url = "http://site.org/?id=XXXX"  
     request = Request(url=url,callback=self.get_pict) 
     return [request] 

तो यहाँ मैं क्या कर रहा हूँ है शो नीचे उत्पादन के रूप में, वहाँ वास्तव में कुकीज़ कर रहे हैं, लेकिन मैं उन्हें cookieJar साथ कब्जा करने के लिए असफल:

cookies - test: {} 
2012-01-02 22:44:39-0800 [myspider] DEBUG: Sending cookies to: <GET http://www.facebook.com/profile.php?id=529907453> 
    Cookie: xxx=3..........; yyy=34.............; zzz=.................; uuu=44.......... 

तो मैं कुंजी xxx युक्त एक शब्दकोश प्राप्त करना चाहते हैं, yy y आदि संबंधित मूल्यों के साथ।

धन्यवाद :)

+0

मैं सही ढंग से समझते हैं कि आप फेसबुक पर प्रमाणित करने के लिए चाहते हैं, लेकिन एक अलग डोमेन से स्क्रैप डेटा फेसबुक पर प्रमाणीकृत किया जा रहा है? – warvariuc

उत्तर

6

हो सकता है कि यह एक overkill है, लेकिन मुझे पता है कि कैसे आप उन कुकीज़ का उपयोग करने जा रहे हैं, तो यह उपयोगी हो सकता है (वास्तविक कोड से एक अंश - अपने मामले के लिए अनुकूल) :

from scrapy.http.cookies import CookieJar 

class MySpider(BaseSpider): 

    def parse(self, response): 

     cookieJar = response.meta.setdefault('cookie_jar', CookieJar()) 
     cookieJar.extract_cookies(response, response.request) 
     request = Request(nextPageLink, callback = self.parse2, 
         meta = {'dont_merge_cookies': True, 'cookie_jar': cookieJar}) 
     cookieJar.add_cookie_header(request) # apply Set-Cookie ourselves 

CookieJar में कुछ उपयोगी तरीके हैं।

यदि आपको अभी भी कुकीज़ नहीं दिखाई देती हैं - शायद वे वहां नहीं हैं?


अद्यतन:

CookiesMiddleware कोड को देखते हुए:

class CookiesMiddleware(object): 
    def _debug_cookie(self, request, spider): 
     if self.debug: 
      cl = request.headers.getlist('Cookie') 
      if cl: 
       msg = "Sending cookies to: %s" % request + os.linesep 
       msg += os.linesep.join("Cookie: %s" % c for c in cl) 
       log.msg(msg, spider=spider, level=log.DEBUG) 

तो, कोशिश request.headers.getlist('Cookie')

+1

आपके उत्तर के लिए बहुत धन्यवाद! दुर्भाग्य से यह अभी भी काम नहीं किया। कैसे, मुझे यकीन है कि कुकीज़ हैं। मैंने जो किया उसके लिए नीचे पोस्ट देखें। – mikolune

+0

कृपया मेरी प्रतिक्रिया देखने के लिए मूल पोस्ट में मेरा संपादन देखें! बहुत धन्यवाद :) – mikolune

+0

@mikolune, अद्यतन देखें। साथ ही, स्रोत कोड को देखना सीखें - यही कारण है कि पाइथन अच्छा है - आप स्रोत कोड देख सकते हैं, जो कि कभी-कभी सबसे अच्छा प्रलेखन होता है। – warvariuc

12

एक उत्कृष्ट उदाहरण एक के लिए प्रवेश सर्वर है, जो एक नया सत्र आईडी प्रदान करता रहा है एक सफल लॉगिन के बाद। इस नए सत्र आईडी का उपयोग किसी अन्य अनुरोध के साथ किया जाना चाहिए।

यहां स्रोत से उठाया गया कोड है जो मेरे लिए काम करता है।

print 'cookie from login', response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 

कोड:

def check_logged(self, response): 
tmpCookie = response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 
print 'cookie from login', response.headers.getlist('Set-Cookie')[0].split(";")[0].split("=")[1] 
cookieHolder=dict(SESSION_ID=tmpCookie) 

#print response.body 
if "my name" in response.body: 
    yield Request(url="<<new url for another server>>", 
     cookies=cookieHolder, 
     callback=self."<<another function here>>") 
else: 
    print "login failed" 
     return 
संबंधित मुद्दे