前言
有些登錄的接口會有驗證碼:短信驗證碼,圖形驗證碼等,這種登錄的話驗證碼參數可以從后台獲取的(或者查數據庫最直接)。
獲取不到也沒關系,可以通過添加cookie的方式繞過驗證碼。
另一篇博文 Python Selenium Cookie 繞過驗證碼實現登錄 介紹了另外一種處理方式,及實際項目應用實戰,有興趣的同學可以點擊查看。
一、抓登錄cookie
1.登錄后會生成一個已登錄狀態的cookie,那么只需要直接把這個值添加到cookies里面就可以了。
2.可以先手動登錄一次,然后抓取這個cookie,這里就需要用抓包工具fiddler了
3.先打開博客園登錄界面,手動輸入賬號和密碼(勾選下次自動登錄)
4.打開fiddler抓包工具,刷新下登錄首頁,就是登錄前的cookie了
5.登錄成功后,再查看cookie變化,發現多了兩組參數,多的這兩組參數就是我們想要的,copy出來,一會有用
代碼實例:
# baseinfo -> __init__ #-*-coding:utf-8-*- # Time:2017/9/23 17:44 # Author:YangYangJun loginUrl = "https://passport.cnblogs.com/user/signin" loginHeaders = { "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.79 Safari/537.36" } CNBlogsCookie = '通過抓包工具獲取該Cookie' CnblogsAspNetCoreCookies = '通過抓包工具獲取該Cookie' editUrl = 'https://i.cnblogs.com/EditPosts.aspx?opt=1'
#-*-coding:utf-8-*- # Time:2017/9/23 10:15 # Author:YangYangJun import requests #導入配置文件 import baseinfo #登錄訪問地址 loginUrl = baseinfo.loginUrl #請求頭 loginHeaders = baseinfo.loginHeaders #登錄后Cookie1 CNBlogsCookie = baseinfo.CNBlogsCookie #登錄后Cookie2 CnblogsAspNetCoreCookies = baseinfo.CnblogsAspNetCoreCookies #新建隨筆方位地址 editUrl = baseinfo.editUrl #獲取session s = requests.session() # #r = s.get(loginUrl,headers = loginHeaders,verify = False ) #獲取cookie c = requests.cookies.RequestsCookieJar() # 添加登錄需要的兩個cookie c.set(".CNBlogsCookie",CNBlogsCookie) c.set('.Cnblogs.AspNetCore.Cookies',CnblogsAspNetCoreCookies) #更新cookie s.cookies.update(c) body = {"__VIEWSTATE": "", "__VIEWSTATEGENERATOR":"FE27D343", "Editor$Edit$txbTitle":"這是繞過登錄的標題: -*- Bluesky -*-", "Editor$Edit$EditorBody":"<p>這里是中文內容:http://www.cnblogs.com/Skyyj/</p>", "Editor$Edit$Advanced$ckbPublished":"on", "Editor$Edit$Advanced$chkDisplayHomePage":"on", "Editor$Edit$Advanced$chkComments":"on", "Editor$Edit$Advanced$chkMainSyndication":"on", "Editor$Edit$lkbDraft":"存為草稿", } r2 = s.post(editUrl, data=body, verify=False) #獲取請求返回的響應信息 print r2.content
body中的值是可以通過開發者模式查看,如下圖:
填寫標題
response的返回內容還有其它更多信息
-- r.status_code #響應狀態碼
-- r.content #字節方式的響應體,會自動為你解碼 gzip 和 deflate 壓縮
-- r.headers #以字典對象存儲服務器響應頭,但是這個字典比較特殊,字典鍵不區分大小寫,若鍵不存在則返回None
-- r.json() #Requests中內置的JSON解碼器
-- r.url # 獲取url
-- r.encoding # 編碼格式
-- r.cookies # 獲取cookie
-- r.raw #返回原始響應體
-- r.text #字符串方式的響應體,會自動根據響應頭部的字符編碼進行解碼
-- r.raise_for_status() #失敗請求(非200響應)拋出異常