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判断给定的字符串是否是有效日期的方法
May 13 Python
python运行其他程序的实现方法
Jul 14 Python
python用post访问restful服务接口的方法
Dec 07 Python
Python简单获取二维数组行列数的方法示例
Dec 21 Python
centos6.5安装python3.7.1之后无法使用pip的解决方案
Feb 14 Python
使用Python轻松完成垃圾分类(基于图像识别)
Jul 09 Python
微信公众号token验证失败解决方案
Jul 22 Python
Python目录和文件处理总结详解
Sep 02 Python
基于Python和PyYAML读取yaml配置文件数据
Jan 13 Python
keras之权重初始化方式
May 21 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
使用pytorch实现论文中的unet网络
Jun 24 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 XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
2017/06/22 PHP
实例讲解PHP页面静态化
2018/02/05 PHP
PHP实现一个轻量级容器的方法
2019/01/28 PHP
tp5 实现列表数据根据状态排序
2019/10/18 PHP
导入extjs、jquery 文件时$使用冲突问题解决方法
2014/01/14 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
jquery使用jxl插件导出excel示例
2014/04/14 Javascript
js实现iGoogleDivDrag模块拖动层拖动特效的方法
2015/03/04 Javascript
关于Iframe父页面与子页面之间的相互调用
2016/11/22 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
JS Input里添加小图标的两种方法
2017/11/11 Javascript
基于node.js实现微信支付退款功能
2017/12/19 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
简单了解Ajax表单序列化的实现方法
2019/06/14 Javascript
Vue配置marked链接添加target="_blank"的方法
2019/07/19 Javascript
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
python简单实现操作Mysql数据库
2018/01/29 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
在scrapy中使用phantomJS实现异步爬取的方法
2018/12/17 Python
python之线程通过信号pyqtSignal刷新ui的方法
2019/01/11 Python
python根据txt文本批量创建文件夹
2020/12/08 Python
Python基于pygame实现单机版五子棋对战
2019/12/26 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
浅谈JupyterNotebook导出pdf解决中文的问题
2020/04/22 Python
PyTorch 导数应用的使用教程
2020/08/31 Python
公司财务流程之主管工作流程
2014/03/03 职场文书
报关员个人职业生涯规划书
2014/03/12 职场文书
德育标兵事迹材料
2014/08/24 职场文书
中学生民族团结演讲稿
2014/08/27 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
2015年暑期见闻
2015/07/14 职场文书
作文之亲情600字
2019/09/23 职场文书
Python竟然能剪辑视频
2021/05/25 Python
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang