Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

PHPz
Libérer: 2023-05-18 16:02:03
avant
1482 Les gens l'ont consulté

Outils d'environnement et de développement

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.

Aperçu du processus de simulation

  • 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.

Exploration des paramètres

Regardez d'abord cette page de connexion, qui est l'adresse URL lorsque nous nous connectons.

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

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 :

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

.

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 :

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

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 :

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

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

  • email

  • password

  • remember

对于这五个字段,代码中email、password以及captcha都是手动输入的,remember初始化为true。可以根据登录页面的源文件,获取input标签中名为_xsrf的value值,从而得到剩余的_xsrf。

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

对于验证码,则需要通过额外的请求,该链接可以通过定点查看源码看出:

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

链接为https://www.zhihu.com/captcha.gif?type=login,这里省略了ts(经测试,可省略掉)。现在,可以使用代码进行模拟登录。

温馨提示:如果使用的是手机号码进行登录,则请求的url为https://www.zhihu.com/login/phone_num

_xsrf

captcha

🎜🎜email🎜🎜🎜🎜password🎜🎜🎜🎜remember🎜🎜🎜 🎜Pour ces cinq domaines, le code L'e-mail, le mot de passe et le captcha sont tous saisis manuellement et Remember est initialisé à true. Vous pouvez obtenir la valeur nommée _xsrf dans la balise d'entrée en fonction du fichier source de la page de connexion, obtenant ainsi le _xsrf restant. 🎜🎜Comment utiliser Python pour simuler la connexion Zhihu🎜🎜Pour le code de vérification , vous devez passer une requête supplémentaire. Le lien est visible en visualisant le code source à un point fixe : 🎜🎜🎜🎜Le lien est 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
Copier après la connexion
🎜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()
Copier après la connexion
🎜Pour l'analyse du code source, vous pouvez vous référer aux annotations dans le code. 🎜

Exécutez les résultats

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) :

Résultat 1 : Mot de passe incorrect

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

.

Résultat 2 : Erreur de code de vérification

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

Résultat 3 : Connexion réussie

Comment utiliser Python pour implémenter une connexion simulée sur Zhihu

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!