簡單爬蟲實現登陸新浪微博(python2.7)

由於圖論做業,因此要寫一個爬蟲,就開始學python。接觸python開始,就以爲這個語言很是舒服,不須要定義變量,不須要分號,很是簡潔。php

下面就聊聊,我寫爬蟲的經歷。上網搜了一下爬蟲的代碼,發現簡單爬蟲仍是很是好寫的,主要用到python中的urllib,urllib2這些庫,對於網頁進行操做,同時會用到正則表達式獲取想要的內容。python

有一個問題是,咱們有時候須要爬取一些登陸以後的信息,若是沒有登陸,得到的信息很是少,無法知足咱們的需求。ajax

下面以新浪微博爲例。正則表達式

先貼代碼,註釋很詳細,等大做業寫完有時間了,再詳細說如何一步步作。簡單說就是須要處理:postdata,cookie,prelogin,加密算法。算法

#coding=utf8
# import 這邊須要注意的是隻有一個rsa這個模塊是須要install的,其餘的都是內置
import re , urllib , urllib2, cookielib , base64 , binascii , rsa

# 讓接下來的全部get和post請求都帶上已經獲取的cookie
cj = cookielib.LWPCookieJar()
cookie_support = urllib2.HTTPCookieProcessor(cj)
opener = urllib2.build_opener(cookie_support , urllib2.HTTPHandler)
urllib2.install_opener(opener)

# 封裝一個用於get的函數,新浪微博這邊get出來的內容編碼都是-8
def getData(url) :
    request = urllib2.Request(url)
    response = urllib2.urlopen(request)
    text = response.read().decode('utf-8')
    return text

# 封裝一個用於post的函數,驗證密碼和用戶名都是post的,因此這個postData在本demo中專門用於驗證用戶名和密碼
def postData(url , data) :
# headers須要咱們本身來模擬
    headers = {'User-Agent' : 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)'}
# 這裏的urlencode用於把一個請求對象用'&'來接來字符串化,接着就是編碼成utf-8
    data = urllib.urlencode(data).encode('utf-8')
    request = urllib2.Request(url , data , headers)
    response = urllib2.urlopen(request)
    text = response.read().decode('gbk')
    return text


def login_weibo(nick , pwd) :
#==========================獲取servertime , pcid , pubkey , rsakv===========================
# 預登錄請求,獲取到若干參數
    prelogin_url = 'http://login.sina.com.cn/sso/prelogin.php?entry=weibo&callback=sinaSSOController.preloginCallBack&su=%s&rsakt=mod&checkpin=1&client=ssologin.js(v1.4.15)&_=1400822309846' % nick
    preLogin = getData(prelogin_url)
# 下面獲取的四個值都是接下來要使用的
    servertime = re.findall('"servertime":(.*?),' , preLogin)[0]
    pubkey = re.findall('"pubkey":"(.*?)",' , preLogin)[0]
    rsakv = re.findall('"rsakv":"(.*?)",' , preLogin)[0]
    nonce = re.findall('"nonce":"(.*?)",' , preLogin)[0]
#===============對用戶名和密碼加密================
# 各類加密,最後造成了加密後的su和sp
    su = base64.encodestring(urllib.quote(nick))
    rsaPublickey = int(pubkey , 16)
    key = rsa.PublicKey(rsaPublickey , 65537)
    message = str(servertime) + '\t' + str(nonce) + '\n' + str(pwd)
    sp = binascii.b2a_hex(rsa.encrypt(message , key))
#=======================登陸=======================  
#param就是激動人心的登錄post參數,這個參數用到了若干個上面第一步獲取到的數據
    param = {'entry' : 'weibo' , 'gateway' : 1 , 'from' : '' , 'savestate' : 7 , 'useticket' : 1 , 'pagerefer' : 'http://login.sina.com.cn/sso/logout.php?entry=miniblog&r=http%3A%2F%2Fweibo.com%2Flogout.php%3Fbackurl%3D' , 'vsnf' : 1 , 'su' : su , 'service' : 'miniblog' , 'servertime' : servertime , 'nonce' : nonce , 'pwencode' : 'rsa2' , 'rsakv' : rsakv , 'sp' : sp , 'sr' : '1680*1050' ,
             'encoding' : 'UTF-8' , 'prelt' : 961 , 'url' : 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack'}
# 這裏就是使用postData的惟一一處,也很簡單
    s = postData('http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)' , param)
# 這個urll是登錄以後新浪返回的一段腳本中定義的一個進一步登錄的url,以前還都是獲取參數和驗證之類的,這一步纔是真正的登錄,因此還須要再一次把這個urll獲取到並用get登錄便可
    urll = re.findall("location.replace\(\'(.*?)\'\);" , s)[0]
    getData(urll)

# 登陸微博
login_weibo('你的帳號名','你的密碼')
#======================獲取粉絲====================
# 能夠嘗試着獲取本身的微博主頁
text = getData('http://weibo.com/5548896862/follow?from=page_100505&wvr=6&mod=headfollow#place').encode('utf-8')
fp = open('yeah.txt' , 'w')
fp.write(text)
fp.close()

最後是個人的微博主頁,跪求互粉~~cookie

http://weibo.com/u/5778958604網絡

此博客中的內容均爲原創或來自網絡,不用作任何商業用途。歡迎與我交流學習,個人郵箱是lsa0924@163.comide

相關文章
相關標籤/搜索