weibo.com 提供公开的 API窗口。 我们可以利用这个API来登录。 本小节放到了 httplib2下面;但实际上我用一个新的库来完成这个操作。 它就是:requests。 很多人都觉得urllib, httplib不太好用。 requests出现相对来说比较晚,使用起来方便很多。
网址:http://docs.python-requests.org/en/latest/
requests 是需要安装的。
~~~
sudo easy_install requests
~~~
### 登录weibo.com原理
我们通过一个登录weibo.com的例子来说明。 登录weibo.com的原理见:
[http://www.douban.com/note/201767245/](http://www.douban.com/note/201767245/)
[http://blog.vsharing.com/liyu2012/A1447194.html](http://blog.vsharing.com/liyu2012/A1447194.html)
为了防止以上文章被删除,我转载到本站论坛:
[http://uliweb.clkg.org/forum/3/168](http://uliweb.clkg.org/forum/3/168)
[http://uliweb.clkg.org/forum/3/169](http://uliweb.clkg.org/forum/3/169)
摘抄重要的原理部分:
~~~
1, 在提交POST请求之前, 需要GET 获取两个参数。
地址是:http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)
得到的数据中有 "servertime" 和 "nonce" 的值, 是随机的,其他值貌似没什么用。
2, 通过httpfox 观察POST 的数据, 参数较复杂,其中 “su" 是加密后的username, "sp"是加密后的password。"servertime" 和 ”nonce" 是上一步得到的。其他参数是不变的。
username 经过了BASE64 计算: username = base64.encodestring( urllib.quote(username) )[:-1];
password 经过了三次SHA1 加密, 且其中加入了 servertime 和 nonce 的值来干扰。
即: 两次SHA1加密后, 将结果加上 servertime 和 nonce 的值, 再SHA1 算一次。
~~~
### 用 request的session登录
这样后来的每次访问都可以继承以前的session,系统会保存一些登录信息。
~~~
session = requests.session(
headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.1 (KHT'
'ML, like Gecko) Chrome/21.0.1180.89 Safari/537.1'
}
)
resp = session.get(
'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sina'
'SSOController.preloginCallBack&su=%s&client=%s' %
(base64.b64encode(username), WBCLIENT)
)
~~~
上面的步骤是取得 "servertime" 和 "nonce" 的值
通过正则表达式,分离出 servertime,nonce。。。
~~~
pre_login_str = re.match(r'[^{]+({.+?})', resp.content).group(1)
pre_login_json = json.loads(pre_login_str)
~~~
### 登录请求的数据
~~~
data = {
'entry': 'weibo',
'gateway': 1,
'from': '',
'savestate': 7,
'useticket': 1,
'ssosimplelogin': 1,
'su': base64.b64encode(urllib.quote(username)),
'service': 'miniblog',
'servertime': pre_login_json['servertime'],
'nonce': pre_login_json['nonce'],
'pcid': pre_login_json['pcid'],
'vsnf': 1,
'vsnval': '',
'pwencode': 'wsse',
'sp': sha1(sha1(sha1(password)) +
str(pre_login_json['servertime']) +
pre_login_json['nonce']),
'encoding': 'UTF-8',
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.si'
'naSSOController.feedBackUrlCallBack',
'returntype': 'META'
}
~~~
### 开始登录
~~~
resp = session.post(
'http://login.sina.com.cn/sso/login.php?client=%s' % WBCLIENT,
data=data
)
~~~
### 登录成功后获取用户信息
~~~
login_url = re.search(r'replace\([\"\']([^\'\"]+)[\"\']',
resp.content).group(1)
resp = session.get(login_url)
login_str = re.match(r'[^{]+({.+?}})', resp.content).group(1)
~~~
### 查看用户 uid
并且通过uid访问用户的页面
~~~
uid = login_info['userinfo']['uniqueid']
url = "http://weibo.com/u/"+uid
resp = session.get(url)
~~~
- Python爬虫入门
- (1):综述
- (2):爬虫基础了解
- (3):Urllib库的基本使用
- (4):Urllib库的高级用法
- (5):URLError异常处理
- (6):Cookie的使用
- (7):正则表达式
- (8):Beautiful Soup的用法
- Python爬虫进阶
- Python爬虫进阶一之爬虫框架概述
- Python爬虫进阶二之PySpider框架安装配置
- Python爬虫进阶三之Scrapy框架安装配置
- Python爬虫进阶四之PySpider的用法
- Python爬虫实战
- Python爬虫实战(1):爬取糗事百科段子
- Python爬虫实战(2):百度贴吧帖子
- Python爬虫实战(3):计算大学本学期绩点
- Python爬虫实战(4):模拟登录淘宝并获取所有订单
- Python爬虫实战(5):抓取淘宝MM照片
- Python爬虫实战(6):抓取爱问知识人问题并保存至数据库
- Python爬虫利器
- Python爬虫文章
- Python爬虫(一)--豆瓣电影抓站小结(成功抓取Top100电影)
- Python爬虫(二)--Coursera抓站小结
- Python爬虫(三)-Socket网络编程
- Python爬虫(四)--多线程
- Python爬虫(五)--多线程续(Queue)
- Python爬虫(六)--Scrapy框架学习
- Python爬虫(七)--Scrapy模拟登录
- Python笔记
- python 知乎爬虫
- Python 爬虫之——模拟登陆
- python的urllib2 模块解析
- 蜘蛛项目要用的数据库操作
- gzip 压缩格式的网站处理方法
- 通过浏览器的调试得出 headers转换成字典
- Python登录到weibo.com
- weibo v1.4.5 支持 RSA协议(模拟微博登录)
- 搭建Scrapy爬虫的开发环境
- 知乎精华回答的非专业大数据统计
- 基于PySpider的weibo.cn爬虫
- Python-实现批量抓取妹子图片
- Python库
- python数据库-mysql
- 图片处理库PIL
- Mac OS X安装 Scrapy、PIL、BeautifulSoup
- 正则表达式 re模块
- 邮件正则
- 正则匹配,但过滤某些字符串
- dict使用方法和快捷查找
- httplib2 库的使用