Maison >développement back-end >Tutoriel Python >Comment utiliser Python pour implémenter une connexion simulée sur Zhihu
Lors de la capture de paquets, j'ai d'abord utilisé Network dans les outils de développement Chrome, mais je n'ai pas réussi à les capturer. Plus tard, j'ai utilisé Fiddler pour capturer avec succès les données. Le processus ci-dessus sera détaillé étape par étape ci-dessous.
Avant de simuler la connexion Zhihu, jetez d'abord un œil à l'environnement et aux outils utilisés dans ce cas :
Windows 7 + Python 2.75
Chrome + Fiddler : utilisé pour surveiller la communication entre le client et le serveur, et trouver l'emplacement des paramètres pertinents.
Utilisez le navigateur Google combiné avec Fiddler pour surveiller le processus de communication entre le client et le serveur
Selon les résultats de la surveillance, construisez les paramètres transmis lors du processus de demande ; le serveur ;
Utiliser Python Simuler le processus de transmission des paramètres.
Plusieurs points clés dans le processus de communication entre client et serveur :
Adresse URL lors de la connexion.
Il existe deux manières principales d'obtenir les paramètres [params] soumis lors de la connexion : la première consiste à retrouver les balises et les attributs du formulaire en analysant le code source de la page ;. Adaptez-vous à des pages relativement simples. Deuxièmement, utilisez un outil de capture de paquets pour afficher l'URL et les paramètres soumis. Généralement, Network, Fiddler, etc. dans les outils de développement de Chrome sont utilisés.
L'url qui saute après la connexion.
Regardez d'abord cette page de connexion, qui est l'adresse URL lorsque nous nous connectons.
En voyant cette page, on peut aussi deviner grossièrement que plusieurs champs sont renseignés lors de la requête au serveur. Il est évident qu'il y a : le nom d'utilisateur, le mot de passe, le code de vérification et les valeurs de "se souvenir de moi". . Alors, lesquels sont réellement là ? Analysons-le ci-dessous.
Vérifiez d'abord le code source HTML. Vous pouvez utiliser CTRL+U pour l'afficher dans Google, puis utiliser CTRL+F pour saisir l'entrée et voir quelles sont les valeurs de champ. Les détails sont les suivants :
.Lors de la requête auprès du serveur, le code source montre qu'il existe également un champ caché "_xsrf". La question est maintenant de savoir sous quel nom les paramètres sont transmis. D'autres outils doivent donc être utilisés pour capturer les paquets de données à des fins d'analyse. Ici, j'utilise Fiddler, qui peut fonctionner sur les systèmes Windows. Bien entendu, vous pouvez également utiliser d’autres outils.
En raison de la grande quantité d'informations obtenues à partir de la capture de paquets, il devient plus difficile de trouver les informations requises, ce qui rend le processus de capture de paquets plus fastidieux. Concernant le violoniste, il est très simple à utiliser si vous avez de l'expérience, vous pouvez le rechercher sur Baidu. Afin d'éviter que d'autres informations n'interfèrent, nous effaçons d'abord les enregistrements dans fiddler, puis entrons le nom d'utilisateur (l'auteur utilise un e-mail pour se connecter), le mot de passe et d'autres informations pour se connecter. Les résultats correspondants dans fiddler seront les suivants suit :
Remarques : Si vous utilisez un téléphone portable pour vous connecter, l'url correspondante dans fiddler est "/login/phone_num".
Afin de visualiser les paramètres détaillés de la requête, nous faisons un clic gauche sur "/login/email" et vous pouvez voir les informations suivantes :
La méthode de requête est POST, et l'url demandée est https : //www.zhihu .com/login/email
. Comme le montre From Data, les noms de champs correspondants sont les suivants : 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 est omis ici (après test, peut être omis). Il est désormais possible de simuler une connexion à l'aide de code. 🎜🎜Rappel chaleureux : si vous utilisez un numéro de téléphone mobile pour vous connecter, l'URL demandée est https://www.zhihu.com/login/phone_num
et le nom du champ de courrier électronique deviendra "phone_num " . 🎜🎜Code source de la simulation🎜🎜Dans le processus d'écriture du code pour implémenter la connexion Zhihu, l'auteur a encapsulé certaines fonctions dans une simple classe WSpider pour les réutiliser. 🎜# -*- 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🎜Le code source de la connexion simulée à Zhihu est enregistré dans le fichier zhiHuLogin.py Le contenu est le suivant : 🎜
# -*- 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()🎜Pour l'analyse du code source, vous pouvez vous référer aux annotations dans le code. 🎜
Exécutez python zhiHuLogin.py dans la console, puis entrez le contenu correspondant lorsque vous y êtes invité. Enfin, vous pouvez obtenir les différents résultats suivants (trois exemples sont donnés) :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!