首页 > 技术文章 > 【python网络编程】使用rsa加密算法模块模拟登录新浪微博

AmilyWilly 2016-10-08 15:47 原文

一、基础知识

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!'  

推荐阅读