1. 程式人生 > >模擬登陸的幾種方式

模擬登陸的幾種方式

  1. 策略一:直接POST資料
  2. 策略二:使用各種工具抓取登陸介面以及所需要的POST資料
  3. 策略三:直接使用儲存登陸狀態的Cookie模擬登陸

策略一:直接POST資料(比如需要登陸的賬戶資訊)

只要是需要提供post資料的,就可以用這種方法。下面示例裡post的資料是賬戶密碼:
我們來模擬登陸一下筆趣閣,這網站基本都沒有什麼反爬蟲措施,一看就很好爬(嘻嘻)。
我特地註冊了一個賬號,來模擬登陸。
在這裡插入圖片描述
賬號密碼a_hui_tai_lang
直接F12
在這裡插入圖片描述
可以看到直接傳送POST請求到http://www.biquge.com.tw/login.php?do=submit&action=login&usecookie=1&jumpurl=即可登陸成功,獲取cookie

#coding=utf-8
import requests

def main():
    # 請求頭
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
    }
    # 筆趣閣的登入請求介面
    url='http://www.biquge.com.tw/login.php?do=submit&action=login&usecookie=1&jumpurl='
# 需求用的的請求資料 data = {'username': 'a_hui_tai_lang', 'password': 'a_hui_tai_lang'} session=requests.session() response = session.post(url, data=data, headers=headers,verify=False) # 檢視一下是否成功登入 print response.content.decode('gbk') # cookies裡面已經有登陸資訊了 print session.cookies if
__name__ == '__main__': main()

在這裡插入圖片描述

策略二:使用各種工具抓取登陸介面以及所需要的POST資料

很多網站並不像第一種直接暴露form表單的提交地址,而且所需要的POST資料除了賬號密碼可能還需要別的資料提交過去驗證,我們可以使用谷歌瀏覽器自帶的F12和fiddler抓包工具來抓取登入介面。
下面來模擬登陸一下csdn
在這裡插入圖片描述
從form表單確實什麼也看不出來,還是開啟fiddler代理來抓一下包
輸入正確的賬號密碼,登入成功後,我們來看一下fiddler
在這裡插入圖片描述
抓介面是個技術活,經驗發現https://passport.csdn.net/v1/register/pc/login/doLogin就是登入介面
在這裡插入圖片描述
需要post的資料為json格式的資料

{"loginType":"1","pwdOrVerifyCode":"密碼","userIdentification":"賬號","fkid":"WC39ZUyXRgdG4bI0VDZz3X0GNTqILbLmv7WsjuSuXD5xTIF65oENJrGQ5f/uSqfZWZUnGBZFUGQ4FFhamaPTTUrUeVpNmrMDsWpm4smqXkQLew8MfbK2zuIz3ocHmOHx3vJpwLbBj4ttXlo0qpufV3vQZhyMGqqJb4L1Ocwt1fOC5L7WzpiRprQTHGoB3R+EKJ9EuAoyJC/iwFwyDRbhp9iMe2iZrETnrz5LmvbeKAWrSTToLuUc1VUMD7Xj6yJM/qxsFHWc1bHrAaeCOpdR5likDVAZ7Onyk1487577677129"}

經過實踐發現loginType、pwdOrVerifyCode和userIdentification是必需的,而fkid不太清楚是什麼,去掉了也無所謂
為了驗證我們登入成功我們可以去訪問一下https://msg.csdn.net/,如果登入失敗,則會返回讓我們登入註冊的頁面,如果成功則返回自己csdn的訊息頁面

#coding=utf-8
import json
import requests

def main():
    name=raw_input('請輸入賬號:')
    pwd=raw_input('請輸入密碼:')
    data = {"loginType": "1", "pwdOrVerifyCode": pwd, "userIdentification": name}

    jsontext=json.dumps(data)
    print jsontext
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
    }
    url='https://passport.csdn.net/v1/register/pc/login/doLogin'
    session=requests.session()
    response = session.post(url, data=jsontext, headers=headers, verify=False)
    print response.text
    print session.get('https://msg.csdn.net/', headers=headers,verify=False).text

if __name__ == '__main__':
    main()

在這裡插入圖片描述
注意不要輸入密碼錯誤超過3次,否則會出現滑塊驗證碼攔截登陸(如果出現滑塊驗證碼,就去網頁登陸成功就好了)

策略三:直接使用儲存登陸狀態的Cookie模擬登陸

如果實在沒辦法了,可以用這種方法模擬登入,畢竟抓介面這活還要破解一下亂七八糟的資料也不是那麼容易的,這個的成功率基本上是100%的。
思路:

  • 想辦法獲取到登入的cookie值,比如自己手動用瀏覽器登入,F12的cookie值,直接複製到程式碼裡面使用,或者使用selenium模擬登陸瀏覽器,然後儲存cookie值到本地文字或資料庫,然後直接從文字或者資料庫裡面使用cookie。

下面還是以登入csdn為例

#coding=utf-8
import json
import requests
import time
from selenium import webdriver
from requests.cookies import RequestsCookieJar

# 儲存cookie值到文字
def saveCookies(cookies):
    with open("cookies.txt", "w") as fp:
        json.dump(cookies, fp)

# 從文字中獲取cookie值
def getCookies():
    with open("cookies.txt", "r") as fp:
        cookies = json.load(fp)
        return cookies

def seleniumSaveCookies(name,pwd):
    driver = webdriver.Chrome()
    url = 'https://passport.csdn.net/passport_fe/login.html'
    driver.get(url)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div[2]/ul/li[1]/a').click()
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="all"]').send_keys(name)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="password-number"]').send_keys(pwd)
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="app"]/div/div/div/div[2]/div[2]/form/div/div[6]/div/button').click()
    time.sleep(1)
    cookies = driver.get_cookies()
    saveCookies(cookies)
    driver.quit()

def main():
    name=raw_input('請輸入賬號:')
    pwd=raw_input('請輸入密碼:')
    seleniumSaveCookies(name,pwd)
    session = requests.session()
    # 這裡我們使用cookie物件進行處理
    jar = RequestsCookieJar()
    cookies = getCookies()
    for cookie in cookies:
        jar.set(cookie['name'], cookie['value'])
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36",
    }
    print session.cookies
    # 訪問一下訊息中心驗證已經登入了
    print session.get('https://msg.csdn.net/', headers=headers,verify=False,cookies=jar).text
    print session.cookies

if __name__ == '__main__':
    main()

在這裡插入圖片描述
程式碼放在GitHub上,python-learning
以上具體程式碼在目錄python-learning/other/login
我的GitHub
QQ:2541692705
郵箱:[email protected]
我想去流浪,我想去讀書,若有機會,江湖再見
掃一掃,領取紅包,就當獎勵你我付出的努力