Python使用cookielib和urllib2模擬登錄新浪微博並抓取數據

這個方法抓下來的網頁,得不到相冊圖片,新浪要js動態生成圖片,解決方法能夠是:1. 本地用webkit跑抓下來的js;2.抓移動版微博的靜態相冊。 但都暫時未實現,歡迎回帖好方法,如下是轉文。
-----------------------------------------
php

咱們都知道HTTP是無鏈接的狀態協議,可是客戶端和服務器端須要保持一些相互信息,好比cookie,有了cookie,服務器才能知道剛纔是這個用戶登陸了網站,纔會給予客戶端訪問一些頁面的權限。 python

用瀏覽器登陸新浪微博,必須先登陸,登錄成功後,打開其餘的網頁纔可以訪問。用程序登陸新浪微博或其餘驗證網站,關鍵點也在於須要保存cookie,以後附帶cookie再來訪問網站,纔可以達到效果。 web

這裏就須要Python的cookielib和urllib2等的配合,將cookielib綁定到urllib2在一塊兒,就可以在請求網頁的時候附帶cookie。 ajax

具體作法,首先第一步,用firefox的httpfox插件,在瀏覽器衷開始瀏覽新浪微博首頁,而後登錄,從httpfox的記錄中,查看每一步發送了那些數據請求了那個URL;以後再python裏面,模擬這個過程,用urllib2.urlopen發送用戶名密碼到登錄頁面,獲取登錄後的cookie,以後訪問其餘頁面,獲取微博數據。 json

具體代碼,來自豆瓣的一篇文章:地址 瀏覽器

本人加了點註釋,歡迎你們一塊兒品嚐該同窗的完美代碼: 服務器

#coding=utf8
import urllib
import urllib2
import cookielib
import base64
import re
import json
import hashlib

#獲取一個保存cookie的對象
cj = cookielib.LWPCookieJar()
#將一個保存cookie對象,和一個HTTP的cookie的處理器綁定
cookie_support = urllib2.HTTPCookieProcessor(cj)
#建立一個opener,將保存了cookie的http處理器,還有設置一個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'}
    #其實到了這裏,已經可以使用urllib2請求新浪任何的內容了,這裏已經登錄成功了
    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!'
    #測試讀取數據,下面的URL,能夠換成任意的地址,都能把內容讀取下來
    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()

 

其實獲取了模擬登錄後的urllib2,能夠作抓數據等任何事情,你甚至能夠寫一個多線程的爬蟲來爬遍新浪微博,我一直有這個想法,可歷來沒有實現。若是您有什麼進展,請聯繫我共同進步。 cookie

相關文章
相關標籤/搜索