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中的wxPython实现最基本的浏览器功能
Apr 14 Python
Python读取键盘输入的2种方法
Jun 16 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
Python之Scrapy爬虫框架安装及使用详解
Nov 16 Python
使用Python读取大文件的方法
Feb 11 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
详解flask入门模板引擎
Jul 18 Python
Python将列表数据写入文件(txt, csv,excel)
Apr 03 Python
python创建属于自己的单词词库 便于背单词
Jul 30 Python
Pytorch之卷积层的使用详解
Dec 31 Python
Python函数默认参数常见问题及解决方案
Mar 26 Python
pytorch中的torch.nn.Conv2d()函数图文详解
Feb 28 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的call_user_func传reference引发的思考
2010/07/23 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
Laravel使用支付宝进行支付的示例代码
2017/08/16 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
用JTrackBar实现的模拟苹果风格的滚动条
2007/08/06 Javascript
js 通用javascript函数库整理
2011/08/14 Javascript
JavaScript window.document的属性、方法和事件小结
2012/10/24 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
javascript生成随机数的方法
2014/05/16 Javascript
javascript的理解及经典案例分析
2016/05/20 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
用v-html解决Vue.js渲染中html标签不被解析的问题
2016/12/14 Javascript
基于jQuery实现的打字机效果
2017/01/16 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
微信小程序商城项目之侧栏分类效果(1)
2017/04/17 Javascript
详解vue.js 开发环境搭建最简单攻略
2017/06/12 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
[52:31]VP vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
[01:07:46]完美世界DOTA2联赛循环赛 Magma vs IO BO2第二场 11.01
2020/11/02 DOTA
Python实现ssh批量登录并执行命令
2016/10/25 Python
python paramiko模块学习分享
2017/08/23 Python
python获取程序执行文件路径的方法(推荐)
2018/04/26 Python
Python列表与元组的异同详解
2019/07/02 Python
详解Django admin高级用法
2019/11/06 Python
Python完全识别验证码自动登录实例详解
2019/11/24 Python
python实现贪吃蛇游戏源码
2020/03/21 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
Python 实现集合Set的示例
2020/12/21 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
荷兰美妆护肤品海淘网站:Beautinow(中文)
2020/11/22 全球购物
元宵节主持词
2014/03/25 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
2015年社区统计工作总结
2015/04/21 职场文书
敬老院活动感想
2015/08/07 职场文书
php双向队列实例讲解
2021/11/17 PHP
pycharm无法安装cv2模块问题
2022/05/20 Python