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”입니다.
두 번째 편집 :
오랫동안 로그인 상태를 유지하고 싶고 해당 도메인에서 페이지를 요청할 때마다 콘텐츠가 로그인 한 것처럼 표시되기를 원합니다.
답변
원하는 정보가 페이지에 있으면 로그인 후 바로 연결됩니다.
python-requests 문서 에서와 같이 대신 ck
변수 payload
를 호출 할 수 있습니다 .
payload = {'inUserName': 'USERNAME/EMAIL', 'inUserPass': 'PASSWORD'}
url = 'http://www.locationary.com/home/index2.jsp'
requests.post(url, data=payload)
그렇지 않으면…
답변
나는 당신이 다른 해결책을 찾았다는 것을 알고 있지만, 같은 질문을 찾는 저와 같은 사람들에게는 다음과 같은 요청을 통해 얻을 수 있습니다.
먼저 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...
답변
간단하게 만들어 보겠습니다. 사이트의 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
언젠가 누군가에게 도움이되기를 바랍니다.
답변
웹 사이트 양식에서 사용자 이름 <...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
답변
이 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)