<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在抓包的時候,開始使用的是Chrome開發工具中的Network,結果沒有抓到,後來使用Fiddler成功抓取資料。下面逐步來細化上述過程。
模擬知乎登入前,先看看本次案例使用的環境及其工具:
使用者端與伺服器端通訊過程的幾個關鍵點:
首先看看這個登入頁面,也就是我們登入時的url地址。
看到這個頁面,我們也可以大概猜測下請求伺服器時傳遞了幾個欄位,很明顯有:使用者名稱、密碼、驗證碼以及“記住我”這幾個值。那麼實際上有哪些呢?下面來分分析下。
首先檢視一下HTML原始碼,Google裡可以使用CTRL+U檢視,然後使用CTRL+F輸入input看看有哪些欄位值,詳情如下:
通過原始碼,我們可以看到,在請求伺服器的過程中還攜帶了一個隱藏欄位”_xsrf”。那麼現在的問題是:這些引數在傳遞時是以什麼名字傳遞的呢?這就需要借用其他工具抓包進行分析了。筆者是Windows系統,這裡使用的是Fiddler(當然,你也可以使用其他的)。
抓包過程比較繁瑣,因為抓到的東西比較多,很難快速的找到需要的資訊。關於fiddler,很容易使用,有過不會,可以去百度搜一下。為了防止其他資訊干擾,我們先將fiddler中的記錄清除,然後輸入使用者名稱(筆者使用的是郵箱登入)、密碼等資訊登入,相應的在fiddler中會有如下結果:
備註:如果是使用手機登入,則對應fiddler中的url是“/login/phone_num”。
為了檢視詳細的請求引數,我們左鍵單機“/login/email”,可以看到下列資訊:
請求方式為POST,請求的url為https://www.zhihu.com/login/email
。而從From Data可以看出,相應的欄位名稱如下:
對於這五個欄位,程式碼中email、password以及captcha都是手動輸入的,remember初始化為true。剩下的_xsrf則可以根據登入頁面的原始檔,取input為_xsrf的value值即可。
對於驗證碼,則需要通過額外的請求,該連結可以通過定點檢視原始碼看出:
連結為https://www.zhihu.com/captcha.gif?type=login
,這裡省略了ts(經測試,可省略掉)。現在,可以使用程式碼進行模擬登入。
溫馨提示:如果使用的是手機號碼進行登入,則請求的url為https://www.zhihu.com/login/phone_num
,同時email欄位名稱將變成“phone_num”。
在編寫程式碼實現知乎登入的過程中,筆者將一些功能封裝成了一個簡單的類WSpider,以便複用,檔名稱為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
關於模擬登入知乎的原始碼,儲存在zhiHuLogin.py檔案,內容如下:
# -*- 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,然後按提示輸入相應的內容,最後可得到以下不同的結果(舉了三個範例):
通過程式碼,可以成功的登入到知乎,接著如果要爬取知乎裡面的內容,就比較方便了。
以上就是利用Python實現模擬登入知乎的詳細內容,更多關於Python模擬登入知乎的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45