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实现正则匹配检索远端FTP目录下的文件
Mar 25 Python
Python基于pygame实现图片代替鼠标移动效果
Nov 11 Python
十个Python程序员易犯的错误
Dec 15 Python
Python 3中的yield from语法详解
Jan 18 Python
利用python实现简单的循环购物车功能示例代码
Jul 05 Python
Django rest framework基本介绍与代码示例
Jan 26 Python
Python清空文件并替换内容的实例
Oct 22 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
使用python实现简单五子棋游戏
Jun 18 Python
python获取array中指定元素的示例
Nov 26 Python
python 中的命名空间,你真的了解吗?
Aug 19 Python
Python 找出英文单词列表(list)中最长单词链
Dec 14 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的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
如何判断php数组的维度
2013/06/10 PHP
基于CakePHP实现的简单博客系统实例
2015/06/28 PHP
php模板引擎技术简单实现
2016/03/15 PHP
非常经典的PHP文件上传类分享
2016/05/15 PHP
基于jQuery的ajax功能实现web service的json转化
2009/08/29 Javascript
js分解url参数(面向对象-极简主义法应用)
2012/08/09 Javascript
js获取当前页面路径示例讲解
2014/01/08 Javascript
JavaScript 作用域链解析
2014/11/13 Javascript
javascript实现简单的鼠标拖动效果实例
2015/04/10 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
Nodejs异步回调之异常处理实例分析
2018/06/22 NodeJs
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
关于layui toolbar和template的结合使用方法
2019/09/19 Javascript
通过Python实现自动填写调查问卷
2017/09/06 Python
python的文件操作方法汇总
2017/11/10 Python
python删除过期log文件操作实例解析
2018/01/31 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
python字典排序的方法
2019/10/12 Python
使用Pyhton集合set()实现成果查漏的例子
2019/11/24 Python
python对Excel按条件进行内容补充(推荐)
2019/11/24 Python
使用 Python 在京东上抢口罩的思路详解
2020/02/27 Python
Django Admin后台添加数据库视图过程解析
2020/04/01 Python
Python基于network模块制作电影人物关系图
2020/06/19 Python
Python中全局变量和局部变量的理解与区别
2021/02/07 Python
Python如何使用神经网络进行简单文本分类
2021/02/25 Python
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
斯洛伐克电子产品购物网站:DATART
2020/04/05 全球购物
社会治安综合治理管理责任书
2014/04/16 职场文书
初中英语课后反思
2014/04/25 职场文书
2014院党委领导班子对照检查材料思想汇报
2014/09/24 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
教师节简报
2015/07/20 职场文书
深入理解python协程
2021/06/15 Python
德劲DE1102数字调谐收音机机评
2022/04/07 无线电
Elasticsearch 索引操作和增删改查
2022/04/19 Python