2016-09-08 1 views
1

이 작업을하기 위해 지난 6 시간 동안 노력했지만 끝없는 검색은 도움이되지 않았습니다. 뭔가 근본적인 잘못을 저 지르거나 그냥 내 논리와 일치하는 사소한 버그 일 뿐이므로, 수정을 돕기 위해 여분의 눈이 필요합니다.
웹 사이트 URL은 this입니다.
나는 그냥 로그인하고 다음 페이지를 읽는 지저분한 파이썬 코드 조각을 썼지 만, 서버에서 무언가가 내 요청을 처리하는 데 잘못되었다고 말하는 것은 불쾌한 500 오류입니다.
브라우저에서 요청한 사항은 문제없이 작동합니다. 이 요청에
HTTP 응답 코드는 302 (리디렉션)파이썬 요청을 사용하여 특정 ASP.NET 웹 사이트에 로그인 할 수 없습니다.

POST /appstatus/index.aspx HTTP/1.1 
Host: www.wes.org 
Connection: close 
Content-Length: 303 
Cache-Control: max-age=0 
Origin: https://www.wes.org 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 
Content-Type: application/x-www-form-urlencoded 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Referer: https://www.wes.org/appstatus/index.aspx 
Accept-Encoding: gzip, deflate, br 
Accept-Language: en-US,en;q=0.8,fa;q=0.6 
Cookie: ASP.NET_SessionId=bu2gemmlh3hvp4f5lqqngrbp; _ga=GA1.2.1842963052.1473348318; _gat=1 

__VIEWSTATE=%2FwEPDwUKLTg3MTMwMDc1NA9kFgICAQ9kFgICAQ8PFgIeBFRleHRkZGRk9rP20Uj9SdsjOKNUBlbw55Q01zI%3D&__VIEWSTATEGENERATOR=189D346C&__EVENTVALIDATION=%2FwEWBQK6lf6LBAKf%2B9bUAgK9%2B7qcDgK8w4S2BALowqJjoU1f0Cg%2FEAGU6r2IjpIPG8BO%2BiE%3D&txtUID=Email%40Removed.com&txtPWD=PASSWORDREMOVED&Submit=Log+In&Hidden1= 

이며,이 사람은 내 스크립트에 의해 만들어진 요청입니다.

POST /appstatus/index.aspx HTTP/1.1 
Host: www.wes.org 
Connection: close 
Accept-Encoding: gzip, deflate, br 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Upgrade-Insecure-Requests: 1 
Content-Type: application/x-www-form-urlencoded 
Origin: https://www.wes.org 
Accept-Language: en-US,en;q=0.8,fa;q=0.6 
Cache-Control: max-age=0 
Referer: https://www.wes.org/appstatus/indexca.aspx 
Cookie: ASP.NET_SessionId=nxotmb55jjwf5x4511rwiy45 
Content-Length: 303 

txtPWD=PASSWORDREMOVED&Submit=Log+In&__EVENTVALIDATION=%2FwEWBQK6lf6LBAKf%2B9bUAgK9%2B7qcDgK8w4S2BALowqJjoU1f0Cg%2FEAGU6r2IjpIPG8BO%2BiE%3D&txtUID=Email%40Removed.com&__VIEWSTATE=%2FwEPDwUKLTg3MTMwMDc1NA9kFgICAQ9kFgICAQ8PFgIeBFRleHRkZGRk9rP20Uj9SdsjOKNUBlbw55Q01zI%3D&Hidden1=&__VIEWSTATEGENERATOR=189D346C 

이것은 요청을 작성하는 스크립트입니다. 너무 지저분한 경우 미안하지만 빨리 처리해야합니다.

import requests 
import bs4 
import urllib.parse 
def main(): 
    session = requests.Session() 
    headers = {"Origin": "https://www.wes.org", 
       "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", 
       "Cache-Control": "max-age=0", "Upgrade-Insecure-Requests": "1", "Connection": "close", 
       "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36", 
       "Referer": "https://www.wes.org/appstatus/indexca.aspx", "Accept-Encoding": "gzip, deflate, br", 
       "Accept-Language": "en-US,en;q=0.8,fa;q=0.6", "Content-Type": "application/x-www-form-urlencoded"} 
    r = session.get('https://www.wes.org/appstatus/index.aspx',headers=headers) 
    cookies = r.cookies 
    soup = bs4.BeautifulSoup(r.content, "html5lib") 
    viewState=urllib.parse.quote(str(soup.select('#__VIEWSTATE')[0]).split('value="')[1].split('"/>')[0]) 
    viewStateGenerator=urllib.parse.quote(str(soup.select('#__VIEWSTATEGENERATOR')[0]).split('value="')[1].split('"/>')[0]) 
    eventValidation=urllib.parse.quote(str(soup.select('#__EVENTVALIDATION')[0]).split('value="')[1].split('"/>')[0]) 
    paramsPost = {} 
    paramsPost.update({'__VIEWSTATE':viewState}) 
    paramsPost.update({'__VIEWSTATEGENERATOR':viewStateGenerator}) 
    paramsPost.update({'__EVENTVALIDATION':eventValidation}) 
    paramsPost.update({"txtUID": "[email protected]"}) 
    paramsPost.update({"txtPWD": "My_So_Called_Password"}) 
    paramsPost.update({"Submit": "Log In"}) 
    paramsPost.update({"Hidden1": ""}) 
    response = session.post("https://www.wes.org/appstatus/index.aspx", data=paramsPost, headers=headers, 
          cookies=cookies) 
    print("Status code:", response.status_code) #Outputs 500. 
    #print("Response body:", response.content) 


if __name__ == '__main__': 
    main() 

어떤 도움을 주시면 감사하겠습니다.

답변

0

당신은 너무 많은 일을하고 있습니다. 유효한 데이터를 전달하지 않으면 값 속성을 직접 추출합니다. 즉, .select_one('#__VIEWSTATEGENERATOR')["value"]과 나머지는 모두 동일합니다. 쿠키는 초기 get 후에 세션 객체에 설정됩니다. 논리로 귀결 : 클래스 이름 및 여러 단어를 구분하기 위해 밑줄 소문자에 대한 낙타 표기법을 사용하는 규칙에 따라

with requests.Session() as session: 
     headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36"} 
     r = session.get('https://www.wes.org/appstatus/index.aspx', headers=headers) 

     soup = bs4.BeautifulSoup(r.content, "html5lib") 
     viewState = soup.select_one('#__VIEWSTATE')["value"] 
     viewStateGenerator = soup.select_one('#__VIEWSTATEGENERATOR')["value"] 
     eventValidation = soup.select_one('#__EVENTVALIDATION')["value"] 
     paramsPost = {'__VIEWSTATE': viewState,'__VIEWSTATEGENERATOR': viewStateGenerator, 
         '__EVENTVALIDATION': eventValidation,"txtUID": "[email protected]", 
        "txtPWD": "My_So_Called_Password", 
         "Submit": "Log In","Hidden1": ""} 
     response = session.post("https://www.wes.org/appstatus/index.aspx", data=paramsPost, headers=headers) 
     print("Status code:", response.status_code) 

파이썬, 당신은 당신의 코드에 그 적용을 고려해야 할 수도 있습니다.

+0

고맙습니다. 당신 말이 맞아요. 코드가 훨씬 더 깨끗해 졌으므로 디버깅하고 이해하기가 더 쉽습니다. 지금부터는 더 깨끗한 코드를 작성하는 법을 배우려고 노력할 것이다. 도와 줘서 고마워. – Sam

+0

걱정하지 않으셔도됩니다. –

관련 문제