登錄百度,首先當然是先抓百度的登錄包 ,由于是網頁登錄,最方便的自然是httpwatch了,我使用的測試賬號是itiandatest1,密碼是itianda,抓包結果:
代碼如下:
POST /?login HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: https://passport.baidu.com/?login&tpl=mn
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Alexa Toolbar; BOIE9;ZHCN)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: passport.baidu.com
Content-Length: 243
Connection: Keep-Alive
Cache-Control: no-cache
登錄包抓到了,下面開始寫代碼:
代碼如下:
import socket
import ssl
sock = ssl.wrap_socket(socket.socket())
ssl是專門用來處理https的模塊,我們使用該模塊的wrap_socket函數生成一個SSLSocket對象。
然后建立連接:
代碼如下:
sock.connect(('passport.baidu.com', 443))
這里需要注意的是https使用443端口,不是80。
之后發送數據:
代碼如下:
data = '''/
POST /?login HTTP/1.1
Accept: image/jpeg, application/x-ms-application, image/gif, application/xaml+xml, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: https://passport.baidu.com/?login&tpl=mn
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Alexa Toolbar; BOIE9;ZHCN)
Content-Type: application/x-www-form-urlencoded
Host: passport.baidu.com
Content-Length: 243
Connection: Keep-Alive
Cache-Control: no-cache
tpl_ok=&next_target=&tpl=mn&skip_ok=&aid=&need_pay=&need_coin=&pay_method=&u=http%3A%2F%2Fwww.baidu.com%2F&return_method=get&more_param=&return_type=&psp_tt=0&password=itianda&safeflg=0&isphone=tpl&username=itiandatest1&verifycode=&mem_pass=on/
'''
sock.sendall(data)
需要注意的是sendall之后不能調用shutdown方法。
其余部分就和普通的socket處理方式沒什么差別了 :
代碼如下:
recv_data = sock.recv(8192)
sock.close()
print recv_data
由于我們只需要cookie信息,所以只接收少量數據就可以了。
登錄成功的標志是服務器返回含有BDUSS的set-cookie:
代碼如下:
HTTP/1.1 200 OK
Set-Cookie: BAIDUID=DB464E1EBA6571FB82D70460D6AAB666:FG=1; max-age=946080000; expires=Wed, 11-Dec-41 17:18:17 GMT; domain=.baidu.com; path=/; version=1
新聞熱點
疑難解答