爬取Django 繞過csrf實現批量註冊

本文只是提供一些經驗,實際情況下因地制宜。


自己做了個Django項目,緩存用的是redis,部署到雲服務器上,想要通過爬蟲自動化註冊賬號。話不多說,一步步做。

首先要準備賬號數據,chorme利用ctrl+shift+i看一下注冊提交的是什麼數據。因爲post提交有個csrf驗證的東西,還有個驗證碼,這個我們先不管,先把其餘數據處理好。

 

當然也可以做成json格式,這裏用的是xlsx來做,接下來我們提取一下數據。

import xlrd
def get_data(filename,sheetnum):
    dir_case = 'E:\\LearnPython\\' + filename + '.xlsx'
    data = xlrd.open_workbook(dir_case)
    table = data.sheets()[sheetnum]
    nor = table.nrows
    nol = table.ncols
    dict1 = {}
    for i in range(1, nor):
        for j in range(nol):
            title = table.cell_value(0, j)
            ctype = table.cell(i, j).ctype
            value = table.cell_value(i, j)
            if ctype == 2 and value % 1 == 0.0:  # ctype爲2且爲浮點
                value = int(value)  # 浮點轉成整型
                value = str(value)  # 轉成整型後再轉成字符串,如果想要整型就去掉該行
            dict1[title] = value
        yield dict1

這裏數字類型的賬號密碼和手機號碼後尾都加了.0,於是我利用ctype判斷格式後進行轉換爲整型。返回生成的dict1

接下來要獲取 csrfmiddlewaretoken 這個token,這個其實在網頁裏有出現

 

url = '註冊頁面'
req1 = requests.get(url)
soup = BeautifulSoup(req1.text, "html.parser")
csrfmiddlewaretoken = soup.find("input", attrs={'name': 'csrfmiddlewaretoken'})["value"]

這個頁面是每進行註冊就會重新產生的,所以應該將這個放到一個循環裏。

接下來獲取驗證碼了,驗證碼這些一般會存入緩存裏,大部分網站利用redis做緩存,於是我們寫了個獲取驗證碼的函數

def get_checkcode():
    r = redis.StrictRedis(host="公網ip", password="password", port=6379, db=1)
    for item in r.keys():
        if item != b'runtime' and item != b'caches':
            key = item
        value = r.get(key)
        ret = chardet.detect(value)
        s1 = str(value, encoding='Windows-1252') # 將bytes轉換成str
        print(s1)
        res = re.search('	CheckCode”Œ(.*?)”u.', s1)
        if res:
            return res.group(1)
    return None

利用chardet查看value的編碼,發現是windows-1252,怪不得用utf8和gbk都一直轉不成功,然後利用正則匹配出來驗證碼。

這個函數運行時候我是刷新頁面進行驗證的,等到放在requests.get後面又發現獲取不到驗證碼,原來redis都沒生成。

弄到這好想說直接selenium+打碼平臺來自動化算了,可是一想還挺吃虧的,自己的網站自己爬也要給別人錢。

於是又看了一遍註冊的過程,發現有個cookie裏有個csrftoken和sessionid,或許是我沒有加這兩個所以沒能生成驗證碼?

 

然後就找set-cookie這東西,發現requests好像只能拿到csrftoken這個set-cookie,一直拿不到session,再查看之前頁面原來在訪問之前頁面時候就有個set-cookie來設置session。

 

於是訪問主頁獲取sessionid再訪問註冊頁面獲取csrftoken

def get_session():
    req1 = requests.get('主頁地址')
    session = req1.headers['Set-Cookie']
    return session

if __name__ == '__main__':
    for i in get_data('01', 0):
        req1 = requests.get(url)
        csrftoken = req1.headers['Set-Cookie']
        print(csrftoken[0:74])
        soup = BeautifulSoup(req1.text, "html.parser")
        csrfmiddlewaretoken = soup.find("input", attrs={'name': 'csrfmiddlewaretoken'})["value"]
        data = i
        data['csrfmiddlewaretoken'] = csrfmiddlewaretoken
        session = get_session()
        print(session[0:43])

這樣就有了請求頭,於是可正常生成驗證碼接着進行獲取。

完整代碼參見github

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章