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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python网络编程使用rsa加密算法模块模拟登录新浪微博相关的知识,希望对你有一定的参考价值。

一、基础知识

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

 

二、模拟登录

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

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

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

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

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

 

[python] view plain copy
 
  1. #! /usr/bin/env python  
  2. #coding=utf8  
  3.      
  4. import urllib  
  5. import urllib2  
  6. import cookielib  
  7. import base64  
  8. import re  
  9. import json  
  10. import hashlib  
  11. import rsa  
  12. import binascii  
  13.   
  14. cj = cookielib.LWPCookieJar()  
  15. cookie_support = urllib2.HTTPCookieProcessor(cj)  
  16. opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)  
  17. urllib2.install_opener(opener)  
  18. postdata = {  
  19.      ‘entry‘: ‘weibo‘,  
  20.      ‘gateway‘: ‘1‘,  
  21.      ‘from‘: ‘‘,  
  22.      ‘savestate‘: ‘7‘,  
  23.      ‘userticket‘: ‘1‘,  
  24.      ‘ssosimplelogin‘: ‘1‘,  
  25.      ‘vsnf‘: ‘1‘,  
  26.       ‘vsnval‘: ‘‘,  
  27.       ‘su‘: ‘‘,  
  28.       ‘service‘: ‘miniblog‘,  
  29.       ‘servertime‘: ‘‘,  
  30.       ‘nonce‘: ‘‘,  
  31.       ‘pwencode‘: ‘rsa2‘, #加密算法  
  32.       ‘sp‘: ‘‘,  
  33.       ‘encoding‘: ‘UTF-8‘,  
  34.       ‘prelt‘: ‘401‘,  
  35.       ‘rsakv‘: ‘‘,  
  36.       ‘url‘: ‘http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack‘,  
  37.       ‘returntype‘: ‘META‘  
  38. }  
  39.     
  40. class WeiboLogin:  
  41.      def __init__(self, username, password):  
  42.           self.username = username  
  43.           self.password = password  
  44.         
  45.      def __get_spwd(self):  
  46.           rsaPublickey = int(self.pubkey, 16)  
  47.           key = rsa.PublicKey(rsaPublickey, 65537) #创建公钥  
  48.           message = self.servertime + ‘\t‘ + self.nonce + ‘\n‘ + self.password #拼接明文js加密文件中得到  
  49.           passwd = rsa.encrypt(message, key) #加密  
  50.           passwd = binascii.b2a_hex(passwd) #将加密信息转换为16进制。  
  51.           return passwd  
  52.     
  53.      def __get_suser(self):  
  54.          username_ = urllib.quote(self.username)  
  55.          username = base64.encodestring(username_)[:-1]  
  56.          return username  
  57.       
  58.      def __prelogin(self):  
  59.           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  
  60.           response = urllib2.urlopen(prelogin_url)  
  61.           p = re.compile(r(.?)‘)  
  62.           strurl = p.search(response.read()).group(1)  
  63.           dic = dict(eval(strurl)) #json格式的response  
  64.           self.pubkey = str(dic.get(‘pubkey‘))  
  65.           self.servertime = str(dic.get(‘servertime‘))  
  66.           self.nonce = str(dic.get(‘nonce‘))  
  67.           self.rsakv = str(dic.get(‘rsakv‘))  
  68.   
  69.      def login(self):  
  70.           url = ‘http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.18)‘  
  71.           try:  
  72.               self.__prelogin() #预登录  
  73.           except:  
  74.               print ‘Prelogin Error‘  
  75.               return  
  76.           global postdata  
  77.           postdata[‘servertime‘] = self.servertime  
  78.           postdata[‘nonce‘] = self.nonce  
  79.           postdata[‘su‘] = self.__get_suser()  
  80.           postdata[‘sp‘] = self.__get_spwd()  
  81.           postdata[‘rsakv‘] = self.rsakv  
  82.           postdata = urllib.urlencode(postdata)  
  83.           headers = {‘User-Agent‘:‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:37.0) Gecko/20100101 Firefox/37.0‘} #伪装成浏览器  
  84.           req  = urllib2.Request(  
  85.               url = url,  
  86.               data = postdata,  
  87.               headers = headers  
  88.           )  
  89.           result = urllib2.urlopen(req)  
  90.           text = result.read()  
  91.           p = re.compile(‘location\.replace\‘(.?)\‘‘)  
  92.           try:  
  93.               login_url = p.search(text).group(1)  
  94.               urllib2.urlopen(login_url)  
  95.               print "Login Succeed!"  
  96.           except:  
  97.               print ‘Login Error!‘  

以上是关于python网络编程使用rsa加密算法模块模拟登录新浪微博的主要内容,如果未能解决你的问题,请参考以下文章

python RSA加密解密及模拟登录cnblog

python实现网页登录时的rsa加密流程

Python使用rsa模块实现非对称加密与解密

我的Android进阶之旅------>Android采用AES+RSA的加密机制对http请求进行加密

Jmeter_前端RSA加密下的登陆模拟_引用js文件实现

登录页面之RSA加密