python模擬登錄練習(xí)(一)

上一篇文章模擬登陸存在問(wèn)題用scrapy無(wú)法登錄知乎动壤,后來(lái)志明S告訴我是驗(yàn)證碼的問(wèn)題这嚣,另外知乎上xchaoinfo提到知乎登錄需要保持cookies一致辙售,都不是太理解肛鹏,暫時(shí)找不到解決方案,在查找模擬登錄的方法的時(shí)候脂矫,發(fā)現(xiàn)了xchaoinfo大神的模擬登錄各大網(wǎng)站的源碼,暫時(shí)先去學(xué)習(xí)那個(gè)了霉晕,scrapy模擬登錄的問(wèn)題暫時(shí)擱置庭再。

先拿相對(duì)簡(jiǎn)單登錄知乎開始練習(xí)(模仿),以下是根據(jù)xchaoinfo的源碼做的學(xué)習(xí)筆記牺堰,知識(shí)點(diǎn)在代碼中注釋了拄轻,注釋的地方是我看源碼不會(huì)的點(diǎn),然后google查資料后自己的理解(部分注釋是源碼自帶的)伟葫。

代碼

import requests
import http.cookiejar
import re
import time
import os.path
from PIL import Image
from lxml import etree


#構(gòu)造headers
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'

headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Encoding':'gzip, deflate, sdch, br',
            'Accept-Language':'zh-CN,zh;q=0.8',
            'Cache-Control':'max-age=0',
            'Connection':'keep-alive',
            'Host':'www.zhihu.com',
            'Upgrade-Insecure-Requests':'1',
            'User-Agent':user_agent,
            }


#使用登錄cookies信息
session = requests.session()    #實(shí)例化一個(gè)session類恨搓,session能夠用同一個(gè)cookies訪問(wèn)不同的url
session.cookies = http.cookiejar.LWPCookieJar(filename='cookies')
try:
    session.cookies.load(ignore_discard=True)
except:
    print('cookie未加載')


def get_xsrf():
    #_xrsf是一個(gè)動(dòng)態(tài)參數(shù)
    start_url = 'https://www.zhihu.com/#signin'
    start_response = session.get(start_url,headers=headers)
    html = start_response.text
    #print(html)
    select = etree.HTML(html)   #使用lxml庫(kù)解析
    _xsrf = select.xpath('//html/body/input[@name="_xsrf"]/@value')[0]
    return _xsrf

def get_captcha():
    t = str(int(time.time()*1000))
    captcha_url =  'https://www.zhihu.com/captcha.gif?r=' + t + "&type=login"   #獲得驗(yàn)證碼圖片的地址,t是需要用到格林威治時(shí)間戳
    print(captcha_url)
    r = session.get(captcha_url,headers=headers)
    with open('captcha.jpg','wb') as f:
        f.write(r.content)  #r.content 是二進(jìn)制內(nèi)容,r.text為unicode內(nèi)容

    # 用pillow 的 Image 顯示驗(yàn)證碼
    # 如果沒有安裝 pillow 到源代碼所在的目錄去找到驗(yàn)證碼然后手動(dòng)輸入

    try:
        im = Image.open('captcha.jpg')
        im.show()
        im.close()
    except:
         print(r'請(qǐng)到 %s 目錄找到captcha.jpg 手動(dòng)輸入' % os.path.abspath('captcha.jpg'))
    captcha = input('請(qǐng)輸入驗(yàn)證碼:\n')
    return captcha

def islogin():
    #通過(guò)查看用戶個(gè)人信息來(lái)判斷是否已經(jīng)登錄
    url = 'https://www.zhihu.com/settings/profile'
    login_code = session.get(url,headers=headers,allow_redirects=False).status_code   #不允許重定向
    if login_code == 200:
        return True
    else:
        return  False

def login(account,secret):
    #通過(guò)輸入的用戶名判斷是否是手機(jī)號(hào)
    if re.match(r'^1\d{10}$',account):
        print("手機(jī)號(hào)登錄 \n")
        post_url = 'https://www.zhihu.com/login/phone_num'
        post_data = {
            '_xsrf': get_xsrf(),
            'password': secret,
            'remember_me': 'true',
            'phone_num': account,
        }
    else:
        if '@' in account:
            print("郵箱登錄 \n")
        else:
            print("您輸入的賬號(hào)有問(wèn)題斧抱,請(qǐng)重新輸入")
            return 0    #這里的return起的作用是跳出去本次登錄
        post_url = 'https://www.zhihu.com/login/email'
        post_data = {
            '_xsrf': get_xsrf(),
            'password': secret,
            'remember_me': 'true',
            'email': account,
        }
    try:
        # 不需要驗(yàn)證碼直接登錄成功
        login_page = session.post(post_url,data=post_data,headers=headers)
        login_code = login_page.text    #獲得網(wǎng)站的內(nèi)容
        print(login_page.status_code)   #測(cè)試是否登錄成功
        print(login_code)   #打印網(wǎng)站的內(nèi)容
    except:
        post_data['captcha'] = get_captcha()
        login_page = session.post(post_url,data=post_data,headers=headers)
        login_code = eval(login_page.text) #eval函數(shù)可以把list,tuple,dict和string相互轉(zhuǎn)化
        print(login_code['msg'])
    session.cookies.save() #保存cookies,后續(xù)爬取內(nèi)容時(shí)需要


try:
    input = raw_input
except:
    pass

if __name__ == '__main__':
    if islogin():
        print('您已經(jīng)登錄')
    else:
        account = input('請(qǐng)輸入你的用戶名\n>  ')
        secret = input("請(qǐng)輸入你的密碼\n>  ")
        login(account,secret)

本次練習(xí)學(xué)到的知識(shí)點(diǎn)
1.簡(jiǎn)單學(xué)習(xí)了requests庫(kù)常拓,了解requests簡(jiǎn)單get和post方法
2.了解requests庫(kù)的session類,
session.cookies = http.cookiejar.LWPCookieJar(filename='cookies')能夠講cookies保存到本地辉浦。
同時(shí)session能夠使用同一個(gè)cookies訪問(wèn)不同的url弄抬,為全站爬去提供簡(jiǎn)單的解決方案。
3.知道了網(wǎng)站的重定向是什么宪郊,學(xué)了這么久的爬蟲掂恕,居然不知道重定向,汗弛槐。
4.因?yàn)閷?duì)re模塊不是太熟悉懊亡,先學(xué)了lxml模塊的xpath,因?yàn)閟crapy用xpath習(xí)慣了乎串,源碼好多用re的地方改成了xpath解析店枣。
5.安裝了pillow庫(kù),雖然完全不知道pillow庫(kù)強(qiáng)大的功能灌闺。
6.好吧艰争,已經(jīng)學(xué)到蠻多了,最重要的是通過(guò)這次練習(xí)感覺直接對(duì)著源碼桂对,一句一句的理解(慢慢測(cè)試)甩卓,要比直接找現(xiàn)成的解決方法更有用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蕉斜,一起剝皮案震驚了整個(gè)濱河市逾柿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宅此,老刑警劉巖机错,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異父腕,居然都是意外死亡弱匪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門璧亮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)萧诫,“玉大人,你說(shuō)我怎么就攤上這事枝嘶×比模” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵群扶,是天一觀的道長(zhǎng)及刻。 經(jīng)常有香客問(wèn)我镀裤,道長(zhǎng),這世上最難降的妖魔是什么缴饭? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任暑劝,我火速辦了婚禮,結(jié)果婚禮上茴扁,老公的妹妹穿的比我還像新娘铃岔。我一直安慰自己,他們只是感情好峭火,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布毁习。 她就那樣靜靜地躺著,像睡著了一般卖丸。 火紅的嫁衣襯著肌膚如雪纺且。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天稍浆,我揣著相機(jī)與錄音载碌,去河邊找鬼。 笑死衅枫,一個(gè)胖子當(dāng)著我的面吹牛嫁艇,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弦撩,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼步咪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了益楼?” 一聲冷哼從身側(cè)響起猾漫,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎感凤,沒想到半個(gè)月后悯周,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡陪竿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年禽翼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片族跛。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捐康,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出庸蔼,到底是詐尸還是另有隱情,我是刑警寧澤贮匕,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布姐仅,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏掏膏。R本人自食惡果不足惜劳翰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望馒疹。 院中可真熱鬧佳簸,春花似錦、人聲如沸颖变。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)腥刹。三九已至马胧,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衔峰,已是汗流浹背佩脊。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垫卤,地道東北人威彰。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像穴肘,于是被迫代替她去往敵國(guó)和親歇盼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容