【python网络编程】使用rsa加密算法模块模拟登录新浪微博

来源:互联网 发布:2017淘宝七天刷法 编辑:程序博客网 时间:2024/06/06 07:24

    

一、基础知识

http://blog.csdn.net/pi9nc/article/details/9734437


二、模拟登录

    因为上学期参加了一个大数据比赛,需要抓取数据,所以就想着写个爬虫抓取新浪微博的数据。

    当然抓取数据不是漫无目的的,我需要的是根据关键词来抓取相关微博。

    正好微博有一个高级搜索功能,不过要获取更多的微博,需要登录,所以这时就需要模拟登录了。

    以下代码是通过rsa加密算法模块来模拟的。需要注意的是,新浪有反爬虫的,所以我们登录的时候要伪装成浏览器。

    代码不是自己写的,所以文章类型标为转载,因为代码大同小异,所以我就不写咯,里面的一些具体代码和问题解析,我也不一一赘述了,因为模拟登录不是我的重点,下一篇我将跟大家谈一谈登录后的抓取与网页解析部分。至于登录,文章开头的链接中有详细教程,有兴趣的可以看一下。

#! /usr/bin/env python#coding=utf8   import urllibimport urllib2import cookielibimport base64import reimport jsonimport hashlibimport rsaimport binasciicj = cookielib.LWPCookieJar()cookie_support = urllib2.HTTPCookieProcessor(cj)opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)urllib2.install_opener(opener)postdata = {     'entry': 'weibo',     'gateway': '1',     'from': '',     'savestate': '7',     'userticket': '1',     'ssosimplelogin': '1',     'vsnf': '1',      'vsnval': '',      'su': '',      'service': 'miniblog',      'servertime': '',      'nonce': '',      'pwencode': 'rsa2', #加密算法      'sp': '',      'encoding': 'UTF-8',      'prelt': '401',      'rsakv': '',      'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',      'returntype': 'META'}  class WeiboLogin:     def __init__(self, username, password):          self.username = username          self.password = password           def __get_spwd(self):          rsaPublickey = int(self.pubkey, 16)          key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥          message = self.servertime + '\t' + self.nonce + '\n' + self.password #拼接明文js加密文件中得到          passwd = rsa.encrypt(message, key) #加密          passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。          return passwd       def __get_suser(self):         username_ = urllib.quote(self.username)         username = base64.encodestring(username_)[:-1]         return username         def __prelogin(self):          prelogin_url = 'http://login.sina.com.cn/sso/prelogin.php?entry=sso&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&client=ssologin.js(v1.4.4)' % self.username          response = urllib2.urlopen(prelogin_url)          p = re.compile(r'\((.*?)\)')          strurl = p.search(response.read()).group(1)          dic = dict(eval(strurl)) #json格式的response          self.pubkey = str(dic.get('pubkey'))          self.servertime = str(dic.get('servertime'))          self.nonce = str(dic.get('nonce'))          self.rsakv = str(dic.get('rsakv'))     def login(self):          url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)'          try:              self.__prelogin() #预登录          except:              print 'Prelogin Error'              return          global postdata          postdata['servertime'] = self.servertime          postdata['nonce'] = self.nonce          postdata['su'] = self.__get_suser()          postdata['sp'] = self.__get_spwd()          postdata['rsakv'] = self.rsakv          postdata = urllib.urlencode(postdata)          headers = {'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0'} #伪装成浏览器          req  = urllib2.Request(              url = url,              data = postdata,              headers = headers          )          result = urllib2.urlopen(req)          text = result.read()          p = re.compile('location\.replace\(\'(.*?)\'\)')          try:              login_url = p.search(text).group(1)              urllib2.urlopen(login_url)              print "Login Succeed!"          except:              print 'Login Error!'


0 0