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 庫的使用