이 글은 주로 Python의 Requests 패키지를 사용하여 로그인을 시뮬레이션하는 방법을 자세히 소개합니다. 여기에는 특정 참조 값이 있습니다. 관심 있는 친구가 참조할 수 있습니다.
얼마 전에는 Python을 사용하여 일부 페이지를 가져와서 플레이하는 것을 좋아했습니다. 기본적으로 그들은 모두 get을 사용하여 일부 페이지를 요청한 다음 일반 규칙을 통해 필터링합니다.
오늘 시도해 보고 개인 웹사이트에 로그인하는 것을 시뮬레이션했습니다. 발견도 비교적 간단합니다. 이 기사를 읽으려면 http 프로토콜과 http 세션에 대한 어느 정도 이해가 필요합니다.
참고: 시뮬레이션된 로그인은 내 개인 웹사이트이므로 다음 코드는 개인 웹사이트와 계정 비밀번호를 처리합니다.
웹사이트 분석
크롤러에게 필수적인 첫 번째 단계는 대상 웹사이트를 분석하는 것입니다. 여기서는 분석을 위해 Google Chrome의 개발자 도구를 사용합니다.
로그인을 통해 크롤링하다가 그런 요청을 봤습니다.
상단 부분은 요청 헤더이고, 하단 부분은 요청에 의해 전달된 매개변수입니다. 그림에서 볼 수 있듯이 페이지는 양식을 통해 세 가지 매개변수를 제출합니다. 각각 _csrf, usermane, 비밀번호입니다.
csrf는 도메인 간 스크립트 위조를 방지하기 위한 것입니다. 원칙은 매우 간단합니다. 즉, 모든 요청에 대해 서버는 암호화된 문자열을 생성합니다. 숨겨진 입력 양식에 배치하십시오. 다른 요청을 할 때 이 문자열을 함께 전달하여 동일한 사용자의 요청인지 확인하세요.
그래서 우리의 코드 로직이 거기에 있습니다. 로그인 페이지를 요청하여 시작하세요. 그런 다음 페이지를 분석하고 csrf 문자열을 가져옵니다. 마지막으로 이 문자열과 계정 비밀번호가 로그인을 위해 서버로 전달됩니다.
첫 번째 코드
#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- import requests import re # 头部信息 headers = { 'Host':"localhost", 'Accept-Language':"zh-CN,zh;q=0.8", 'Accept-Encoding':"gzip, deflate", 'Content-Type':"application/x-www-form-urlencoded", 'Connection':"keep-alive", 'Referer':"http://localhost/login", 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" } # 登陆方法 def login(url,csrf): data = { "_csrf" : csrf, "username": "xiedj", "password": "***" } response = requests.post(url, data=data, headers=headers) return response.content # 第一次访问获取csrf值 def get_login_web(url): page = requests.get('http://localhost/login') reg = r'<meta name="csrf-token" content="(.+)">' csrf = re.findall(reg,page.content)[0] login_page = login(url,csrf) print login_page if __name__ == "__main__": url = "http://localhost/login/checklogin" get_login_web(url)
코드에는 문제가 없는 것 같습니다. 그런데 실행 중 오류가 발생했습니다. 확인 결과 오류 원인은 csrf 검증에 실패했기 때문입니다!
얻은 csrf와 로그인을 요청한 csrf 문자열이 정상임을 여러 번 확인한 후 문제가 생각났습니다.
오류의 원인을 여전히 알 수 없다면 여기서 잠시 멈춰서 문제에 대해 생각해 보세요. "csrf를 얻기 위한 첫 번째 요청과 두 번째 로그인 후 요청이 동일한 사용자로부터 온 것인지 서버는 어떻게 알 수 있습니까?"
이 시점에서 성공적으로 로그인하려면 어떻게 해야 하는지 해결해야 합니다. 서비스가 두 요청이 동일한 사용자로부터 온 것으로 믿도록 합니다. 여기에서 http 세션을 사용해야 합니다(잘 모르겠으면 Baidu를 직접 사용할 수 있습니다. 여기에 간략한 소개가 있습니다).
http 프로토콜은 상태 비저장 프로토콜입니다. 이것을 Stateless로 만들기 위해 세션이 도입되었습니다. 간단히 말하면 세션을 통해 이 상태를 기록해 두는 것입니다. 사용자가 처음으로 웹 서비스를 요청하면 서버는 사용자의 정보를 저장하기 위해 세션을 생성합니다. 동시에 사용자에게 돌아올 때 세션 ID가 쿠키에 저장됩니다. 사용자가 다시 요청하면 브라우저는 이 쿠키를 함께 가져옵니다. 따라서 서버는 동일한 사용자에 대한 여러 요청이 있는지 여부를 알 수 있습니다.
그래서 우리 코드는 첫 번째 요청을 할 때 이 sessionID를 얻어야 합니다. 이 sessionID를 두 번째 요청과 함께 전달하세요. 요청의 가장 큰 장점은 간단한 request.Session()과 함께 이 세션 개체를 사용할 수 있다는 것입니다.
두 번째 코드
#!/usr/bin/env python2.7 # -*- coding: utf-8 -*- import requests import re # 头部信息 headers = { 'Host':"localhost", 'Accept-Language':"zh-CN,zh;q=0.8", 'Accept-Encoding':"gzip, deflate", 'Content-Type':"application/x-www-form-urlencoded", 'Connection':"keep-alive", 'Referer':"http://localhost/login", 'User-Agent':"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36" } # 登陆方法 def login(url,csrf,r_session): data = { "_csrf" : csrf, "username": "xiedj", "password": "***" } response = r_session.post(url, data=data, headers=headers) return response.content # 第一次访问获取csrf值 def get_login_web(url): r_session = requests.Session() page = r_session.get('http://localhost/login') reg = r'<meta name="csrf-token" content="(.+)">' csrf = re.findall(reg,page.content)[0] login_page = login(url,csrf,r_session) print login_page if __name__ == "__main__": url = "http://localhost/login/checklogin" get_login_web(url)
로그인 후 페이지를 성공적으로 가져왔습니다
requests.Session()이 세션 개체를 시작한 후 두 번째 요청이 자동으로 이전 세션 ID를 함께 전달하세요.
관련 권장 사항:
Python을 사용하여 Excel 차트를 내보내고 그림으로 내보내는 방법
Python의 개방형 함수 사용 시 No Such File 또는 DIr 오류의 원인 분석
위 내용은 Python의 Requests 패키지를 사용하여 시뮬레이션된 로그인을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!