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

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)

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

时间: 2024-09-27 15:18:13

python模拟新浪微博登陆功能(新浪微博爬虫)_python的相关文章

模拟登陆-python模拟twitter登陆

问题描述 python模拟twitter登陆 这是我的代码,不知道为什么一直无法成功import urllib2import urllibimport cookielibimport re class Fetcher(object): def init(selfname=Nonepwd=None): self.cj = cookielib.LWPCookieJar() #获取一个保存cookie的对象. self.cookie_processor = urllib2.HTTPCookieProc

python模拟鼠标拖动操作的方法_python

本文实例讲述了python模拟鼠标拖动操作的方法.分享给大家供大家参考.具体如下: pdf中的书签只有页码,准备把现有书签拖到一个目录中,然后添加自己页签.重复的拖动工作实在无趣,还是让程序帮我实现吧,我可以喝点水,休息一下了 1. Python代码 复制代码 代码如下: # # _*_ coding:UTF-8 _*_ __author__ = 'wp' import win32api import win32con import win32gui from ctypes import * i

新浪微博怎么登陆 新浪微博登陆方法详解

给各位新浪微博软件的使用者们来详细的解析分享一下新浪微博登陆的方法. 方法分享: 新浪微博登陆方法一.这种方法是最正统的方法之一,即在百度直接输入"新浪微博",就会出现新浪微博的官方网站登录入口.PS:第一次登录之后,保存密码,就可以在下次登录时直接进入.但要注意,不可以在公共场所这样做.   新浪微博登陆方法二.进入360网址导航(其他网址导航也可以),找到有"微博"导航入品(一般在新浪网旁边),点击就可以进入新浪微博了.前提:有过登录并保存登录密码,下同.  

网络爬虫-关于用python模拟登陆新浪微博返回内容

问题描述 关于用python模拟登陆新浪微博返回内容 第一次提交登陆信息和参数后,按照网上大神们的代码应该是在返回的内容中找到location.replace(....)提取url然后再访问,但是我post表单后得到的似乎不是登陆页面也不是正常登陆的页面 不知道这是一个什么页面...算是登陆上去了吗? 解决方案 基于python的新浪微博模拟登陆2014_新浪微博模拟登陆_python模拟新浪微博登陆---------------------- 解决方案二: 看上去是一个登录后的判断页面,要看你

python模拟登陆新浪微博,设置登录不需要验证码,代码返回验证码错误

问题描述 python模拟登陆新浪微博,设置登录不需要验证码,代码返回验证码错误 网页登陆不需要验证码 代码返回retcode=2070 验证码输入错误 求大神指点 解决方案 用fiddler调试下,看看是否带上了cookie,新浪是否传给你验证码,如果传了,必须先识别. 解决方案二: http://blog.csdn.net/ta790799213/article/details/44205351http://www.crazyant.net/796.htmlhttp://www.2cto.c

Python模拟新浪微博登录

看到一篇Python模拟新浪微博登录的文章,想熟悉一下其中实现方式,并且顺便掌握python相关知识点. 代码 下面的代码是来自上面这篇文章,并稍作修改添加了一些注释. # -*- coding: utf-8 -* import urllib2 import urllib import cookielib import lxml.html as HTML class Fetcher(object): def __init__(self, username=None, pwd=None, cook

爬虫-用python模拟登陆csdn时参数lt要如何获得?

问题描述 用python模拟登陆csdn时参数lt要如何获得? 网上看到代码是用正则表达式,可是我打印出来的网页代码里没有相关的内容,运行 代码用findall返回的也是一个空列表..请问应该在哪里得到lt参数? 解决方案 可能是js运行时动态生成. 解决方案二: 你把你登录时候的lt参数值复制下来,填充到你的程序里面试试.

python模拟登陆网站时一些随机参数是如何生成的?

问题描述 python模拟登陆网站时一些随机参数是如何生成的? 比如登陆新浪微博的时候有survertime nonce这样的随机参数,还有一些网站 会有一些不固定的一大串的参数,这些参数要如何获得?在网页的代码里可以找到生成的过程吗? 解决方案 用fiddler调试下,看看是不是服务器用301跳转加上的,或者用cookie加上的. 解决方案二: 有些是服务器返回的,有些事js运行中动态生成的.

python模拟登陆后,下载网站图片

问题描述 python模拟登陆后,下载网站图片 采用的 urllib2 cookielib 两个包 模拟Cookie及登陆网站,登陆成功后,也筛选出了图片地址,采用urllib2.urlopen打开图片,再写到本地,图片是损坏的,图片打开是花的,怎么使用urllib.urlretrieve下载图片?将urllib2 的cookie值付给urllib.urlretrieve?不然提示无权限下载?高手帮忙 解决方案 根据Need urllib.urlretrieve and urllib2.Open