Semasa menangkap paket, saya pada mulanya menggunakan Rangkaian dalam alatan pembangunan Chrome, tetapi gagal menangkapnya Kemudian, saya menggunakan Fiddler untuk berjaya menangkap data. Proses di atas akan diperincikan langkah demi langkah di bawah.
Sebelum mensimulasikan log masuk Zhihu, mula-mula lihat persekitaran dan alatan yang digunakan dalam kes ini:
Windows 7 + Python 2.75
Chrome + Fiddler: Digunakan untuk memantau komunikasi antara klien dan pelayan, dan mencari lokasi parameter yang berkaitan.
Gunakan penyemak imbas Google digabungkan dengan Fiddler untuk memantau proses komunikasi antara klien dan pelayan;
Melihat halaman ini, kami juga boleh meneka secara kasar bahawa beberapa medan diluluskan apabila meminta pelayan Jelas sekali bahawa: nama pengguna, kata laluan, kod pengesahan dan "ingat". Saya" nilai-nilai ini. Jadi yang mana sebenarnya ada? Mari analisa di bawah.
Mula-mula semak kod sumber HTML Anda boleh menggunakan CTRL+U untuk melihatnya di Google, dan kemudian gunakan CTRL+F untuk memasukkan input untuk melihat apakah nilai medan yang ada.
Apabila meminta pelayan, kod sumber menunjukkan bahawa terdapat juga medan tersembunyi "_xsrf". Persoalannya sekarang ialah nama apakah parameter yang dilalui, jadi alat lain perlu digunakan untuk menangkap paket data untuk analisis. Di sini, saya menggunakan Fiddler, yang boleh berfungsi pada sistem Windows. Sudah tentu, anda boleh menggunakan alat lain juga.
Disebabkan jumlah maklumat yang banyak diperoleh daripada penangkapan paket, ia menjadi lebih sukar untuk mencari maklumat yang diperlukan, menjadikan proses penangkapan paket lebih rumit. Mengenai fiddler, ia sangat mudah digunakan Jika anda tiada pengalaman, anda boleh mencarinya di Baidu. Untuk mengelakkan maklumat lain daripada mengganggu, kami mula-mula mengosongkan rekod dalam fiddler, dan kemudian masukkan nama pengguna (pengarang menggunakan e-mel untuk log masuk), kata laluan dan maklumat lain untuk log masuk. Hasil yang sepadan dalam fiddler adalah seperti berikut:
Nota: Jika anda menggunakan telefon bimbit untuk log masuk, url yang sepadan dalam fiddler ialah "/login/phone_num".
Untuk melihat parameter permintaan terperinci, kami klik kiri "/log masuk/e-mel" dan anda boleh melihat maklumat berikut:
Permintaan kaedah ialah POST url yang diminta ialah
. Seperti yang dapat dilihat daripada Dari Data, nama medan yang sepadan adalah seperti berikut:_xsrfhttps://www.zhihu.com/login/email
Untuk kod pengesahan, permintaan tambahan diperlukan Pautan boleh dilihat dengan melihat kod sumber pada titik tetap:
Pautannya
, ts ditinggalkan di sini (selepas ujian, ia boleh ditinggalkan). Ia kini boleh mensimulasikan log masuk menggunakan kod.Peringatan hangat: Jika anda menggunakan nombor telefon mudah alih untuk log masuk, url yang diminta ialah
dan nama medan e-mel akan menjadi "nombor_telefon".https://www.zhihu.com/captcha.gif?type=login
Kod sumber simulasi
Dalam proses menulis kod untuk melaksanakan log masuk Zhihu, pengarang merangkumkan beberapa fungsi ke dalam kelas WSpider mudah untuk digunakan semula Nama fail ialah WSpider.py. https://www.zhihu.com/login/phone_num
# -*- 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()
Jalankan python zhiHuLogin.py dalam konsol, dan kemudian masukkan kandungan yang sepadan seperti yang digesa Akhirnya, anda boleh mendapatkan hasil yang berbeza berikut (tiga contoh diberikan):
Atas ialah kandungan terperinci Cara menggunakan Python untuk melaksanakan log masuk simulasi ke Zhihu. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!