Python3.5.2模拟网站登陆

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值