2016-12-02 1 views
0

파이썬을 사용하여 학교의 웹 페이지를 긁어 모으기 위해 먼저 사용자 로그인을 시뮬레이트해야했습니다. 내가 그 response.text을 기대하고사용자 로그인이 필요한 파이썬 스크래핑 학교의 웹 페이지

import requests, lxml.html 
s = requests.session() 

url = "https://my.emich.edu" 

login = s.get(url) 

login_html = lxml.html.fromstring(login.text) 
hidden_inputs = login_html.xpath(r'//form//input[@type="hidden"]') 
form = {x.attrib["name"]:x.attrib["value"] for x in hidden_inputs} 
form["username"] = "myusernamge" 
form["password"] = "mypassword" 
form["submit"] = "LOGIN" 

response = s.post("https://netid.emich.edu/cas/loginservice=https%3A%2F%2Fmy.emich.edu%2Fc%2Fportal%2Flogin",form) 
response = s.get("http://my.emich.edu") 

f = open("result.html","w") 
f.write(response.text) 

print response.text 

하는 대신 나에게 요구 사항 페이지에서 로그를 준다 저에게 내 자신의 학생 계정 페이지를 줄 것이다 : 여기 내 코드입니다. 어느 누구도이 문제를 도와 줄 수 있습니까? 여기가 숙제가 아닙니다.

+0

브라우저가 실제로 요청한 내용과 비교해 볼 수 있습니까? 양식 필드를 놓친 적이 있습니까? –

+0

@paradox 성공적으로 게시 한 후에 홈페이지를 다시 요청하면 어떻게됩니까? 귀하의 게시물이 성공적 이었음을 어떻게 알 수 있습니까? – David542

+0

@paradox - 또한 게시 url이 아닌 https://my.emich.edu/c/portal/login? – David542

답변

1

여기 몇 가지 옵션이 있습니다. 수동으로 로그인하고 헤더를 복사하면 요청 접근 방식을 훨씬 쉽게 할 수 있다고 생각합니다.

  1. http://wwwsearch.sourceforge.net/mechanize/과 같은 python 스크립트 패키지를 사용하여 사이트를 긁습니다.
  2. 브라우저 에뮬레이터 (예 : http://casperjs.org/)를 사용하십시오. 이것을 사용하면 기본적으로 브라우저에서 수행 할 수있는 모든 작업을 수행 할 수 있습니다.
  3. 내 제안은 웹 사이트로 이동하여 로그인 한 다음 개발자 콘솔을 열고 해당 헤더/쿠키를 요청 헤더/쿠키에 복사하는 것입니다. 이렇게하면 '이미 인증 된 요청'을 하드 코딩 할 수 있으며 정상적으로 작동합니다. 이 방법은 강력하고 일상적인 근근이 작업을 수행하는 데 가장 안정적이지 않지만 구현이 가장 빨라질 때까지 가장 빠른 방법을 찾고 인증이 끝날 때까지 작동하는 방법을 찾고 있다면이 방법을 사용하십시오.

또한 게시를 성공적으로 마친 후 로그인 한 홈페이지 (다시)를 요청해야합니다.

+0

기계화를 시도했으며 여전히 그 결과가 기대에 미치지 못했습니다. – paradox

관련 문제