最近跟同學學習爬蟲的時候看到網上有個帖子,好像是山大校園網不穩定,用py做了個模擬登陸很有趣,於是我走上了一條不歸路.....
先上一張校園網截圖
首先弄清一下模擬登陸的原理:
1:服務器判定瀏覽器登錄使用瀏覽器標識,需要模擬登陸
2: 需要post賬號,密碼,以及學校id
python走起,我用的2.7版本,用notepad++寫的,綁定python可以直接運行
由於是模擬網頁登陸,需要導入urllib urllib2 cookielib庫,前兩個有與網頁直接的接口,cookielib就是用來處理cookie的
先了解一下這幾個庫函數 一片不錯的博客
http://www.cnblogs.com/mmix2009/p/3226775.html
ok,開始構建一個opener
cookie=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
用urllib2.HTTOCookieProcessor處理CookieJar獲得的cookie,並被build_opener處理
然后構建一下需要post的header,這個地址並不是我們輸入賬號密碼的地址,而是提交數據被處理的地址,在登陸的時候用瀏覽器抓一下:
嗯 就是右邊的那個URL,我們最后提交的網址就是那個。我們看一下他的header
差不多就這些,可以都寫上,也可以只寫服務器驗證的UA等等
需要提交的數據:
data={ "username":"xxxxxxxx", "password":"xxxxx", } post_data=urllib.urlencode(data)
然后就是post了,使用Requset(url,post_data,header)
req=urllib2.Request('http://139.198.3.98/sdjd/userAction!login.action',post_data,headers) content=opener.open(req)
再open(req)放到content里,print一下試試是否成功。
然后.....然后發現失敗了找找bug.....
因為是學習的網上的,那個簡單的例子只有用戶名和密碼,而這個登陸還要選擇大學.......
好吧,那就先找下源碼,結果沒找到,就從header里找,果然在cookie里有個schoo id=XXXX,沒錯了,就是這個了,於是在data里再加上這個,結果提交了以后還是失敗。最后發現提交的data里的userName,password,school_必須和request里的名稱大小寫下划線什么的要一致:
最終代碼(賬號密碼什么的用XXXX代替了):
import urllib import urllib2 import cookielib data={ "userName":"xxxxxxxx", "password":"xxxxx", "school_id":"xxxx" } post_data=urllib.urlencode(data) cookie=cookielib.CookieJar() opener=urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie)) headers={ 'Accept': 'text/html, application/xhtml+xml, image/jxr, */*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3', 'Connection': 'Keep-Alive', 'Host': '139.198.3.98', 'Referer': 'http://139.198.3.98/sdjd/protalAction!loginInit.action?wlanuserip=10.177.31.212&basip=124.128.40.39', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393', 'X-Requested-With': 'XMLHttpRequest' } req=urllib2.Request('http://139.198.3.98/sdjd/userAction!login.action',post_data,headers) content=opener.open(req) print content.read().decode("utf-8")
運行一下:
初步success~以后在深一步研究
還有求dalao解答我從notepad++上用#注釋沒效果咋回事......
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
學習了requests庫 果然好用。。。貼一下代碼
import requests se=requests.Session() url='http://139.198.3.98/sdjd/userAction!login.action' data={ "userName":"xxxxxxxx", "password":"xxxxx", "school_id":"xxxx" } headers={ 'Accept': 'text/html, application/xhtml+xml, image/jxr, */*', 'Accept-Encoding': 'gzip, deflate', 'Accept-Language': 'en-US, en; q=0.8, zh-Hans-CN; q=0.5, zh-Hans; q=0.3', 'Connection': 'Keep-Alive', 'Host': '139.198.3.98', 'Referer': 'http://139.198.3.98/sdjd/protalAction!loginrInit.action?wlanuserip=10.177.31.212&basip=124.128.40.39', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.79 Safari/537.36 Edge/14.14393', 'X-Requested-With': 'XMLHttpRequest' } content=se.post(url,data=data,headers=headers) print content.text
// 之前#沒用是沒保存成py格式直接運行了......