Python爬蟲技術(一)--模擬登錄

最近對網絡爬蟲比較感興趣,正巧遇上學習Python階段,因而準備用這把加農炮來實現個人網絡爬蟲學習之路。本次學習就由我所在學校的教務系統做爲實驗對象,哇咔咔,盡情的血虐教務系統吧!(不過好像暴露個人身份了,不要緊,技術爲尊)。html

在進行咱們的爬蟲實驗前,咱們先要了解咱們瀏覽器是如何工做的。關於HTTP等協議的工做流程我就不推薦各類繁雜的書籍博客了,古人說的好,紙上得來終覺淺,絕知此事要躬行。咱們能夠對瀏覽器進行抓包觀察流程嘛!來,翠花,上酸菜!
此次咱們要用的是火狐瀏覽器以及firebug插件,沒有插件的能夠在火狐應用商店下載。一切準備就緒,就能夠開幹了。首先,咱們在瀏覽器輸入登錄頁面地址,按F12鍵打開firebug。(看看咱們學校的拉麪女神仍是頗有味道的......)
接下來咱們添上用戶名和密碼,並觀察HTML文件,觀察表單如何提交。這時有一個小技巧,咱們能夠Ctrl+F鍵查找post關鍵字定位到表單代碼:

咱們能夠看到除了學號和密碼以外,還有五項隱藏表單項。這裏我能夠說明,除了lt是一個隨機字符串外,其餘幾個均爲定值。咱們先登錄一下看看有什麼變化。

咱們能夠看到post信息一共有8項,這八項咱們以前都在HTML文件中看到過了。再繼續看一看頭信息中都有什麼內容呢。

這個時候咱們就能夠封裝數據包來模擬登錄了。模擬登錄最主要的是什麼呢?就是咱們用代碼來模擬瀏覽器的動做。首先咱們去定義一個頭信息。頭信息內容就按照咱們瀏覽器中獲得的封裝。這裏有一個很重要的項 Referer,是反爬蟲技術所設立的。該項爲了證實你是從正確網頁登錄,而不是隨便從哪旮旯跳過來,還有User-Agent項也很重要,代表了咱們的身份是一個瀏覽器,而不是其餘玩意兒。其他的估計能夠精簡,有興趣的能夠試一下。
#構造頭部信息
    head = {
               'Accept'     : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
               'Accept-Encoding' : 'gzip,deflate',
               'Accept-Language' : 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
               'Host'       : 'ids.chd.edu.cn',
               'Connection' : 'keep-alive',
               #反爬蟲技術,這個說明咱們是從這個網頁進入的
               'Referer'    : 'http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal',
               'Upgrade-Insecure-Requests' : '1',
               #假裝瀏覽器
               'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0'
               }
接着,咱們來定義一個post,post中有一個lt項,咱們以前看到了,是以前的登陸頁面中的一個表單值,這個是個隨機值,咱們要想正確填寫它,這就須要咱們先獲得這個值,咱們這裏先get頁面內容,而後查找這個值
posturl = "http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal"

    #保存cookies,不保存cookie很危險,登錄成功後不保存cookie服務器將不知道你已經登陸
    #或者說服務器不知道你是你,就致使得到頁面失敗
    s = requests.session()
    circle = s.get(posturl).text
    #查找lt字符串
    #長大信息門戶中有幾個隱藏表單項,lt表單項爲一個隨機字符串
    #其他幾個均爲固定字符串
    #因此咱們必須先獲得lt字符串
    ltString = '<input type="hidden" name="lt" value=".*?"'
    ltAnswer = re.findall(ltString, circle)
    lt = ltAnswer[0].replace('<input type="hidden" name="lt" value="','')
    #這裏必須轉換爲utf8格式,不然爲Unicode格式,致使亂碼失敗
    lt = lt.replace('"','').encode("utf-8")	
#構造Post數據
    postData = {'_eventId' : "submit",
                'btn1'     : "",
                'dllt'     : "userNamePasswordLogin",
                'execution': "e1s1",
                'lt'       : lt,
                'password' : "*******",
                'rmShown'  : "1",
                'username' : "123456789",
            }
接下來,就到了見證奇蹟的時刻。咱們要表明瀏覽器向服務器發送數據了n(*≧▽≦*)n。一樣,代碼以下:
loginhtml = s.post(posturl,data=postData,headers=head)


    url2 = 'http://portal.chd.edu.cn'
    head2 = {
             'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0',
             'Referer'   : 'http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal'}

    scorehtml = s.get(url2,headers=head2)

    print scorehtml.text.decode('gbk','ignore')
這時,咱們得到了登錄成功後的頁面。有的服務器有IP地址限制,須要不斷更換IP地址,不過Python也給了咱們解決辦法,關於這方面的知識你們有興趣的能夠百度,我就不給出具體信息了~~
好了,最後上完整代碼,噹噹噹當~
# -*- coding: utf-8 -*-
import requests
import sys
import urllib2
import re
if __name__ == "__main__":

    ## 這段代碼是用於解決中文報錯的問題
    reload(sys)
    sys.setdefaultencoding("utf8")

    posturl = "http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal"

    #保存cookies,不保存cookie很危險,登錄成功後不保存cookie服務器將不知道你已經登陸
    #或者說服務器不知道你是你,就致使得到頁面失敗
    s = requests.session()
    circle = s.get(posturl).text
    #查找lt字符串
    #長大信息門戶中有幾個隱藏表單項,lt表單項爲一個隨機字符串
    #其他幾個均爲固定字符串
    #因此咱們必須先獲得lt字符串
    ltString = '<input type="hidden" name="lt" value=".*?"'
    ltAnswer = re.findall(ltString, circle)
    lt = ltAnswer[0].replace('<input type="hidden" name="lt" value="','')
    #這裏必須轉爲utf8格式,不然傳過去的值爲Unicode編碼,致使亂碼失敗
    lt = lt.replace('"','').encode("utf-8")

    #構造頭部信息
    head = {
               'Accept'     : 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
               'Accept-Encoding' : 'gzip,deflate',
               'Accept-Language' : 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
               'Host'       : 'ids.chd.edu.cn',
               'Connection' : 'keep-alive',
               #反爬蟲技術,這個說明咱們是從這個網頁進入的
               'Referer'    : 'http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal',
               'Upgrade-Insecure-Requests' : '1',
               #假裝瀏覽器
               'User-Agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0'
               }
    #構造Post數據
    postData = {'_eventId' : "submit",
                'btn1'     : "",
                'dllt'     : "userNamePasswordLogin",
                'execution': "e1s1",
                'lt'       : lt,
                'password' : "*******",
                'rmShown'  : "1",
                'username' : "123456789",
            }
    loginhtml = s.post(posturl,data=postData,headers=head)


    url2 = 'http://portal.chd.edu.cn'
    head2 = {
             'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0',
             'Referer'   : 'http://ids.chd.edu.cn/authserver/login?service=http://portal.chd.edu.cn/index.portal'}

    scorehtml = s.get(url2,headers=head2)

    print scorehtml.text.decode('gbk','ignore')
好了,本次實驗到此結束,歡迎一塊兒學習更多知識!
相關文章
相關標籤/搜索