【python网络编程】使用rsa加密算法模块模拟登录新浪微博
一、基础知识
http://blog.csdn.net/pi9nc/article/details/9734437
二、模拟登录
因为上学期参加了一个大数据比赛,需要抓取数据,所以就想着写个爬虫抓取新浪微博的数据。
当然抓取数据不是漫无目的的,我需要的是根据关键词来抓取相关微博。
正好微博有一个高级搜索功能,不过要获取更多的微博,需要登录,所以这时就需要模拟登录了。
以下代码是通过rsa加密算法模块来模拟的。需要注意的是,新浪有反爬虫的,所以我们登录的时候要伪装成浏览器。
代码不是自己写的,所以文章类型标为转载,因为代码大同小异,所以我就不写咯,里面的一些具体代码和问题解析,我也不一一赘述了,因为模拟登录不是我的重点,下一篇我将跟大家谈一谈登录后的抓取与网页解析部分。至于登录,文章开头的链接中有详细教程,有兴趣的可以看一下。
- #! /usr/bin/env python
- #coding=utf8
- import urllib
- import urllib2
- import cookielib
- import base64
- import re
- import json
- import hashlib
- import rsa
- import binascii
- cj = 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!'
【python网络编程】使用rsa加密算法模块模拟登录新浪微博的更多相关文章
- python网络编程——SocketServer/Twisted/paramiko模块
在之前博客C/S架构的网络编程中,IO多路复用是将多个IO操作复用到1个服务端进程中进行处理,即无论有多少个客户端进行连接请求,服务端始终只有1个进程对客户端进行响应,这样的好处是节省了系统开销(se ...
- [Python 网络编程] TCP、简单socket模拟ssh (一)
OSI七层模型(Open System Interconnection,开放式系统互联) 应用层 网络进程访问应用层: 为应用程序进程(例如:电子邮件.文件传输和终端仿真)提供网络服务: 提供用户身份 ...
- 28、Python网络编程
一.基于TCP协议的socket套接字编程 1.套接字工作流程 先从服务器端说起.服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客 ...
- Python学习(22)python网络编程
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- Day07 - Python 网络编程 Socket
1. Python 网络编程 Python 提供了两个级别访问网络服务: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口 ...
- Python 网络编程相关知识学习
Python 网络编程 Python 提供了两个级别访问的网络服务.: 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的 ...
- python 网络编程 TCP/IP socket UDP
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...
- Python 网络编程Ⅱ
客户端 接下来我们写一个简单的客户端实例连接到以上创建http://www.weixiu3721.com/的服务.端口号为 12345. socket.connect(hosname, port ) ...
- Python 网络编程(二)
Python 网络编程 上一篇博客介绍了socket的基本概念以及实现了简单的TCP和UDP的客户端.服务器程序,本篇博客主要对socket编程进行更深入的讲解 一.简化版ssh实现 这是一个极其简单 ...
随机推荐
- Map集合遍历的2种方法
Map是一个集合的接口,是key-value相映射的集合接口,集合遍历的话,需要通过Iterator迭代器来进行. Iterator是什么东西: java.util包下的一个接口: 对 collect ...
- 05.K米评测
体验产品:K米Android版本 软件版本:4.3.0 设备型号:魅蓝note2 操作系统: Android5.1 体验时间:2016.10.15-2016.10.15 体验人:黄瑞钰(0314025 ...
- linux网络配置命令
ifconfig 命令命令功能ifconfig命令被用于配置和显不Linux内核中网络接口的网络参数.命令语法ifconfig (参数)参数说明add〈地址〉:设置网络设备IPv6的P地址;del〈地 ...
- HDU5671Matrix(矩阵行列交换)
有一个nn行mm列的矩阵(1 \leq n \leq 1000 ,1 \leq m \leq 1000 )(1≤n≤1000,1≤m≤1000),在这个矩阵上进行qq (1 \leq q \leq 1 ...
- cobbler深入学习
cobbler重要目录和cobbler各对象的关系 /var/www/cobbler/ks_mirror 存放操作系统镜像/var/www/cobbler/repo_mirror 存放仓库镜像/var ...
- python wmi使用
python wmi 官方开发文档https://msdn.microsoft.com/en-us/library/aa394388(v=vs.85).aspx WMI使用的WIN32_类库名 htt ...
- MySQL下全文索引
一种特殊的索引,它会把某个数据表的某个数据列出现过的所有单词生成一份清单. alter table tablename add fulltext(column1,column2) 只能在MyISAM数 ...
- vm centos 添加网卡 无配置文件
vm centos 添加网卡 无配置文件 解决办法 [root@test ~]# ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:C8:41:FB ...
- Flash Builder 4.7 破解
http://litech.diandian.com/post/2013-03-22/40049178994 Adobe Flash Builder 4.7 For Mac 破解 和Photoshop ...
- ecshop 团购点击价格变动
前提:价格阶梯只能设置一级 需要用到: jquery,transport.js(transport_jquery.js),Ajax.call html页面 js代码,还需要插入jquery,trans ...