什么?登錄?還模擬登錄?
登錄一個(gè)網(wǎng)頁對(duì)于我們?cè)偈煜げ贿^了。無論是生活當(dāng)中登錄網(wǎng)頁獲取MM圖片,或者是工作當(dāng)中登錄公司網(wǎng)站(如WIKI,jira等)。球都嘛得。。雖然我每天都登錄,但是我可以儲(chǔ)存自己的賬號(hào)和密碼???為什么要模擬登錄?
舉個(gè)李子,拿額們公司需求為例,之前每次發(fā)版,都要從我們公司的wiki里面手動(dòng)拷貝需求列表,然后發(fā)送質(zhì)量報(bào)告郵件。這樣繁瑣重復(fù)的工作我們當(dāng)然不能忍啦,就想著可以通過腳本實(shí)現(xiàn)自動(dòng)化(畢竟我們勤奮的目的就是將來讓我們變得更懶,??)。
吶,有了這個(gè)構(gòu)思,我們就開始實(shí)戰(zhàn)吧!
這里我選用python完成這一工作,畢竟在爬蟲領(lǐng)域無出其右者。你可以選擇urllib來實(shí)現(xiàn),這里我用requests來實(shí)現(xiàn)。
requests庫實(shí)現(xiàn)模擬登錄獲取數(shù)據(jù)其實(shí)大概分三部曲:
get請(qǐng)求登錄url->post請(qǐng)求進(jìn)行登錄操作->對(duì)相應(yīng)的url進(jìn)行數(shù)據(jù)獲取
第一、get請(qǐng)求登錄url
為什么要這樣做?這里可能會(huì)有些疑惑,我們直接攜帶我們的登錄賬號(hào)和密碼,post請(qǐng)求不就登錄上去來么?這一步的意義是什么?
是這樣的,我們的登錄操作看似只是填寫來用戶名和密碼,但是有些網(wǎng)站它會(huì)攜帶用戶不可見的token作為參數(shù)進(jìn)行傳遞。我們可以看下圖:

有些網(wǎng)站都會(huì)將這些token也作為參數(shù)進(jìn)行傳遞,讓服務(wù)器端進(jìn)行校驗(yàn)。
那。。我們寫死,也傳這個(gè)token,value直接傳這個(gè)content的值,不可以么?
遺憾的是,大部分網(wǎng)站的登錄token通過每次的get請(qǐng)求都是不同的,可能這次你請(qǐng)求的是這個(gè)token,下次就完全變了樣了。。
這個(gè)時(shí)候,requests.session就給我們極大的便利咯。平常情況下,我們都是直接requests.get或者requests.post進(jìn)行網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求。而你每進(jìn)行一次這種操作都可以理解為你重新打開了一個(gè)新的網(wǎng)頁,而session的好處是它可以保證我們操作的是同一個(gè)頁面。這次我們先初始化一個(gè)session:
mySession = requests.session()
然后我們用session去請(qǐng)求login_url:
response = mySession.get(login_url, verify=False).text
現(xiàn)在我們就得到登錄的各種數(shù)據(jù)了,怎么拿到這個(gè)token呢?因?yàn)檫@里我們只拿token,所以可以略使小技,用一個(gè)寫死的正則表達(dá)式來獲取:
strToken = r'''<meta id="atlassian-token" name="atlassian-token" content=(.*?)>'''
userToken = re.findall(strToken, response)[0]
到這一步,我們就完成第一步咯!
第二、post請(qǐng)求進(jìn)行登錄操作
其實(shí)這一步就很簡單了,也不一定用post進(jìn)行登錄,根據(jù)不同的網(wǎng)站用不同請(qǐng)求。先把我們剛剛獲取的token放入?yún)?shù)dict:
loginPayload = {'atlassian-token':userToken, 'login':你的用戶名,'password':你的密碼}
這里仍然用剛剛初始化的那個(gè)session:
loginResult = mySession.post(login_url, data=loginPayload)
這樣,我們就完成了登錄操作。
第三、對(duì)相應(yīng)的url進(jìn)行數(shù)據(jù)獲取
這一步就更加簡單了,直接對(duì)需要獲取數(shù)據(jù)的url進(jìn)行爬取就可以了
queryResponse = mySession.get(queryUrl, verify=False)
?其中queryUrl就是你要爬取數(shù)據(jù)的鏈接,后續(xù)可以手動(dòng)進(jìn)行傳入。
獲取到queryResponse之后,剩下的就是對(duì)數(shù)據(jù)進(jìn)行解析的操作了。你可以利用高大上的beautifulsoup,也可以用python的htmlpaser,或者xpath等等,相信后續(xù)操作大家都知道怎么辦啦!