Python使用Socket(Https)Post登录百度的实现代码_python

登录百度,首先当然是先抓百度的登录包 ,由于是网页登录,最方便的自然是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

时间: 2024-07-30 11:27:22

Python使用Socket(Https)Post登录百度的实现代码_python的相关文章

python cookielib 登录人人网的实现代码_python

先上脚本吧,等下来讲下知识点: 复制代码 代码如下: #!/usr/bin/env python #encoding=utf-8 import sys import re import urllib2 import urllib import cookielib class Renren(object): def __init__(self): self.name = self.pwd = self.content = self.domain = self.origURL = '' self.o

python实现带验证码网站的自动登陆实现代码_python

早听说用python做网络爬虫非常方便,正好这几天单位也有这样的需求,需要登陆XX网站下载部分文档,于是自己亲身试验了一番,效果还不错. 本例所登录的某网站需要提供用户名,密码和验证码,在此使用了python的urllib2直接登录网站并处理网站的Cookie. Cookie的工作原理: Cookie由服务端生成,然后发送给浏览器,浏览器会将Cookie保存在某个目录下的文本文件中.在下次请求同一网站时,会发送该Cookie给服务器,这样服务器就知道该用户是否合法以及是否需要重新登录. Pyth

Python遍历文件夹和读写文件的实现代码_python

需 求 分 析 1.读取指定目录下的所有文件 2.读取指定文件,输出文件内容 3.创建一个文件并保存到指定目录 实 现 过 程 Python写代码简洁高效,实现以上功能仅用了40行左右的代码~ 昨天用Java写了一个写入.创建.复制.重命名文件要将近60行代码: 不过简洁的代价是牺牲了一点点运行速度,但随着硬件性能的提升,运行速度的差异会越来越小,直到人类无法察觉~ #-*- coding: UTF-8 -*- ''' 1.读取指定目录下的所有文件 2.读取指定文件,输出文件内容 3.创建一个文

Python实现自动添加脚本头信息的示例代码_python

前言 每个人写脚本时的格式都会有所不同,有的会注明脚本本身的一些信息,有的则开门见山,这在小团队里其实没什么,基本别人做什么你也都知道,但如果放到大的团队就比较麻烦了,因为随着人数的增多,脚本成指数增长,如果每个人风格不统一,到最后就会造成非常大的弊端,所以当团队人数增长后,就必须有一套标准,形成大家统一的编码规则,这样即使不看脚本具体实现,也知道这个脚本的功能是什么. 我们今天分享的一段脚本是自动添加注释信息的脚本,添加的信息包括脚本名称.作者.时间.描述.脚本用法.语言版本.备注等,下面来看

通过python下载FTP上的文件夹的实现代码_python

复制代码 代码如下: # -*- encoding: utf8 -*-import osimport sysimport ftplibclass FTPSync(object):    def __init__(self):        self.conn = ftplib.FTP('10.22.33.46', 'user', 'pass')        self.conn.cwd('/')        # 远端FTP目录        os.chdir('/data/')       

python client使用http post 到server端的代码_python

复制代码 代码如下: import urllib, httplib  import utils  import json        class User:          def __init__(self):              print 'a'          def login(self, imsi, ua):              print "==============user start login=================="        

python抓取京东商城手机列表url实例代码_python

复制代码 代码如下: #-*- coding: UTF-8 -*-'''Created on 2013-12-5 @author: good-temper''' import urllib2import bs4import time def getPage(urlStr):    '''                获取页面内容    '''    content = urllib2.urlopen(urlStr).read()    return content def getNextPag

python使用xmlrpclib模块实现对百度google的ping功

  本文实例讲述了python使用xmlrpclib模块实现对百度google的ping功能.分享给大家供大家参考.具体分析如下: 最近在做SEO的时候,为了让发的外链能够快速的收录,想到了利用ping的功能,google和百度都有相关的ping介绍,有兴趣的朋友可以去看看相关的知识.实现ping功能除了可以用一些开源的博客程序,比如WP,它是可以在后台设置ping地址的,只要设置好以后,你发帖子,就会自动的通知搜索引擎,我的博客已经更新了,而今天我用的方法是不通过WP等带有ping功能的博客,

python raw socket构造packet后能send,但是recv不了?

问题描述 python raw socket构造packet后能send,但是recv不了? s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW) # IP Header ipobj = IP(src_host, dst_host) iph = ipobj.pack() # TCP Header tcpobj = TCP(1234, 80) tcpobj.data_length = len(data) # U