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获取当前日期和时间的方法
Apr 30 Python
Python连接SQLServer2000的方法详解
Apr 19 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
PyQt5每天必学之拖放事件
Aug 27 Python
Python走楼梯问题解决方法示例
Jul 25 Python
Python中实现单例模式的n种方式和原理
Nov 14 Python
深入了解和应用Python 装饰器 @decorator
Apr 02 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
Python模块相关知识点小结
Mar 09 Python
python 画图 图例自由定义方式
Apr 17 Python
Python pandas如何向excel添加数据
May 22 Python
matplotlib画混淆矩阵与正确率曲线的实例代码
Jun 01 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
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
Fedora下安装php Redis扩展笔记
2014/09/03 PHP
ThinkPHP中自定义错误页面和提示页面实例
2014/11/22 PHP
2款PHP无限级分类实例代码
2015/11/11 PHP
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
纯Javascript实现Windows 8 Metro风格实现
2013/10/15 Javascript
Javascript四舍五入Math.round()与Math.pow()使用介绍
2013/12/27 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
JavaScript+CSS实现仿Mootools竖排弹性动画菜单效果
2015/10/14 Javascript
jQuery插件echarts实现的循环生成图效果示例【附demo源码下载】
2017/03/04 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
js canvas实现适用于移动端的百分比仪表盘dashboard
2017/07/18 Javascript
JavaScript实现随机数生成器(去重)
2017/10/13 Javascript
vue filters的使用详解
2018/06/11 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
react-navigation之动态修改title的内容
2018/09/26 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
[02:17]2016完美“圣”典风云人物:Sccc专访
2016/12/03 DOTA
在Heroku云平台上部署Python的Django框架的教程
2015/04/20 Python
关于Python的一些学习总结
2018/05/25 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
python实现定时压缩指定文件夹发送邮件
2020/12/22 Python
python+excel接口自动化获取token并作为请求参数进行传参操作
2020/11/10 Python
详解通过focusout事件解决IOS键盘收起时界面不归位的问题
2019/07/18 HTML / CSS
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
推荐信格式要求
2014/05/09 职场文书
自查自纠整改报告
2014/11/06 职场文书
2015元旦晚会主持词(开场白+结束语)
2014/12/14 职场文书
教育实习指导教师评语
2014/12/31 职场文书
行政文员岗位职责
2015/02/04 职场文书
建议书范文
2015/02/05 职场文书
师德培训心得体会2016
2016/01/09 职场文书
2019大学生暑期实习心得总结
2019/08/21 职场文书
浅谈Python魔法方法
2021/06/28 Java/Android