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正则表达式中的括号匹配问题
Dec 14 Python
详解Python中的元组与逻辑运算符
Oct 13 Python
基于DataFrame筛选数据与loc的用法详解
May 18 Python
解决Python中list里的中文输出到html模板里的问题
Dec 17 Python
Python 存储字符串时节省空间的方法
Apr 23 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
PyQT5 QTableView显示绑定数据的实例详解
Jun 25 Python
python使用for...else跳出双层嵌套循环的方法实例
May 17 Python
keras小技巧——获取某一个网络层的输出方式
May 23 Python
python环境搭建和pycharm的安装配置及汉化详细教程(零基础小白版)
Aug 19 Python
为2021年的第一场雪锦上添花:用matplotlib绘制雪花和雪景
Jan 05 Python
Python连续赋值需要注意的一些问题
Jun 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
php数据库连接
2006/10/09 PHP
7个超级实用的PHP代码片段
2011/07/11 PHP
基于php socket(fsockopen)的应用实例分析
2013/06/02 PHP
ThinkPHP框架实现session跨域问题的解决方法
2014/07/01 PHP
PHP中使用file_get_contents抓取网页中文乱码问题解决方法
2014/12/17 PHP
PHP使用内置dir类实现目录遍历删除
2015/03/31 PHP
TP5框架model常见操作示例小结【增删改查、聚合、时间戳、软删除等】
2020/04/05 PHP
js 取时间差去掉周六周日实现代码
2012/12/25 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
js的延迟执行问题分析
2014/06/23 Javascript
Javascript缓存API
2016/06/14 Javascript
jQuery焦点图轮播效果实现方法
2016/12/19 Javascript
Bootstrap中datetimepicker使用小结
2016/12/28 Javascript
详解VUE的状态控制与延时加载刷新
2017/03/27 Javascript
Bootstrap响应式导航由768px变成992px的实现代码
2017/06/15 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
vuejs选中当前样式active的实例
2018/08/22 Javascript
解决vue下载后台传过来的乱码流的问题
2020/12/05 Vue.js
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
利用Python批量生成任意尺寸的图片
2016/08/29 Python
详解Numpy数组转置的三种方法T、transpose、swapaxes
2019/05/27 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Laravel框架表单验证格式化输出的方法
2019/09/25 Python
基于Python实现签到脚本过程解析
2019/10/25 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
sklearn和keras的数据切分与交叉验证的实例详解
2020/06/19 Python
CSS3实现大小不一的粒子旋转加载动画
2016/04/21 HTML / CSS
html5读取本地文件示例代码
2014/04/22 HTML / CSS
师说教学反思
2014/02/07 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
环境工程专业毕业生求职信
2014/09/30 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
2015年工会工作总结
2015/03/30 职场文书
工作收入证明范本
2015/06/12 职场文书
爱心捐款倡议书:点燃希望,传递温暖
2019/11/04 职场文书
JAVA长虹键法之建造者Builder模式实现
2022/04/10 Java/Android