1. 程式人生 > >嘗試用requests模擬登入CSDN

嘗試用requests模擬登入CSDN

今天初學用requests庫登入CSDN,在這裡記錄一下心得,有問題請大家多指導。

,用F12開發者工具抓包,看看提交了哪些資料,記得把Preserve log勾選上,不然在結果裡不顯示了。



現在得到了登入地址和提交表單,注意表單裡紅箭頭指向的兩項,lt和execution,看起來是用於驗證的字串,不帶這兩個提交的話可是登入不上去的,那從哪裡獲取這兩個引數呢?

退出登入,重新訪問剛才的登入頁面,在網頁原始碼中查詢這兩個元素的名稱,找到了,見下圖中紅框。CSDN的前端工程師還貼心地寫了註釋,然後可以用正則表示式、BeautifulSoup、lxml等各種方法很容易獲取到這兩個值,我用了lxml。


現在要解決登入時圖片驗證碼的問題,這裡我先用了手動識別輸入的方式,也沒考慮輸入錯誤時的處理,等後面再來考慮這些問題。


同樣使用抓包得到了圖片驗證碼的地址,是一個帶有時間戳引數的地址,請求一次就重新整理一次驗證碼,那我們就可以獲取驗證碼圖片儲存到本地,然後開啟再識別輸入。

所以,要做的工作就是先訪問登入頁面,從頁面中提取登入引數lt和execution,然後請求圖片驗證碼,手動錄入,提交表單完成登陸過程。過程中記得儲存cookie,完整程式碼如下:

# coding:utf-8
__author__ = 'Administrator'

import requests
import lxml.etree
import time
from PIL import Image


if __name__ == '__main__':

    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.109 Safari/537.36"

    #------準備工作-----------
    headers = {"User-Agent": user_agent, "Host": "passport.csdn.net"}
    #帶cookie訪問登入頁面,獲取頁面中的隱藏登入要素
    resp = requests.get("https://passport.csdn.net/account/login", headers=headers)
    ck=resp.cookies
    #用lxml建立tree物件
    tree = lxml.etree.HTML(resp.text)
    #用xpath取得lt,execution兩個隱藏登入要素
    lt = tree.xpath('//form[@id="fm1"]/input[@name="lt"]')[0].get('value')
    execution = tree.xpath('//form[@id="fm1"]/input[@name="execution"]')[0].get('value')

    # ------登入時驗證碼的獲取並手工輸入-----------
    #驗證碼的獲取地址
    url_verify = "https://passport.csdn.net/ajax/verifyhandler.ashx"
    #帶時間戳訪問
    timer = "rand=" + str(round(time.time(), 2))
    header = {"User-Agent": user_agent, "Referer": "https://passport.csdn.net/account/login?ref=toolbar",
              "Host": "passport.csdn.net", "Origin": "https://passport.csdn.net",
              "Connection": "keep-alive"}
    res_verify = requests.get(url_verify, params=timer, headers=header)
    #將驗證碼圖片儲存到本地並開啟
    f = open("yanzheng.png", 'wb')
    f.write(res_verify.content)
    f.close()
    pic_verify = Image.open("yanzheng.png")
    pic_verify.show()

    # ------開始登入-----------
    #手動識別驗證碼並輸入
    code=raw_input(u"輸入驗證碼:")
    login_url="https://passport.csdn.net/account/verify"  # 登入的地址
    # 將之前獲取的隱藏登入要素加入待提交的表單
    login_data={"gps":"", "username":"", "password":"", "validateCode":code,
                "rememberMe":"true","lt":lt,"execution":execution,"_eventId":"submit"}
    #帶cookie登入
    response=requests.post(login_url,data=login_data,headers=header,cookies=ck)
    #取得登入後的cookie,訪問個人中心
    cookie=response.cookies
    headers_blog = {"User-Agent": user_agent,"Host": "my.csdn.net",  "Connection": "keep-alive"}
    s=requests.get("https://my.csdn.net/",headers=headers_blog,cookies=cookie)
    print s.content