python模拟新浪微博登陆功能(新浪微博爬虫)


Posted in Python onDecember 24, 2013

1、主函数(WeiboMain.py):

import urllib2
import cookielib
import WeiboEncode
import WeiboSearch
if __name__ == '__main__':
    weiboLogin = WeiboLogin('×××@gmail.com', '××××')#邮箱(账号)、密码
    if weiboLogin.Login() == True:
        print "登陆成功!"

前两个import是加载Python的网络编程模块,后面的import是加载另两个文件WeiboEncode.py和Weiboseach.py(稍后介绍)。主函数新建登陆对象,然后登陆。

2、WeiboLogin类(WeiboMain.py):

class WeiboLogin:
    def __init__(self, user, pwd, enableProxy = False):
        "初始化WeiboLogin,enableProxy表示是否使用代理服务器,默认关闭"
        print "Initializing WeiboLogin..."
        self.userName = user
        self.passWord = pwd
        self.enableProxy = enableProxy
        self.serverUrl = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.11)&_=1379834957683"
        self.loginUrl = "http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)"
        self.postHeader = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0'}

初始化函数,定义了两个关键的url成员:self.serverUrl用于登陆的第一步(获取servertime、nonce等),这里的第一步实质包含了解析新浪微博的登录过程的1和2;self.loginUrl用于第二步(加密用户和密码后,POST给该URL,self.postHeader是POST的头信息),这一步对应于解析新浪微博的登录过程的3。类内函数还有3个:

def Login(self):
        "登陆程序"  
        self.EnableCookie(self.enableProxy)#cookie或代理服务器配置        serverTime, nonce, pubkey, rsakv = self.GetServerTime()#登陆的第一步
        postData = WeiboEncode.PostEncode(self.userName, self.passWord, serverTime, nonce, pubkey, rsakv)#加密用户和密码
        print "Post data length:\n", len(postData)

        req = urllib2.Request(self.loginUrl, postData, self.postHeader)
        print "Posting request..."
        result = urllib2.urlopen(req)#登陆的第二步——解析新浪微博的登录过程中3
        text = result.read()
        try:
            loginUrl = WeiboSearch.sRedirectData(text)#解析重定位结果
              urllib2.urlopen(loginUrl)
        except:
            print 'Login error!'
            return False
        print 'Login sucess!'
        return True

self.EnableCookie用于设置cookie及代理服务器,网络上有很多免费的代理服务器,为防止新浪封IP,可以使用。然后使登陆的第一步,访问新浪服务器得到serverTime等信息,然后利用这些信息加密用户名和密码,构建POST请求;执行第二步,向self.loginUrl发送用户和密码,得到重定位信息后,解析得到最终跳转到的URL,打开该URL后,服务器自动将用户登陆信息写入cookie,登陆成功。

def EnableCookie(self, enableProxy):
    "Enable cookie & proxy (if needed)."    cookiejar = cookielib.LWPCookieJar()#建立cookie
    cookie_support = urllib2.HTTPCookieProcessor(cookiejar)

    if enableProxy:
        proxy_support = urllib2.ProxyHandler({'http':'http://xxxxx.pac'})#使用代理
         opener = urllib2.build_opener(proxy_support, cookie_support, urllib2.HTTPHandler)
        print "Proxy enabled"
    else:
        opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
    urllib2.install_opener(opener)#构建cookie对应的opener

EnableCookie函数比较简单

def GetServerTime(self):
    "Get server time and nonce, which are used to encode the password"    print "Getting server time and nonce..."
    serverData = urllib2.urlopen(self.serverUrl).read()#得到网页内容
     print serverData

    try:
        serverTime, nonce, pubkey, rsakv = WeiboSearch.sServerData(serverData)#解析得到serverTime,nonce等
         return serverTime, nonce, pubkey, rsakv
    except:
        print 'Get server time & nonce error!'
        return None

WeiboSearch文件中的函数主要用于解析从服务器得到的数据,比较简单。

3、sServerData函数(WeiboSearch.py):

import re
import json
def sServerData(serverData):
    "Search the server time & nonce from server data"
    p = re.compile('\((.*)\)')
    jsonData = p.search(serverData).group(1)
    data = json.loads(jsonData)
    serverTime = str(data['servertime'])
    nonce = data['nonce']
    pubkey = data['pubkey']#
    rsakv = data['rsakv']#
    print "Server time is:", serverTime
    print "Nonce is:", nonce
    return serverTime, nonce, pubkey, rsakv

解析过程主要使用了正则表达式和JSON,这部分比较容易理解。另外Login中解析重定位结果部分函数也在这个文件中如下:

def sRedirectData(text):
    p = re.compile('location\.replace\([\'"](.*?)[\'"]\)')
    loginUrl = p.search(text).group(1)
    print 'loginUrl:',loginUrl
    return loginUrl

4、从第一步到第二步要对用户和密码进行加密,编码操作(WeiboEncode.py)

import urllib
import base64
import rsa
import binascii
def PostEncode(userName, passWord, serverTime, nonce, pubkey, rsakv):
    "Used to generate POST data"
    encodedUserName = GetUserName(userName)#用户名使用base64加密
     encodedPassWord = get_pwd(passWord, serverTime, nonce, pubkey)#目前密码采用rsa加密
     postPara = {
        'entry': 'weibo',
        'gateway': '1',
        'from': '',
        'savestate': '7',
        'userticket': '1',
        'ssosimplelogin': '1',
        'vsnf': '1',
        'vsnval': '',
        'su': encodedUserName,
        'service': 'miniblog',
        'servertime': serverTime,
        'nonce': nonce,
        'pwencode': 'rsa2',
        'sp': encodedPassWord,
        'encoding': 'UTF-8',
        'prelt': '115',
        'rsakv': rsakv,     
        'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
        'returntype': 'META'
    }
    postData = urllib.urlencode(postPara)#网络编码
    return postData

PostEncode函数构建POST的消息体,要求构建得到内容与真正登陆所需的信息相同。难点在用户名和密码的加密方式:

def GetUserName(userName):
    "Used to encode user name"    userNameTemp = urllib.quote(userName)
    userNameEncoded = base64.encodestring(userNameTemp)[:-1]
    return userNameEncoded


def get_pwd(password, servertime, nonce, pubkey):
    rsaPublickey = int(pubkey, 16)
    key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥
    message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
    passwd = rsa.encrypt(message, key) #加密
    passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。
    return passwd

新浪登录过程,密码的加密方式原来是SHA1,现在变为了RSA,以后可能还会变化,但是各种加密算法在Python中都有对应的实现,只要发现它的加密方式(),程序比较易于实现。

到这里,Python模拟登陆新浪微博就成功了,运行输出:

loginUrl: http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1390390056&ticket=ST-MzQ4NzQ5NTYyMA==-1387798056-xd-284624BFC19FE242BBAE2C39FB3A8CA8&retcode=0
Login sucess!

果需要爬取微博中的信息,接下来只需要在Main函数后添加爬取、解析模块就可以了,比如读取某微博网页的内容:

htmlContent = urllib2.urlopen(myurl).read()#得到myurl网页的所有内容(html)

大家可以根据不同的需求设计不同的爬虫模块了,模拟登陆的代码放在这里。

Python 相关文章推荐
Python新手在作用域方面经常容易碰到的问题
Apr 03 Python
python使用线程封装的一个简单定时器类实例
May 16 Python
Python3安装Pymongo详细步骤
May 26 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
python Matplotlib画图之调整字体大小的示例
Nov 20 Python
Python将list中的string批量转化成int/float的方法
Jun 26 Python
Python拼接微信好友头像大图的实现方法
Aug 01 Python
Python发送邮件测试报告操作实例详解
Dec 08 Python
python Gunicorn服务器使用方法详解
Jul 22 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
Django如何实现密码错误报错提醒
Sep 04 Python
PyQt 如何创建自定义QWidget
Mar 24 Python
python复制文件代码实现
Dec 23 #Python
python定时采集摄像头图像上传ftp服务器功能实现
Dec 23 #Python
videocapture库制作python视频高速传输程序
Dec 23 #Python
天翼开放平台免费短信验证码接口使用实例
Dec 18 #Python
python模拟登录百度贴吧(百度贴吧登录)实例
Dec 18 #Python
python抓取京东商城手机列表url实例代码
Dec 18 #Python
python获取糗百图片代码实例
Dec 18 #Python
You might like
使用HMAC-SHA1签名方法详解
2013/06/26 PHP
php 一维数组的循环遍历实现代码
2017/04/10 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
一个JavaScript函数把URL参数解析成Json对象
2014/09/24 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
getElementById().innerHTML与getElementById().value的区别
2016/10/27 Javascript
Javascript中字符串replace方法的第二个参数探究
2016/12/05 Javascript
微信小程序中子页面向父页面传值实例详解
2017/03/20 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
2017/03/23 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
JS库之Highlight.js的用法详解
2017/09/13 Javascript
angular6.0开发教程之如何安装angular6.0框架
2018/06/29 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
JavaScript如何借用构造函数继承
2019/11/06 Javascript
在vue项目实现一个ctrl+f的搜索功能
2020/02/28 Javascript
vue-cli3项目打包后自动化部署到服务器的方法
2020/09/16 Javascript
[01:09:24]Ti4开幕式
2014/07/19 DOTA
python正则表达式修复网站文章字体不统一的解决方法
2013/02/21 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
在 Python 应用中使用 MongoDB的方法
2017/01/05 Python
Python正则表达式常用函数总结
2017/06/24 Python
在Django下创建项目以及设置settings.py教程
2019/12/03 Python
Python如何输出整数
2020/06/07 Python
Canvas实现保存图片到本地的示例代码
2018/06/28 HTML / CSS
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
三星加拿大官方网上商店:Samsung CA
2020/12/18 全球购物
Oracle的内存结构(Memory structures)
2015/06/10 面试题
优秀学生干部个人的自我评价
2013/10/04 职场文书
餐饮管理自我介绍信
2014/01/15 职场文书
房地产项目建议书
2014/03/12 职场文书
小班上学期评语
2014/05/05 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
表扬通报怎么写
2015/01/16 职场文书
余世维讲座观后感
2015/06/11 职场文书
2016年记者节感言
2015/12/08 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery