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

一、基础知识

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

二、模拟登录

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

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

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

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

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

[python] view plain copy

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

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

Python 网络编程

Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket()函数 Pyt

python 网络编程 (二)---tcp

异常 python的socket模块实际上定义了4种可能出现的异常: 1)与一般I/O 和通信问题有关的socket.error; 2)与查询地址信息有关的socket.gaierror; 3)与其他地址错误有关的socket.herror; 4)与在一个socket上调用settimeout()后,处理超时有关的socket.timeout; import socket, sys, time host = sys.argv[1] textport = sys.argv[2] filename

[python] 网络编程之套接字Socket、TCP和UDP通信实例

很早以前研究过C#和C++的网络通信,参考我的文章: C#网络编程之Tcp实现客户端和服务器聊天 C#网络编程之套接字编程基础知识 C#网络编程之使用Socket类Send.Receive方法的同步通讯 Python网络编程也类似.同时最近找工作笔试面试考察Socket套接字.TCP\UDP区别比较多,所以这篇文章主要精简了<Python核心编程(第二版)>第16章内容.内容包括:服务器和客户端架构.套接字Socket.TCP\UDP通信实例和常见笔试考题. 最后希望文章对你有所帮助,如果有不

Python 网络编程(一)

Python 网络编程 socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者. socket和file的区别: file模块是针对某个指定文件进行[打开][读写][关闭] socket模块是针对 服务器端 和 客户端Socket 进行[打开][读写][关闭] socket服务端和客户端的网

Python 网络编程(二)

Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单的仿ssh的socket程序,实现的功能为客户端发送命令,服务端接收到客户端的命令,然后在服务器上通过subrocess模块执行命令,如果命令执行有误,输出内容为空,则返回"command error"的语句给客户端,否则将命令执行的结果返回给客户端 服务端 1 2 3 4 5 6 7 8

Python网络编程实战之一个人开发环境搭建

本节介绍在Debian下利用Python进行网络编程时,需要安装的一些实用的工具包. 0x01  安装开发必备软件包 $ sudo aptitude -y install build-essential     ##"-y"的作用是:在安装过程中,如果遇到Y或N的提问,一律以Yes作为默认的答案 $ sudo aptitude -y install libsqlite3-dev $ sudo aptitude -y install libreadline6-dev $ sudo apt

[Python网络编程]浅析守护进程后台任务的设计与实现

在做基于B/S应用中,经常有需要后台运行任务的需求,最简单比如发送邮件.在一些如防火墙,WAF等项目中,前台只是为了展示内容与各种参数配置,后台守护进程才是重头戏.所以在防火墙配置页面中可能会经常看到调用cgi,但真正做事的一般并不是cgi,比如说执行关机命令,他们的逻辑如下: (ps:上图所说的前台界面包含通常web开发中的后端,不然也没有socket一说) 为什么要这么设计 你可能疑惑为什么要这么设计,我觉得理由如下: 首先有一点说明,像防火墙等基本上都运行在类Linux平台上 1.安全问题

python网络编程——socket进阶篇(select/poll/epoll)

原 生socket客户端在与服务端建立连接时,即服务端调用accept方法时是阻塞的,同时服务端和客户端在收数据(调用recv)时也是阻塞的.原生 socket服务端在同一时刻只能处理一个客户端请求,即服务端不能同时与多个客户端进行通信,实现并发,导致服务端资源闲置(此时服务端只占据 I/O,CPU空闲). 现在的需求是:我们要让多个客户端连接至服务器端,而且服务器端需要处理来自多个客户端请求.很明显,原生socket实现不了这种需求,此时我们该采用什么方式来处理呢? 解决方法:采用I/O多路复

python 网络编程:socket

在学习socket之前,我们先复习下相关的网络知识. OSI七层模型:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层.OSI七层模型是由国际标准化组织ISO定义的网络的基本结构,不仅包括一些概念和结构,还包括一系列的协议. TCP/IP四层模型:既然有OSI七层模型,为什么我们还要定义一个TCP/IP的四层模型呢,那是因为OSI七层模型对应面过于宽泛,很多概念实现不了,也没必要实现,因此,实际生产中广泛应用的是TCP/IP四层结构,他们的对应关系如下表: TCP/IP OSI 应用层