Beim Erfassen von Paketen habe ich zunächst Network in den Chrome-Entwicklungstools verwendet, konnte sie aber nicht erfassen. Später habe ich Fiddler verwendet, um die Daten erfolgreich zu erfassen. Der obige Vorgang wird im Folgenden Schritt für Schritt beschrieben.
Bevor Sie die Zhihu-Anmeldung simulieren, werfen Sie zunächst einen Blick auf die Umgebung und die in diesem Fall verwendeten Tools:
Windows 7 + Python 2.75
Chrome + Fiddler: Wird zur Überwachung der Kommunikation zwischen Client und Server verwendet. und Finden Sie die Position relevanter Parameter.
Verwenden Sie den Google-Browser in Kombination mit Fiddler, um den Kommunikationsprozess zwischen dem Client und dem Server zu überwachen.
Konstruieren Sie anhand der Überwachungsergebnisse die im Anforderungsprozess übergebenen Parameter der Server;
Verwenden Sie Python, um den Parameterübergabeprozess zu simulieren.
Mehrere wichtige Punkte im Kommunikationsprozess zwischen Client und Server:
URL-Adresse beim Anmelden.
Es gibt zwei Hauptmethoden, um die beim Anmelden übermittelten Parameter [params] zu erhalten: Die erste besteht darin, die Formular-Tags und -Attribute durch Analyse des Seitenquellcodes zu finden. Passen Sie sich an relativ einfache Seiten an. Zweitens verwenden Sie ein Paketerfassungstool, um die übermittelte URL und die Parameter anzuzeigen. Normalerweise werden Netzwerk, Fiddler usw. in den Entwicklertools von Chrome verwendet.
Die URL, die nach dem Anmelden springt.
Schauen Sie sich zunächst diese Anmeldeseite an. Dies ist die URL-Adresse, wenn wir uns anmelden.
Wenn wir diese Seite sehen, können wir auch grob erraten, dass bei der Anfrage an den Server mehrere Felder übergeben werden. Es ist offensichtlich, dass es folgende gibt: Benutzername, Passwort, Bestätigungscode und die Werte von „Mich merken“. . Welche gibt es eigentlich? Lassen Sie es uns unten analysieren.
Überprüfen Sie zunächst den HTML-Quellcode, um ihn in Google anzuzeigen, und geben Sie dann mit STRG+F Eingaben ein, um zu sehen, welche Feldwerte vorhanden sind:
Beim Anfordern des Servers zeigt der Quellcode, dass es auch ein verstecktes Feld „_xsrf“ gibt. Die Frage ist nun, über welchen Namen die Parameter weitergeleitet werden. Daher müssen andere Tools verwendet werden, um die Datenpakete für die Analyse zu erfassen. Hier verwende ich Fiddler, das auf Windows-Systemen funktionieren kann. Natürlich können Sie auch andere Tools verwenden.
Aufgrund der großen Menge an Informationen, die bei der Paketerfassung gewonnen werden, wird es schwieriger, die erforderlichen Informationen zu finden, was den Paketerfassungsprozess umständlicher macht. Was Fiddler betrifft, ist es sehr einfach zu verwenden. Wenn Sie keine Erfahrung haben, können Sie es auf Baidu suchen. Um zu verhindern, dass andere Informationen stören, löschen wir zunächst die Datensätze in Fiddler und geben dann den Benutzernamen (der Autor verwendet eine E-Mail zum Anmelden), das Passwort und andere Informationen zum Anmelden ein. Die entsprechenden Ergebnisse in Fiddler lauten wie folgt folgt:
Bemerkungen: Wenn Sie sich mit einem Mobiltelefon anmelden, lautet die entsprechende URL in Fiddler „/login/phone_num“.
Um die detaillierten Anfrageparameter anzuzeigen, klicken wir mit der linken Maustaste auf „/login/email“ und Sie können die folgenden Informationen sehen:
Die Anfragemethode ist POST und die angeforderte URL ist https: //www.zhihu.com/login/email
. Wie aus From Data hervorgeht, lauten die entsprechenden Feldnamen wie folgt: 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
https://www.zhihu.com/captcha.gif?type=login
, ts wird hier weggelassen (kann nach dem Testen weggelassen werden). Es ist jetzt möglich, die Anmeldung mithilfe von Code zu simulieren. 🎜🎜Warme Erinnerung: Wenn Sie sich mit einer Mobiltelefonnummer anmelden, lautet die angeforderte URL https://www.zhihu.com/login/phone_num
und der Name des E-Mail-Felds wird zu „phone_num“. " . 🎜🎜Simulationsquellcode🎜🎜Während des Schreibens von Code zur Implementierung der Zhihu-Anmeldung hat der Autor einige Funktionen zur Wiederverwendung in eine einfache Klasse WSpider gekapselt. Der Dateiname lautet WSpider.py. 🎜# -*- 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()
Führen Sie python zhiHuLogin.py in der Konsole aus und geben Sie dann nach Aufforderung den entsprechenden Inhalt ein (drei Beispiele werden angegeben):
Das obige ist der detaillierte Inhalt vonSo implementieren Sie mit Python eine simulierte Anmeldung bei Zhihu. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!