패킷을 캡처할 때 처음에는 Chrome 개발 도구에서 네트워크를 사용했지만 캡처에 실패했습니다. 나중에 Fiddler를 사용하여 데이터를 성공적으로 캡처했습니다. 위의 과정은 아래에서 단계별로 자세히 설명하겠습니다.
Zhihu 로그인을 시뮬레이션하기 전에 먼저 이 경우에 사용된 환경과 도구를 살펴보십시오.
Windows 7 + Python 2.75
Chrome + Fiddler: 클라이언트와 서버 간의 통신을 모니터링하는 데 사용됩니다. 관련 매개변수의 위치를 찾습니다.
Fiddler와 결합된 Google 브라우저를 사용하여 클라이언트와 서버 간의 통신 프로세스를 모니터링합니다.
모니터링 결과에 따라 요청 과정에서 전달된 매개변수를 구성합니다.
Python을 사용하여 매개변수 전달 프로세스를 시뮬레이션합니다.
클라이언트와 서버 간의 통신 과정에서 중요한 몇 가지 사항:
로그인 시 URL 주소.
로그인 시 제출된 매개변수 [params]를 얻는 방법은 크게 두 가지가 있습니다. 첫 번째는 페이지 소스 코드를 분석하여 양식 태그와 속성을 찾는 것입니다. 비교적 간단한 페이지에 적응합니다. 둘째, 제출된 URL과 매개변수를 보기 위해 패킷 캡처 도구를 사용합니다. 일반적으로 Chrome의 개발자 도구에는 Network, Fiddler 등이 사용됩니다.
로그인 후 이동하는 URL입니다.
먼저 로그인할 때의 URL 주소인 이 로그인 페이지를 살펴보세요.
이 페이지를 보면 서버를 요청할 때 여러 필드가 전달된다는 것을 대략적으로 추측할 수 있습니다. 사용자 이름, 비밀번호, 인증 코드 및 "기억하기" 값이 있다는 것이 분명합니다. . 그렇다면 실제로는 어떤 것들이 있나요? 아래에서 분석해 보겠습니다.
먼저 HTML 소스코드를 CTRL+U로 구글에서 확인한 후, CTRL+F로 입력하면 어떤 필드 값이 있는지 확인할 수 있습니다.
서버에 요청하면 소스 코드에 숨겨진 필드 "_xsrf"도 있다고 표시됩니다. 이제 문제는 매개변수가 어떤 이름을 통해 전달되는지이므로 분석을 위해 데이터 패킷을 캡처하려면 다른 도구를 사용해야 합니다. 여기서는 Windows 시스템에서 작동할 수 있는 Fiddler를 사용합니다. 물론 다른 도구도 사용할 수 있습니다.
패킷 캡처를 통해 얻은 정보의 양이 많아 필요한 정보를 찾기가 더 어려워지고, 이로 인해 패킷 캡처 프로세스가 더욱 번거로워집니다. 피들러에 관해서는 사용하기가 매우 쉽습니다. 경험이 없다면 Baidu에서 검색할 수 있습니다. 다른 정보가 간섭하는 것을 방지하기 위해 먼저 fiddler에서 기록을 지운 다음 사용자 이름(작성자는 이메일을 사용하여 로그인), 비밀번호 및 기타 정보를 입력하여 로그인합니다. fiddler의 해당 결과는 다음과 같습니다.
Remarks: 휴대폰을 사용하여 로그인하는 경우 fiddler의 해당 URL은 "/login/phone_num"입니다.
자세한 요청 매개변수를 보려면 "/login/email"을 마우스 왼쪽 버튼으로 클릭하면 다음 정보를 볼 수 있습니다.
요청 방법은 POST이고 요청 URL은 https입니다. //www.zhihu.com/login/email
. From Data에서 볼 수 있듯이 해당 필드 이름은 다음과 같습니다. https://www.zhihu.com/login/email
。而从From Data可以看出,相应的字段名称如下:
_xsrf
captcha
password
remember
对于这五个字段,代码中email、password以及captcha都是手动输入的,remember初始化为true。可以根据登录页面的源文件,获取input标签中名为_xsrf的value值,从而得到剩余的_xsrf。
对于验证码,则需要通过额外的请求,该链接可以通过定点查看源码看出:
链接为https://www.zhihu.com/captcha.gif?type=login
,这里省略了ts(经测试,可省略掉)。现在,可以使用代码进行模拟登录。
温馨提示:如果使用的是手机号码进行登录,则请求的url为https://www.zhihu.com/login/phone_num
이 다섯 가지 분야에 대해 코드는 이메일, 비밀번호, 보안 문자를 모두 수동으로 입력하고 기억은 true로 초기화됩니다. 로그인 페이지의 소스 파일을 기반으로 입력 태그에서 _xsrf라는 값을 얻으면 나머지 _xsrf를 얻을 수 있습니다.
인증 코드용 , 추가 요청을 전달해야 합니다. 고정된 지점에서 소스 코드를 보면 링크를 볼 수 있습니다:
링크는 https://www.zhihu.com/captcha.gif?type=login
입니다, ts 여기서는 생략합니다(테스트 후 생략 가능). 이제 코드를 사용하여 로그인을 시뮬레이션할 수 있습니다.
https://www.zhihu.com/login/phone_num
이고 이메일 필드 이름은 "phone_num"이 됩니다. " . 🎜🎜시뮬레이션 소스 코드🎜🎜Zhihu 로그인을 구현하는 코드를 작성하는 과정에서 작성자는 재사용을 위해 일부 기능을 간단한 클래스 WSpider로 캡슐화했습니다. 🎜# -*- coding: utf-8 -*- """ Created on Thu Nov 02 14:01:17 2016 @author: liudiwei """ import urllib import urllib2 import cookielib import logging class WSpider(object): def __init__(self): #init params self.url_path = None self.post_data = None self.header = None self.domain = None self.operate = None #init cookie self.cookiejar = cookielib.LWPCookieJar() self.opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(self.cookiejar)) urllib2.install_opener(self.opener) def setRequestData(self, url_path=None, post_data=None, header=None): self.url_path = url_path self.post_data = post_data self.header = header def getHtmlText(self, is_cookie=False): if self.post_data == None and self.header == None: request = urllib2.Request(self.url_path) else: request = urllib2.Request(self.url_path, urllib.urlencode(self.post_data), self.header) response = urllib2.urlopen(request) if is_cookie: self.operate = self.opener.open(request) resText = response.read() return resText """ Save captcha to local """ def saveCaptcha(self, captcha_url, outpath, save_mode='wb'): picture = self.opener.open(captcha_url).read() #用openr访问验证码地址,获取cookie local = open(outpath, save_mode) local.write(picture) local.close() def getHtml(self, url): page = urllib.urlopen(url) html = page.read() return html """ 功能:将文本内容输出至本地 @params content:文本内容 out_path: 输出路径 """ def output(self, content, out_path, save_mode="w"): fw = open(out_path, save_mode) fw.write(content) fw.close() """#EXAMPLE logger = createLogger('mylogger', 'temp/logger.log') logger.debug('logger debug message') logger.info('logger info message') logger.warning('logger warning message') logger.error('logger error message') logger.critical('logger critical message') """ def createLogger(self, logger_name, log_file): # 创建一个logger logger = logging.getLogger(logger_name) logger.setLevel(logging.INFO) # 创建一个handler,用于写入日志文件 fh = logging.FileHandler(log_file) # 再创建一个handler,用于输出到控制台 ch = logging.StreamHandler() # 定义handler的输出格式formatter formatter = logging.Formatter('%(asctime)s | %(name)s | %(levelname)s | %(message)s') fh.setFormatter(formatter) ch.setFormatter(formatter) # 给logger添加handler logger.addHandler(fh) logger.addHandler(ch) return logger
# -*- coding: utf-8 -*- """ Created on Thu Nov 02 17:07:17 2016 @author: liudiwei """ import urllib from WSpider import WSpider from bs4 import BeautifulSoup as BS import getpass import json import WLogger as WLog """ 2016.11.03 由于验证码问题暂时无法正常登陆 2016.11.04 成功登录,期间出现下列问题 验证码错误返回:{ "r": 1, "errcode": 1991829, "data": {"captcha":"验证码错误"}, "msg": "验证码错误" } 验证码过期:{ "r": 1, "errcode": 1991829, "data": {"captcha":"验证码回话无效 :(","name":"ERR_VERIFY_CAPTCHA_SESSION_INVALID"}, "msg": "验证码回话无效 :(" } 登录:{"r":0, "msg": "登录成功"} """ def zhiHuLogin(): spy = WSpider() logger = spy.createLogger('mylogger', 'temp/logger.log') homepage = r"https://www.zhihu.com/" html = spy.opener.open(homepage).read() soup = BS(html, "html.parser") _xsrf = soup.find("input", {'type':'hidden'}).get("value") #根据email和手机登陆得到的参数名不一样,email登陆传递的参数是‘email',手机登陆传递的是‘phone_num' username = raw_input("Please input username: ") password = getpass.getpass("Please input your password: ") account_name = None if "@" in username: account_name = 'email' else: account_name = 'phone_num' #保存验证码 logger.info("save captcha to local machine.") captchaURL = r"https://www.zhihu.com/captcha.gif?type=login" #验证码url spy.saveCaptcha(captcha_url=captchaURL, outpath="temp/captcha.jpg") #temp目录需手动创建 #请求的参数列表 post_data = { '_xsrf': _xsrf, account_name: username, 'password': password, 'remember_me': 'true', 'captcha':raw_input("Please input captcha: ") } #请求的头内容 header ={ 'Accept':'*/*' , 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8', 'X-Requested-With':'XMLHttpRequest', 'Referer':'https://www.zhihu.com/', 'Accept-Language':'en-GB,en;q=0.8,zh-CN;q=0.6,zh;q=0.4', 'Accept-Encoding':'gzip, deflate, br', 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36', 'Host':'www.zhihu.com' } url = r"https://www.zhihu.com/login/" + account_name spy.setRequestData(url, post_data, header) resText = spy.getHtmlText() jsonText = json.loads(resText) if jsonText["r"] == 0: logger.info("Login success!") else: logger.error("Login Failed!") logger.error("Error info ---> " + jsonText["msg"]) text = spy.opener.open(homepage).read() #重新打开主页,查看源码可知此时已经处于登录状态 spy.output(text, "out/home.html") #out目录需手动创建 if __name__ == '__main__': zhiHuLogin()
콘솔에서 python zhiHuLogin.py를 실행한 후 메시지에 따라 해당 내용을 입력하면 다음과 같은 다른 결과를 얻을 수 있습니다(3가지 예가 제공됨):
위 내용은 Python을 사용하여 Zhihu에서 시뮬레이션된 로그인을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!