Python3.5.2模拟网站登陆

来源:互联网 发布:运20和伊尔76数据对比 编辑:程序博客网 时间:2024/05/16 13:45
Python3.5.2模拟网站登陆



最近在學習 Python 的過程中, 有一個作業是使用 Python 實現模擬網站登陸, 因為以前沒有弄過, 花費了幾天的時間, 特地記下關鍵知識點, 備以后所需


工具

1) Fiddler 4.6
2) Firefox 瀏覽器
3) Python 3.5.2
4) Windows 7 (在 Linux 下也基本一樣)



步驟

1) 執行 Fiddler 獲取瀏覽器數據(按 F12 開啟 Capturing)
網上很多人使用 Firefox 自帶 Firebug 組件, 但我使用的版本抓不到 POST 的信息
如果你對 Wireshark 使用很熟悉, 也可以用 Wireshark, 能抓到的更完整的信息,但要求掌握網絡底層知識

2)使用 Firefox 瀏覽器打開要登陸的網站, 進行實際登陸, 使 Fiddle 能抓取到整個登陸的過程.
使用前最好清除瀏覽器的歷史記錄, 以便 Fiddle 能抓到最少又有用的信息

(1) Request Headers
操作類型: GET 還是 POST, URL, Client 信息, Cookies, Referer, Connection, Host 等信息


(2) WebForms



3) 使用 Python 模擬登陸

GET 請求

使用 urllib.request

#注意: url 最后要以 / 結尾, 否則報錯url = "http://www.abc.com/"              req = urllib.request.Request(url)


使用 http.client

conn = http.client.HTTPConnection("www.cjol.com", 80)
conn.request('GET', url, data, headers)

使用之前對 data, headers 賦值
data = urllib.parse.urlencode({'jsoncallback':'jQuery17202103447694222xxxx_147761832xxxx','userName':'xxxxx','password':'xxxxx','actionType':'xxxxx','_':'xxxxx'})header = {"Accept":"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01","Accept-Encoding":"gzip, deflate","Accept-Language":"zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3","User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0","X-Requested-With":"XMLHttpRequest","Cookie":"Hm_lpvt_36534f4826de8bde820fa4722f1fa7e8=1477618344; Hm_lvt_36534f4826de8bde820fa4722f1fa7e8=1477558656,1477618344; isFirstLoad=1","Referer":"http://www.cjol.com/","Connection":"keep-alive","host":"www.cjol.com"}


POST 請求

使用 urllib.request

url = "http://www.abc.com/"data = urllib.parse.urlencode({"key1":"value1","key2":"value2"}).encode('utf-8')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","User-Agent":"Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0"}req = urllib.request.Request(url, data, header)

從代碼可以看出來, 相對于 GET 操作, urllib.request.Request 增加了data 和 header 參數,
實際上, 只要增加了 data 參數, 系統就會當成 POST 操作
如果需要執行帶提交 header 的 GET操作建議使用以下方式,
url = "http://www.abc.com/"req = urllib.request.Request(url)req.add_header("Accept", "*/*")req.add_header("Accept-Encoding", "gzip, deflate")urllib.request.urlopen(req)

如果需要執行 帶提交 data 和 header 的 GET 操作, 建議使用 http.client


使用 http.client
conn = http.client.HTTPConnection(url1, 80)
conn.request('POST', '/', data, header)


讀取返回頁面

使用 urllib.request
response = urllib.reqest.urlopen(req) 

使用 http.client
response = conn.getresponse()


讀取返回 header
get_header = response.getheader('Set-Cookie')


將頁面保存到文件
get_page = response.read()fp = open('d:\\get_page.txt', 'wb')fp.write(get_page)fp.close()


使用以上方法進行驗證, 常用的幾個內外部網站都可以實現登陸, 再訪問登陸后的功能, 
比如刷新簡歷和讀取任務清單 等等.
開發者如果在登陸通訊的過程中增加驗證碼, 或者寫一些驗證函數, 就可以增加模擬登錄的困難.



重點記錄

一) ASP.NET 2.0 安全驗證機制, 暫時發現以下兩點
1) 第一次打開網站會在返回 Header 里包含  sessionid, 后面的操作要求把 sessionid 放在 header 里一起提交

2) 第一次打開網站會在返回頁面里包含 __VIEWSTATE 和 __EVENTVALIDATION, 
下一次操作要把這兩個參數作為 Webform data 提交
需要用到讀取網頁, 從頁面中提取 __VIEWSTATE 和 __EVENTVALIDATION 的值


二) Connection: keep-alive
這個 Headers 項, 并不是包含在 Headers 里提交就一定能夠實現 keep-alive 的
比如 urllib.request 就不能實現 keep-alive, 但 http.client 可以. 

使用 http.client 時發現 Fiddler 抓取不到數據, (網上有些文章提到模擬 Fiddler 代理 http.client 后就可以抓到包了,有時間可以試一下) 
其實沒有太多影響, 因為可以通過 response.read() 讀取返回頁面 和 getheader() 讀取返回 headers,
如果 keep-alive 失敗, 則在返回的 header 中包含 Connection: close,
如果 keep-alive 成功, 則在返回的 header 中不會包含 Connection 項, 
因此, 根據讀取返回 Header 的 Connection 值,如果為 None 則表示 keep-alive 成功.




0 0