2017-09-06 12 views
5

में लॉग इन करने में विफल रहता है मैं उन चीजों की सराहना करता हूं जो आप यहां कर रहे हैं। आम तौर पर मैं स्टैक ओवरफ्लो की मदद से अपने मुद्दों को समझने में सक्षम हूं, लेकिन इस बार मैं फंस गया हूं। उम्मीद है कि आप मेरी मदद कर सकते हैं!पायथन अनुरोध

प्रश्न काफी सरल है: पर का उपयोग करके कैसे लॉग इन करें Python के अनुरोध?

मेरे कदम:

  1. लॉगिन यूआरएल
  2. लॉगइन विवरण प्रदान करें प्राप्त करें। एचटीएमएल के मुताबिक, मुझे 'ईमेल' और 'पासवर्ड' प्रदान करने की ज़रूरत है।
  3. एक सत्र और उपयोग के बाद प्रवेश करने के लिए
  4. चेक HTML बनाएं यदि लॉगिन सफल रहा था

दुर्भाग्य से, आसान दृष्टिकोण इस मामले में काम करने के लिए प्रतीत नहीं होता। उदाहरण के लिए, details के उत्पादन में है:

<script> 
    dataLayer = [{ 
     'environment': 'production', 
     'loggedIn': '0', 
     'userCode': '', 
     'rank': '', 
     'totalBalance': '0', 
     'overAgeCasino': '0' 
    }]; 
</script> 

जाहिर है, 'loggedIn' की '0''1' में बदल जानी चाहिए अगर लॉगिन सफल रहा था।

एक उदाहरण में मैंने पाया कि आपको 'csrftoken' जोड़ना पड़ सकता है और यह HTML में 'छुपा' प्रकार के रूप में पाया जा सकता है। हालांकि, टाइप = 'छुपा' भाग में नाम के साथ ऐसा करने के लिए कुछ भी नहीं है और इसका कोई मूल्य नहीं है (link to screenshot of HTML)। कहीं और मैंने पढ़ा है कि एक CSFR टोकन भी CookieJar में संग्रहीत किया जाता है, लेकिन यह वहाँ नहीं है:

<RequestsCookieJar[<Cookie PHPSESSID=5dib6cf6kpvf29dsn725ljcec7 for .napoleongames.be/>, <Cookie locale=en_GB for .napoleongames.be/>, <Cookie user=false for .napoleongames.be/>]> 

मैं इसे कठिन विश्वास करने में है कि प्रवेश संभव नहीं है लगता है, लेकिन मैं विचारों से बाहर भाग गया है । अगर कोई जानता है कि इसे urllib (2) के साथ कैसे किया जाए, तो यह भी उपयोगी है। मैं सेलेनियम का उपयोग नहीं करना चाहूंगा क्योंकि मैं इसे आसानी से चलाने में सक्षम नहीं हूं।

कोड:

import requests 
    from bs4 import BeautifulSoup 
    from datetime import date 

date_str = str(date.today()) 
login_url = 'https://en-gb.sports.napoleongames.be/user/login' 
protected_url = 'proctected_url' 

payload = {'email': '[email protected]', 
      'password': '*********'} 

with requests.Session() as session: 
    session.get(login_url) 
    login_page = session.post(login_url, 
          data=payload) 

    html_body = BeautifulSoup(login_page.content, 'html.parser').find(
     name='body', attrs={'id': 'user_login'}) 
    details = html_body.findAll('script')[0] 
    page = session.get(protected_url) 

हेडर:

{'Date': 'Wed, 06 Sep 2017 23:45:52 GMT', 'Server': 'Apache', 'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 'Cache-Control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 'Pragma': 'no-cache', 'X-Frame-Options': 'SAMEORIGIN', 'X-Cache-Page': 'MISS', 'Set-Cookie': 'locale=en_GB; Expires=Mon, 05-Mar-2018 23:45:52 GMT; Domain=.napoleongames.be; Path=/, user=false; expires=Mon, 05-Mar-2018 23:45:52 GMT; Max-Age=15552000; path=/; domain=.napoleongames.be, loyalty=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.napoleongames.be', 'Strict-Transport-Security': 'max-age=15768000', 'Vary': 'Accept-Encoding', 'Content-Encoding': 'gzip', 'Content-Length': '10840', 'Connection': 'close', 'Content-Type': 'text/html'} 
+1

दुर्भाग्यवश कई आधुनिक वेबसाइट ढांचे जावास्क्रिप्ट पर बड़े पैमाने पर भरोसा करते हैं, जो निश्चित रूप से अनुरोध संसाधित नहीं कर सकते हैं। यदि आपके काम के लिए आपको नियमित रूप से आधुनिक वेबपृष्ठों को स्क्रैप करने की आवश्यकता है, तो मैं दृढ़ता से अनुशंसा करता हूं कि आप सेलेनियम में उपयोग करें, यह उत्कृष्ट है और इस तरह की समस्या को आसानी से हल करता है। –

+0

@DanielleM। अनुरोध के साथ जावास्क्रिप्ट के आसपास तरीके हैं। [लिंक] (https://stackoverflow.com/a/38081914/7073884) –

+0

@DanielleM। नहीं, यह सिर्फ मस्ती के लिए था।मुझे सेलेनियम का उपयोग करते समय होने वाली त्रुटियों को समझने की आवश्यकता है। सबसे पहले मुझे एक पथ मुद्दा मिला जिसके लिए समाधान डाउनग्रेड करना था, लेकिन फिर geckodriver के साथ कुछ गलत हो गया और फिर अनुशंसित समाधान अपग्रेड करना था, इसलिए मैंने – Rob

उत्तर

3

जब एक पर्चे को जमा करने के लिए, आप प्रपत्र टैग के अंदर विचार अन्य क्षेत्रों में लेना चाहिए न सिर्फ खेतों आप भरने की जरूरत है अप। इस मामले में, जब आप पृष्ठ स्रोत के अंदर देखते हैं, तो एक और फ़ील्ड होता है जो लॉगिन पर पॉप्युलेट किया जा रहा है।

payload = {'email': '[email protected]', 
      'password': '*********' 
      'buttons_app_service_user_login[buttonClicked]': 'buttons_app_service_user_login-save'} 

मुझे पता है कि अगर काम किया है या यदि आप अन्य समस्याओं का सामना करते हैं:

आप यह भी कहा कि अपने पेलोड में की कोशिश कर सकते हैं।

+0

अनुरोधों पर ध्यान केंद्रित किया है, बहुत धन्यवाद! तो कुंजी 'मान' (जो खाली थी) के बजाय 'आईडी' का उपयोग करना था – Rob

+0

हां प्रारंभिक लोड पर मान खाली है, जब आप खाली उपयोगकर्ता नाम और पासवर्ड के साथ लॉगिन फॉर्म जमा करने का प्रयास करते हैं, तो आप देखेंगे मूल्य आबादी जा रहा है। – chad

संबंधित मुद्दे