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的垃圾回收机制深入分析
Jul 16 Python
Python入门篇之函数
Oct 20 Python
使用beaker让Facebook的Bottle框架支持session功能
Apr 23 Python
Python实现字典去除重复的方法示例
Jul 31 Python
Python实现在某个数组中查找一个值的算法示例
Jun 27 Python
对python 匹配字符串开头和结尾的方法详解
Oct 27 Python
python pytest进阶之conftest.py详解
Jun 27 Python
python读写Excel表格的实例代码(简单实用)
Dec 19 Python
在Django中自定义filter并在template中的使用详解
May 19 Python
python如何支持并发方法详解
Jul 25 Python
python爬虫请求头设置代码
Jul 28 Python
Python3+SQLAlchemy+Sqlite3实现ORM教程
Feb 16 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
PHP5中虚函数的实现方法分享
2011/04/20 PHP
php gzip压缩输出的实现方法
2013/04/27 PHP
在PHP中使用FastCGI解析漏洞及修复方案
2015/11/10 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
TP5框架实现签到功能的方法分析
2020/04/05 PHP
javascript 数组的方法集合
2008/06/05 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
Flex通过JS获取客户端IP和计算机名的实例代码
2013/11/21 Javascript
jQuery拖拽div实现思路
2014/02/19 Javascript
一个JavaScript去除字符串末尾的空白实例代码
2014/09/22 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
EasyUI闪屏EasyUI页面加载提示(原理+代码+效果图)
2016/02/21 Javascript
微信小程序 页面跳转和数据传递实例详解
2017/01/19 Javascript
基于Vue.js 2.0实现百度搜索框效果
2020/12/28 Javascript
JavaScript数据结构与算法之检索算法示例【二分查找法、计算重复次数】
2019/02/22 Javascript
vue实现分页栏效果
2019/06/28 Javascript
关于小程序优化的一些建议(小结)
2020/12/10 Javascript
[48:41]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python3 实现的人人影视网站自动签到
2016/06/19 Python
Win7下Python与Tensorflow-CPU版开发环境的安装与配置过程
2018/01/04 Python
python3.x实现发送邮件功能
2018/05/22 Python
python把1变成01的步骤总结
2019/02/27 Python
使用Python中的reduce()函数求积的实例
2019/06/28 Python
浅谈python之自动化运维(Paramiko)
2020/01/31 Python
乔丹诺(Giordano)酒庄德国官网:找到最好的意大利葡萄酒
2017/12/28 全球购物
埃弗顿足球俱乐部官方网上商店:Everton Direct
2018/01/13 全球购物
自我鉴定范文
2013/11/10 职场文书
车间工艺员岗位职责
2013/12/09 职场文书
打架检讨书500字
2014/01/29 职场文书
美术国培研修感言
2014/02/12 职场文书
2014五一国际劳动节活动总结范文
2014/04/14 职场文书
新闻工作者先进事迹
2014/05/26 职场文书
金融专业求职信
2014/08/05 职场文书
浅谈Redis中的RDB快照
2021/06/29 Redis
java executor包参数处理功能 
2022/02/15 Java/Android