Python의 요청 모듈을 사용하여 웹 사이트에 "로그인"하는 방법은 무엇입니까?


98

Python의 Requests 모듈을 사용하여 웹 사이트에 로그인하라는 요청을 게시하려고했지만 실제로는 작동하지 않습니다. 나는 이것에 익숙하지 않아 ... 내 사용자 이름 및 암호 쿠키를 만들어야하는지 또는 내가 찾은 (??) 일부 유형의 HTTP 인증 항목을 만들어야하는지 알 수 없습니다.

from pyquery import PyQuery
import requests

url = 'http://www.locationary.com/home/index2.jsp'

그래서 지금은 "포스트"와 쿠키를 사용해야한다고 생각합니다 ..

ck = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}

r = requests.post(url, cookies=ck)

content = r.text

q = PyQuery(content)

title = q("title").text()

print title

쿠키를 잘못하고 있다는 느낌이 들어요 ... 모르겠어요.

올바르게 로그인되지 않으면 홈 페이지 제목이 "Locationary.com"에 나와야하고 그렇지 않으면 "홈 페이지"가되어야합니다.

요청 및 쿠키에 대한 몇 가지 사항을 설명해 주시고 도움을 주시면 감사하겠습니다. :디

감사.

... 아직 작동하지 않았습니다. 좋아요 ... 로그인하기 전에 홈페이지 HTML이 말하는 내용입니다.

</td><td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_email.gif">    </td>
<td><input class="Data_Entry_Field_Login" type="text" name="inUserName" id="inUserName"  size="25"></td>
<td><img src="http://www.locationary.com/img/LocationaryImgs/icons/txt_password.gif"> </td>
<td><input  class="Data_Entry_Field_Login"  type="password" name="inUserPass"     id="inUserPass"></td>

그래서 제대로하고 있다고 생각하지만 출력은 여전히 ​​"Locationary.com"입니다.

두 번째 편집 :

오랫동안 로그인 상태를 유지하고 싶고 해당 도메인에서 페이지를 요청할 때마다 콘텐츠가 로그인 한 것처럼 표시되기를 원합니다.

답변:


44

원하는 정보가 페이지에 있으면 로그인 후 바로 연결됩니다.

python-requests 문서 에서와 같이 대신 ck변수 payload를 호출 할 수 있습니다 .

payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)

그렇지 않으면...

아래 https://stackoverflow.com/a/17633072/111362를 참조 하십시오 .


urllib, urrlib2, cookielib 및 일부 HTTP 헤더를 사용하여 다른 방식으로 작동하도록했습니다.
Marcus Johnson

23
슬프게도 수락 된 답변이기 때문에 삭제할 수 없습니다. 나는 이것을 게시했을 때 질문을 이해하지 못했다고 생각합니다 (이후에 명확 해졌습니다), 왜 그것이 수락되었는지 모르겠습니다. 내 대답은 필요한 데이터가 로그인 후 리디렉션되는 페이지에있는 경우에만 작동합니다. @tigerFinch가 훨씬 더 나은 답변을 제공합니다.
케이티 lavallee

230

나는 당신이 다른 해결책을 찾았다는 것을 알고 있지만, 같은 질문을 찾는 저와 같은 사람들에게는 다음과 같은 요청을 통해 얻을 수 있습니다.

먼저 Marcus가 한 것처럼 로그인 양식의 소스를 확인하여 양식이 게시되는 URL과 사용자 이름 및 비밀번호 필드의 이름 속성이라는 세 가지 정보를 얻습니다. 그의 예에서는 inUserName 및 inUserPass입니다.

그런 다음 requests.Session()인스턴스를 사용 하여 로그인 세부 정보를 페이로드로 사용하여 로그인 URL에 게시 요청을 할 수 있습니다 . 세션 인스턴스에서 요청을 만드는 것은 일반적으로 요청을 사용하는 것과 본질적으로 동일하며 단순히 지속성을 추가하여 쿠키 등을 저장하고 사용할 수 있습니다.

로그인 시도가 성공했다고 가정하면 세션 인스턴스를 사용하여 사이트에 추가 요청을 할 수 있습니다. 귀하를 식별하는 쿠키는 요청을 승인하는 데 사용됩니다.

import requests

# Fill in your details here to be posted to the login form.
payload = {
    'inUserName': 'username',
    'inUserPass': 'password'
}

# Use 'with' to ensure the session context is closed after use.
with requests.Session() as s:
    p = s.post('LOGIN_URL', data=payload)
    # print the html returned or something more intelligent to see if it's a successful login page.
    print p.text

    # An authorised request.
    r = s.get('A protected web page url')
    print r.text
        # etc...

13
그러나 문제는 POST 로그인 양식을 얻는 방법입니다. 사용자 이름, USERNAME 등이 아닌 inUserName으로 호출되는지 어떻게 알 수 있습니까?
lsheng 2014

4
@Twinkle은 양식에 대한 HTML 소스를보고 이름이 무엇인지 확인합니다.
Aaron Schumacher 2014

3
s.text 작동하지 않는 것,하지만, 난 여전히 요청을 나에게 ... 구문이 사랑을 보여주는 몇 가지 투표 사랑을주는거야
소프트웨어 선지자

s.text는 다음과 같아야하기 때문에 작동하지 않습니다. p = s.post('LOGIN_URL.....그리고p.text
Sebastian

2
@HalcyonAbrahamRamirez 나는 이것이 당신이 도움을 구하기에 적합한 장소라고 생각하지 않습니다. 특히 다음과 같은 도전에 대한 질문을 읽는 것이 좋습니다. stackoverflow.com/questions/21928368/… 그리고 해결할 수없는 경우 자신의 질문을 엽니 다.
Sebastian

36

간단하게 만들어 보겠습니다. 사이트의 URL이 http://example.com/ 이고 사용자 이름과 비밀번호를 입력하여 가입해야한다고 가정 해 보겠습니다. 그러면 http : // example 이라는 로그인 페이지로 이동합니다 . com / login.php 이제 소스 코드를보고 다음과 같은 형식 태그에있는 작업 URL을 검색합니다.

 <form name="loginform" method="post" action="userinfo.php">

이제 userinfo.php를 사용하여 ' http://example.com/userinfo.php ' 가 될 절대 URL을 만들고 이제 간단한 파이썬 스크립트를 실행하십시오.

import requests
url = 'http://example.com/userinfo.php'
values = {'username': 'user',
          'password': 'pass'}

r = requests.post(url, data=values)
print r.content

언젠가 누군가에게 도움이되기를 바랍니다.


1
좋은 일 - 때때로 버튼보다는라는 파일을 밝힐 수있는 이름 / 패스 필드의 요소를 검사합니다은 (내 그냥 버튼 검사에서 '작업은'URL이 USR 검사에서 나타났다 말했다 / 필드를 통과)
baxx을

2
크롬을 사용하는 경우 네트워크 탭에서 devtools를 열고 요청을 한 후 실제 값을 검사 할 수 있습니다. 키와 키가 전송 된 위치는 기존 방식을 사용하지 않고 대신 양식에 유용합니다. javascript / ajax를 사용하여 양식을 처리하십시오.
Roberto Arosemena

1
이 경우 페이지 내용을 인쇄하는 대신 웹 페이지를 직접 팝업하는 방법에 대한 아이디어가 있습니까?

webbrowser모듈 을 사용해야합니다
R. Barrett

또한 그의 위 print r.content는 그가 사용해야하는 잘못된 것입니다print(r.content)
R. Barrett

6

웹 사이트 양식에서 사용자 이름 <...name=username.../>과 비밀번호 에 사용 된 입력 이름을 찾아 <...name=password../>아래 스크립트에서 대체하십시오. 또한 로그인 할 사이트를 가리 키도록 URL을 바꿉니다.

login.py

#!/usr/bin/env python

import requests
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
payload = { 'username': 'user@email.com', 'password': 'blahblahsecretpassw0rd' }
url = 'https://website.com/login.html'
requests.post(url, data=payload, verify=False)

을 사용 disable_warnings(InsecureRequestWarning)하면 확인되지 않은 SSL 인증서가있는 사이트에 로그인하려고 할 때 스크립트의 출력이 모두 무음 으로 표시 됩니다.

특별한:

UNIX 기반 시스템의 명령 줄에서이 스크립트를 실행하려면 디렉토리에 배치합니다. 즉 home/scripts,이 디렉토리를 ~/.bash_profile터미널에서 사용하는 경로 또는 유사한 파일에 추가합니다.

# Custom scripts
export CUSTOM_SCRIPTS=home/scripts
export PATH=$CUSTOM_SCRIPTS:$PATH

그런 다음 내부 에이 파이썬 스크립트에 대한 링크를 만듭니다. home/scripts/login.py

ln -s ~/home/scripts/login.py ~/home/scripts/login

터미널을 닫고 새 터미널을 시작한 다음 실행 login


4

requests.Session()솔루션은 CSRF 보호 (Flask-WTF 양식에서 사용됨)를 사용하여 양식에 로그인하는 데 도움이되었습니다. csrf_token숨겨진 필드로이 필요한지 확인 하고 사용자 이름과 비밀번호를 사용하여 페이로드에 추가합니다.

import requests
from bs4 import BeautifulSoup

payload = {
    'email': 'email@example.com',
    'password': 'passw0rd'
}     

with requests.Session() as sess:
    res = sess.get(server_name + '/signin')
    signin = BeautifulSoup(res._content, 'html.parser')
    payload['csrf_token'] = signin.find('input', id='csrf_token')['value']
    res = sess.post(server_name + '/auth/login', data=payload)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.