Python使用Socket(Https)Post登录百度的实现代码


Posted in Python onMay 18, 2012

登录百度,首先当然是先抓百度的登录包 ,由于是网页登录,最方便的自然是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 
P3P: CP=" OTI DSP COR IVA OUR IND COM " 
Date: Mon, 19 Dec 2011 17:18:17 GMT 
Server: Apache 
P3P: CP=" OTI DSP COR IVA OUR IND COM " 
P3P: CP=" OTI DSP COR IVA OUR IND COM " 
P3P: CP=" OTI DSP COR IVA OUR IND COM " 
Set-Cookie: BAIDUID=26FD0CB5389BF4699C447982D8080239:FG=1; expires=Wed, 11-Dec-41 17:18:17 GMT; max-age=946080000; path=/; domain=.baidu.com; version=1 
Set-Cookie: BAIDUID=26FD0CB5389BF4698191E4134CACEA29:FG=1; expires=Wed, 11-Dec-41 17:18:17 GMT; max-age=946080000; path=/; domain=.baidu.com; version=1 
Set-Cookie: BDUSS=dTajkzWTFWR3hXT3Jsc09LdkNsZ011YlZka340VWtqNkZzbW0tUTdOUFp-aFpQQVFBQUFBJCQAAAAAAAAAAAouTSCLkioVaXRpYW5kYXRlc3QxAAAAAAAAAAAAAAAAAAAAAAAAAADgmoV5AAAAAOCahXkAAAAAuWZCAAAAAAAxMC42NS40NNlx707Zce9OWT; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=.baidu.com 
Set-Cookie: PTOKEN=16ba4a120f070f3cc759a817981c2516; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=passport.baidu.com; HttpOnly 
Set-Cookie: STOKEN=fda94395cd4ae4661cefd3a4017a8454; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=passport.baidu.com 
Set-Cookie: USERID=626167789a799e630e60fb27466fa80e; expires=Tue, 01 Jan 2030 00:00:00 GMT; path=/; domain=.baidu.com 
Content-Type: text/html;charset=gbk 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Encoding: none 
Content-Length: 850 
Connection: close

OK,登陆成功。
本文来自: itianda's blog
Python 相关文章推荐
编写Python脚本批量下载DesktopNexus壁纸的教程
May 06 Python
python编码总结(编码类型、格式、转码)
Jul 01 Python
Python使用正则表达式过滤或替换HTML标签的方法详解
Sep 25 Python
Python pymongo模块用法示例
Mar 31 Python
wx.CheckBox创建复选框控件并响应鼠标点击事件
Apr 25 Python
关于python pycharm中输出的内容不全的解决办法
Jan 10 Python
完美解决pycharm导入自己写的py文件爆红问题
Feb 12 Python
Python正则表达式学习小例子
Mar 03 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
pytorch中的model=model.to(device)使用说明
May 24 Python
分享7个 Python 实战项目练习
Mar 03 Python
写了个监控nginx进程的Python脚本
May 10 #Python
400多行Python代码实现了一个FTP服务器
May 10 #Python
使用PYTHON接收多播数据的代码
Mar 01 #Python
使用PYTHON创建XML文档
Mar 01 #Python
基于python的汉字转GBK码实现代码
Feb 19 #Python
python 装饰器功能以及函数参数使用介绍
Jan 27 #Python
Python常见文件操作的函数示例代码
Nov 15 #Python
You might like
基于Windows下Apache PHP5.3.1安装教程
2010/01/08 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
2013/06/06 PHP
从父页面读取和操作iframe中内容方法
2009/07/25 Javascript
jquery 快速回到页首的方法
2013/12/05 Javascript
js判断滚动条是否已到页面最底部或顶部实例
2014/11/20 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
jquery实现手机号码选号的方法
2015/07/31 Javascript
BOM系列第二篇之定时器requestAnimationFrame
2016/08/17 Javascript
基于原生js淡入淡出函数封装(兼容IE)
2016/10/20 Javascript
100行代码理解和分析vue2.0响应式架构
2017/03/09 Javascript
基于 Bootstrap Datetimepicker 联动
2017/08/03 Javascript
JS原型继承四步曲及原型继承图一览
2017/11/28 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
js canvas实现红包照片效果
2018/08/21 Javascript
vue单页面在微信下只能分享落地页的解决方案
2019/04/15 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
[43:26]完美世界DOTA2联赛PWL S2 Forest vs Rebirth 第二场 11.20
2020/11/23 DOTA
利用Python实现图书超期提醒
2016/08/02 Python
Python3的urllib.parse常用函数小结(urlencode,quote,quote_plus,unquote,unquote_plus等)
2016/09/18 Python
pandas string转dataframe的方法
2018/04/11 Python
Python Pillow Image Invert
2019/01/22 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
2020/01/02 Python
python词云库wordcloud的使用方法与实例详解
2020/02/17 Python
thinkphp5 路由分发原理
2021/03/18 PHP
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
基于HTML5的齿轮动画特效
2016/02/29 HTML / CSS
智能旅行箱:Horizn Studios
2018/04/30 全球购物
2014年党员公开承诺践诺书
2014/03/25 职场文书
机房搬迁方案
2014/05/01 职场文书
工作失误检讨书(3篇)
2014/10/11 职场文书
教师节班会主持词
2015/07/06 职场文书
2016教师党员学习心得体会
2016/01/21 职场文书
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL