1. 程式人生 > >python2+requests+模擬使用者登入+重定向

python2+requests+模擬使用者登入+重定向

由於公司要用到模擬使用者登入,於是用學校圖書館讀者登入來進行練習。

工具是python2 + requests第三方庫+火狐瀏覽器的firebug進行http抓包

目標 用python成功登入學校圖書館

接下來幾篇會利用urllib和urllib2標準庫進行登入

以下為具體步驟:

1 開啟學校圖書館網址,以下為登入介面

2 在firebug上可以看到登入的http請求,發現有302和200兩個狀態碼,一個是登入post,返回302,說明有重定向;之後請求重定向url,得到正確的登入。而requests庫對重定向可以正確解決。


3 看一下post請求和響應的頭部資訊,使得python程式碼模擬瀏覽器,可以在響應頭部看到伺服器發了cookie。在post引數中textBox1、2對應著讀者號和密碼。有了這兩個資訊,我們就可以寫python程式碼了


4 在GET請求中,瀏覽器會發送302響應的cookie


綜合以上分析,利用requests庫進行模擬使用者登入。這裡的post引數採用了之前圖片的原始碼形式,使得引數順序匹配

import requests

url = "http://210.32.205.60/login.aspx"
# 學校圖書館登入url
header = {"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",
"Connection":"keep-alive",
"Content-Type":"application/x-www-form-urlencoded",
"Host":"210.32.205.60",
"Referer":	"http://210.32.205.60/login.aspx",
"Upgrade-Insecure-Requests":"1",
"User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:54.0) Gecko/20100101 Firefox/54.0"
}

body = b'__VIEWSTATE=%2FwEPDwUILTE0Mjc2MjEPZBYCAgMPZBYCAg8PDxYCHgdWaXNpYmxlaGRkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYCBQxJbWFnZUJ1dHRvbjEFDEltYWdlQnV0dG9uMtIIHXEj%2BaKpKEuN3WBMS5An9yfKLqy76FI5Cs0ie1No&__VIEWSTATEGENERATOR=C2EE9ABB&__EVENTVALIDATION=%2FwEdAAbAeS%2BByzNg%2FXW9jIKItJSsl0eOxoEPS0IDqf0EHRx3vxEghZBVv0boc2NaC2%2FzVFQdp1z%2BnYWZ%2BpirZkxjR3dz6ZACrx5RZnllKSerU%2BIuKmLNV%2B2mZgnOAlNG5DVTg1uHvSo3x4u7p65TqmriJkDgirf2cB43UeZMqMyeVeS88Q%3D%3D&DropDownList1=0&TextBox1=讀者號&TextBox2=密碼&ImageButton1.x=44&ImageButton1.y=12'



r = requests.post(url, data=body, headers=header)

print r.text

以上為一次提交,沒有進行重定向擷取。

如果想用reque庫擷取重定向,在這個圖書館登入中則需要進行兩次操作,這裡相當於只做了post請求,頭部,post引數都不變,只不過在requests.post()內設定了引數

r = requests.post(url, data=body, headers=header, allow_redirects=False)  
# 設定 allow_redirects=False 使得禁止重定向
aspid = r.headers["Set-Cookie"]  # 返回頁面的頭部的cookie
print r.status_code  # 輸出302

如果再想登陸圖書館頁面,那麼需要將cookie重新加入新的url上,進行get請求的提交,此時url為/Default.aspx.
url ="http://210.32.205.60/Default.aspx"
header = {
"Accept": "image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, */*",
"Referer": "http://210.32.205.60/login.aspx",
"Accept-Language": "zh-CN",
"User-Agent": "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0)",
"Accept-Encoding": "gzip, deflate",
"Host": "210.32.205.60",
"Connection": "Keep-Alive",
"Pragma": "no-cache",
"Cookie": aspid
}
r = requests.get(url=url,headers=header)
print r.status_code
print r.text

接下來的幾篇是利用python2的urllib2和urllib進行相同的模擬使用者登入。

ps 由於urllib2處理重定向的時候不會將cookie帶上,會導致頁面不能正確爬取,所以要處理重定向。解決urllib重定向文章在此,分別介紹了urllib2自動處理重定向(帶上cookie),和urllib2阻止重定向,返回cookie。