pythonurllib微博登录怎么删_Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据...
我們都知道HTTP是無連接的狀態(tài)協(xié)議,但是客戶端和服務(wù)器端需要保持一些相互信息,比如cookie,有了cookie,服務(wù)器才能知道剛才是這個(gè)用戶登錄了網(wǎng)站,才會(huì)給予客戶端訪問一些頁面的權(quán)限。
用瀏覽器登錄新浪微博,必須先登錄,登陸成功后,打開其他的網(wǎng)頁才能夠訪問。用程序登錄新浪微博或其他驗(yàn)證網(wǎng)站,關(guān)鍵點(diǎn)也在于需要保存cookie,之后附帶cookie再來訪問網(wǎng)站,才能夠達(dá)到效果。
這里就需要Python的cookielib和urllib2等的配合,將cookielib綁定到urllib2在一起,就能夠在請求網(wǎng)頁的時(shí)候附帶cookie。
具體做法,首先第一步,用firefox的httpfox插件,在瀏覽器衷開始瀏覽新浪微博首頁,然后登陸,從httpfox的記錄中,查看每一步發(fā)送了那些數(shù)據(jù)請求了那個(gè)URL;之后再python里面,模擬這個(gè)過程,用urllib2.urlopen發(fā)送用戶名密碼到登陸頁面,獲取登陸后的cookie,之后訪問其他頁面,獲取微博數(shù)據(jù)。
具體代碼,來自豆瓣的一篇文章:地址
本人加了點(diǎn)注釋,歡迎大家一起品嘗該同學(xué)的完美代碼:
# coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlib
# 獲取一個(gè)保存cookie的對象
cj = cookielib.LWPCookieJar()
# 將一個(gè)保存cookie對象,和一個(gè)HTTP的cookie的處理器綁定
cookie_support = urllib2.HTTPCookieProcessor(cj)
# 創(chuàng)建一個(gè)opener,將保存了cookie的http處理器,還有設(shè)置一個(gè)handler用于處理http的URL的打開
opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
# 將包含了cookie、http處理器、http的handler的資源和urllib2對象板頂在一起
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': 'wsse',
'sp': '',
'encoding': 'UTF-8',
'url': 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
'returntype': 'META'
}
def get_servertime():
url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=dW5kZWZpbmVk&client=ssologin.js(v1.3.18)&_=1329806375939'
data = urllib2.urlopen(url).read()
p = re.compile('\((.*)\)')
try:
json_data = p.search(data).group(1)
data = json.loads(json_data)
servertime = str(data['servertime'])
nonce = data['nonce']
return servertime, nonce
except:
print 'Get severtime error!'
return None
def get_pwd(pwd, servertime, nonce):
pwd1 = hashlib.sha1(pwd).hexdigest()
pwd2 = hashlib.sha1(pwd1).hexdigest()
pwd3_ = pwd2 + servertime + nonce
pwd3 = hashlib.sha1(pwd3_).hexdigest()
return pwd3
def get_user(username):
username_ = urllib.quote(username)
username = base64.encodestring(username_)[:-1]
return username
def main():
username = 'www.crazyant.net' # 微博賬號
pwd = 'xxxx' # 微博密碼
url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.18)'
try:
servertime, nonce = get_servertime()
except:
return
global postdata
postdata['servertime'] = servertime
postdata['nonce'] = nonce
postdata['su'] = get_user(username)
postdata['sp'] = get_pwd(pwd, servertime, nonce)
postdata = urllib.urlencode(postdata)
headers = {'User-Agent':'Mozilla/5.0 (X11; Linux i686; rv:8.0) Gecko/20100101 Firefox/8.0'}
# 其實(shí)到了這里,已經(jīng)能夠使用urllib2請求新浪任何的內(nèi)容了,這里已經(jīng)登陸成功了
req = urllib2.Request(
url=url,
data=postdata,
headers=headers
)
result = urllib2.urlopen(req)
text = result.read()
# print text
p = re.compile('location\.replace\(\'(.*?)\'\)')
try:
login_url = p.search(text).group(1)
print login_url
# print login_url
urllib2.urlopen(login_url)
print "login success"
except:
print 'Login error!'
# 測試讀取數(shù)據(jù),下面的URL,可以換成任意的地址,都能把內(nèi)容讀取下來
req = urllib2.Request(url='http://e.weibo.com/aj/mblog/mbloglist?page=1&count=15&max_id=3463810566724276&pre_page=1&end_id=3458270641877724&pagebar=1&_k=134138430655960&uid=2383944094&_t=0&__rnd=1341384513840',)
result = urllib2.urlopen(req)
text = result.read()
print len(result.read())
# unicode(eval(b),"utf-8")
print eval("u'''" + text + "'''")
main()
其實(shí)獲取了模擬登陸后的urllib2,可以做抓數(shù)據(jù)等任何事情,你甚至可以寫一個(gè)多線程的爬蟲來爬遍新浪微博,我一直有這個(gè)想法,可從來沒有實(shí)現(xiàn)。如果您有什么進(jìn)展,請聯(lián)系我共同進(jìn)步。
相關(guān)推薦
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的pythonurllib微博登录怎么删_Python使用cookielib和urllib2模拟登陆新浪微博并抓取数据...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql主从同步_utf8_MySQL
- 下一篇: python嵌入html_Python