python模擬新浪微博登陸功能(新浪微博爬蟲)
1、主函數(shù)(WeiboMain.py):
import urllib2
import cookielib
import WeiboEncode
import WeiboSearch
if __name__ == '__main__':
weiboLogin = WeiboLogin('×××@gmail.com', '××××')#郵箱(賬號(hào))、密碼
if weiboLogin.Login() == True:
print "登陸成功!"
前兩個(gè)import是加載Python的網(wǎng)絡(luò)編程模塊,后面的import是加載另兩個(gè)文件WeiboEncode.py和Weiboseach.py(稍后介紹)。主函數(shù)新建登陸對(duì)象,然后登陸。
2、WeiboLogin類(WeiboMain.py):
class WeiboLogin:
def __init__(self, user, pwd, enableProxy = False):
"初始化WeiboLogin,enableProxy表示是否使用代理服務(wù)器,默認(rèn)關(guān)閉"
print "Initializing WeiboLogin..."
self.userName = user
self.passWord = pwd
self.enableProxy = enableProxy
self.serverUrl = "http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=&rsakt=mod&client=ssologin.js(v1.4.11)&_=1379834957683"
self.loginUrl = "http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.11)"
self.postHeader = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; rv:24.0) Gecko/20100101 Firefox/24.0'}
初始化函數(shù),定義了兩個(gè)關(guān)鍵的url成員:self.serverUrl用于登陸的第一步(獲取servertime、nonce等),這里的第一步實(shí)質(zhì)包含了解析新浪微博的登錄過程的1和2;self.loginUrl用于第二步(加密用戶和密碼后,POST給該URL,self.postHeader是POST的頭信息),這一步對(duì)應(yīng)于解析新浪微博的登錄過程的3。類內(nèi)函數(shù)還有3個(gè):
def Login(self):
"登陸程序"
self.EnableCookie(self.enableProxy)#cookie或代理服務(wù)器配置
serverTime, nonce, pubkey, rsakv = self.GetServerTime()#登陸的第一步
postData = WeiboEncode.PostEncode(self.userName, self.passWord, serverTime, nonce, pubkey, rsakv)#加密用戶和密碼
print "Post data length:\n", len(postData)
req = urllib2.Request(self.loginUrl, postData, self.postHeader)
print "Posting request..."
result = urllib2.urlopen(req)#登陸的第二步——解析新浪微博的登錄過程中3
text = result.read()
try:
loginUrl = WeiboSearch.sRedirectData(text)#解析重定位結(jié)果
urllib2.urlopen(loginUrl)
except:
print 'Login error!'
return False
print 'Login sucess!'
return True
self.EnableCookie用于設(shè)置cookie及代理服務(wù)器,網(wǎng)絡(luò)上有很多免費(fèi)的代理服務(wù)器,為防止新浪封IP,可以使用。然后使登陸的第一步,訪問新浪服務(wù)器得到serverTime等信息,然后利用這些信息加密用戶名和密碼,構(gòu)建POST請(qǐng)求;執(zhí)行第二步,向self.loginUrl發(fā)送用戶和密碼,得到重定位信息后,解析得到最終跳轉(zhuǎn)到的URL,打開該URL后,服務(wù)器自動(dòng)將用戶登陸信息寫入cookie,登陸成功。
def EnableCookie(self, enableProxy):
"Enable cookie & proxy (if needed)."
cookiejar = cookielib.LWPCookieJar()#建立cookie
cookie_support = urllib2.HTTPCookieProcessor(cookiejar)
if enableProxy:
proxy_support = urllib2.ProxyHandler({'http':'http://xxxxx.pac'})#使用代理
opener = urllib2.build_opener(proxy_support, cookie_support, urllib2.HTTPHandler)
print "Proxy enabled"
else:
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
urllib2.install_opener(opener)#構(gòu)建cookie對(duì)應(yīng)的opener
EnableCookie函數(shù)比較簡單
def GetServerTime(self):
"Get server time and nonce, which are used to encode the password"
print "Getting server time and nonce..."
serverData = urllib2.urlopen(self.serverUrl).read()#得到網(wǎng)頁內(nèi)容
print serverData
try:
serverTime, nonce, pubkey, rsakv = WeiboSearch.sServerData(serverData)#解析得到serverTime,nonce等
return serverTime, nonce, pubkey, rsakv
except:
print 'Get server time & nonce error!'
return None
WeiboSearch文件中的函數(shù)主要用于解析從服務(wù)器得到的數(shù)據(jù),比較簡單。
3、sServerData函數(shù)(WeiboSearch.py):
import re
import json
def sServerData(serverData):
"Search the server time & nonce from server data"
p = re.compile('\((.*)\)')
jsonData = p.search(serverData).group(1)
data = json.loads(jsonData)
serverTime = str(data['servertime'])
nonce = data['nonce']
pubkey = data['pubkey']#
rsakv = data['rsakv']#
print "Server time is:", serverTime
print "Nonce is:", nonce
return serverTime, nonce, pubkey, rsakv
解析過程主要使用了正則表達(dá)式和JSON,這部分比較容易理解。另外Login中解析重定位結(jié)果部分函數(shù)也在這個(gè)文件中如下:
def sRedirectData(text):
p = re.compile('location\.replace\([\'"](.*?)[\'"]\)')
loginUrl = p.search(text).group(1)
print 'loginUrl:',loginUrl
return loginUrl
4、從第一步到第二步要對(duì)用戶和密碼進(jìn)行加密,編碼操作(WeiboEncode.py)
import urllib
import base64
import rsa
import binascii
def PostEncode(userName, passWord, serverTime, nonce, pubkey, rsakv):
"Used to generate POST data"
encodedUserName = GetUserName(userName)#用戶名使用base64加密
encodedPassWord = get_pwd(passWord, serverTime, nonce, pubkey)#目前密碼采用rsa加密
postPara = {
'entry': 'weibo',
'gateway': '1',
'from': '',
'savestate': '7',
'userticket': '1',
'ssosimplelogin': '1',
'vsnf': '1',
'vsnval': '',
'su': encodedUserName,
'service': 'miniblog',
'servertime': serverTime,
'nonce': nonce,
'pwencode': 'rsa2',
'sp': encodedPassWord,
'encoding': 'UTF-8',
'prelt': '115',
'rsakv': rsakv,
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
}
postData = urllib.urlencode(postPara)#網(wǎng)絡(luò)編碼
return postData
PostEncode函數(shù)構(gòu)建POST的消息體,要求構(gòu)建得到內(nèi)容與真正登陸所需的信息相同。難點(diǎn)在用戶名和密碼的加密方式:
def GetUserName(userName):
"Used to encode user name"
userNameTemp = urllib.quote(userName)
userNameEncoded = base64.encodestring(userNameTemp)[:-1]
return userNameEncoded
def get_pwd(password, servertime, nonce, pubkey):
rsaPublickey = int(pubkey, 16)
key = rsa.PublicKey(rsaPublickey, 65537) #創(chuàng)建公鑰
message = str(servertime) + '\t' + str(nonce) + '\n' + str(password) #拼接明文js加密文件中得到
passwd = rsa.encrypt(message, key) #加密
passwd = binascii.b2a_hex(passwd) #將加密信息轉(zhuǎn)換為16進(jìn)制。
return passwd
新浪登錄過程,密碼的加密方式原來是SHA1,現(xiàn)在變?yōu)榱薘SA,以后可能還會(huì)變化,但是各種加密算法在Python中都有對(duì)應(yīng)的實(shí)現(xiàn),只要發(fā)現(xiàn)它的加密方式(),程序比較易于實(shí)現(xiàn)。
到這里,Python模擬登陸新浪微博就成功了,運(yùn)行輸出:
loginUrl: http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack&ssosavestate=1390390056&ticket=ST-MzQ4NzQ5NTYyMA==-1387798056-xd-284624BFC19FE242BBAE2C39FB3A8CA8&retcode=0
Login sucess!
果需要爬取微博中的信息,接下來只需要在Main函數(shù)后添加爬取、解析模塊就可以了,比如讀取某微博網(wǎng)頁的內(nèi)容:
htmlContent = urllib2.urlopen(myurl).read()#得到myurl網(wǎng)頁的所有內(nèi)容(html)
大家可以根據(jù)不同的需求設(shè)計(jì)不同的爬蟲模塊了,模擬登陸的代碼放在這里。
相關(guān)文章
Python編程深度學(xué)習(xí)計(jì)算庫之numpy
今天小編就為大家分享一篇關(guān)于Python編程深度學(xué)習(xí)計(jì)算庫之numpy,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2018-12-12Python實(shí)現(xiàn)視頻目標(biāo)檢測與軌跡跟蹤流程詳解
通過閱讀相關(guān)文獻(xiàn)及測試,找到了一種基于多模板匹配的改進(jìn)方法,可以對(duì)遙感視頻衛(wèi)星中的移動(dòng)目標(biāo)進(jìn)行探測,并繪制其軌跡。根據(jù)實(shí)驗(yàn)結(jié)果發(fā)現(xiàn),可以比較有效的對(duì)運(yùn)動(dòng)目標(biāo)進(jìn)行跟蹤2023-01-01python實(shí)戰(zhàn)之德州撲克第二步-判斷牌型
這篇文章主要介紹了python實(shí)戰(zhàn)之德州撲克第二步-判斷牌型,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Python中l(wèi)ogging日志模塊代碼調(diào)試過程詳解
這篇文章主要介紹了Python中l(wèi)ogging日志模塊代碼調(diào)試,今天來看看如何在代碼中定義日志,并探討日志的權(quán)限,需要的朋友可以參考下2023-04-04python計(jì)算兩個(gè)數(shù)的百分比方法
今天小編就為大家分享一篇python計(jì)算兩個(gè)數(shù)的百分比方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-06-06