Python批量下載新浪微博相冊(cè)

最近用Python寫(xiě)了一個(gè)新浪微博相冊(cè)的批量下載程序封救,選好用戶(hù)后運(yùn)行就可以把他相冊(cè)的全部相片下載到本地乐严。記錄了下載歷史,可以中途停止和續(xù)傳掉缺。

新浪微博瀏覽相冊(cè)需要登錄卜录,在嘗試了模擬登錄之后,在登錄機(jī)制和驗(yàn)證碼上糾結(jié)了很久眶明,最后我選擇了直接用cookie登錄艰毒,這樣其實(shí)更省事。

Python2.7搜囱,應(yīng)該就用了requests這個(gè)第三方庫(kù)丑瞧,API用起來(lái)更舒服。

pip install requests

使用的時(shí)候:
1.先打開(kāi)該用戶(hù)的微博頁(yè)面蜀肘,F(xiàn)12或者查看源代碼绊汹,找到他的page_id,填到程序的uid處扮宠。
2.用F12或者其他監(jiān)聽(tīng)軟件找到cookies西乖,填入程序cookies處。
3.把希望保存的本地目錄路徑填入程序中dirpath處坛增。

下面是完整代碼

# coding=u8
#作者:平仄_pingze (簡(jiǎn)書(shū))

"功能"
'''
獲取新浪微博用戶(hù)相冊(cè)照片到本地
'''

"使用方法"
'''
1.填寫(xiě)儲(chǔ)存目錄
2.指定微博用戶(hù)id
3.填寫(xiě)cookie
4.運(yùn)行
'''

# ---|| 初始參數(shù)浴栽,需要預(yù)先填寫(xiě) ||---
dirpath = ''  #儲(chǔ)存目錄
uid =   #用戶(hù)page_id
cookies = ''  #cookies


import os
import requests
import urllib
import re
from StringIO import StringIO
import pickle
import traceback
import time


def list_find(alist,ele):
    '不報(bào)錯(cuò)的list.index()'
    try:
        return alist.index(ele)
    except:
        return -1

def get_response(url,headers='',params=''):
    '穩(wěn)定高效的獲取響應(yīng)方法'
    max_try_times = 20 # 最大嘗試次數(shù)
    wait_time = 0.75 # 最大單次嘗試時(shí)間
    sleep_time = 0.25 # 嘗試失敗延時(shí)
    #print('[%s][INFO] Start trying to connect ...' % time.asctime()[11:19])
    for times in range(1,max_try_times+1):
        # print('[%s][INFO] The %s time try begin ...' % (time.asctime()[11:19], times))
        try:
            response = requests.get(url, timeout = wait_time, headers=headers, params=params)
            # print('[%s][INFO] The %s time try success!' % (time.asctime()[11:19], times))
            break
        except:
            if times < max_try_times:
                # print('[%s][WARN] The %s time try failed!' % (time.asctime()[11:19], times))
                time.sleep(sleep_time)
                continue
            else:
                print('[%s][ERROR] The last try failed at last , exit pro ...' % time.asctime()[11:19])
                traceback.print_exc()
                exit()
    # print('[%s][INFO] Successfully get the response!' % time.asctime()[11:19])
    return response

def retrieve(imgurl,imgpath):
    '穩(wěn)定高效的下載圖片方法(多次嘗試失敗后跳過(guò))'
    max_try_times = 5 # 最大嘗試次數(shù)
    wait_time = 15 # 最大單次嘗試時(shí)間
    sleep_time = 3 # 嘗試失敗延時(shí)
    import socket
    socket.setdefaulttimeout(wait_time)
    #print('[%s][INFO] Start trying to connect ...' % time.asctime()[11:19])
    for times in range(1,max_try_times+1):
        # print('[%s][INFO] The %s time try begin ...' % (time.asctime()[11:19], times))
        try:
            urllib.urlretrieve(imgurl,imgpath)
            # print('[%s][INFO] The %s time try success!' % (time.asctime()[11:19], times))
            break
        except:
            if times < max_try_times:
                # print('[%s][WARN] The %s time try failed!' % (time.asctime()[11:19], times))
                time.sleep(sleep_time)
                continue
            else:
                print('[%s][ERROR] The last try failed at last , pass ...' % time.asctime()[11:19])
                break
    # print('[%s][INFO] Successfully get the response!' % time.asctime()[11:19])

def secp(string,pattern1,pattern2=''):
    '替換字符串中所有指定字符串為新字符串(效率低)'
    while True:
        index = string.find(pattern1)
        if index > -1:
            string = string[:index]+pattern2+string[index+len(pattern1):]
        else:
            break
    return string

def url_deal(url):
    'URL處理'
    urld = secp(url,'\\')
    urld = secp(urld,'thumb300','large')
    return urld

def get_imgurl(html):
    '解析html,獲取圖像url列表'
    imgurl_list = []
    extlist = ['jpg','gif','png']
    for ext in extlist:
        pattern = r'class=\\\"photo_pict\\\" src=\\\"(http:\S+thumb300\S+.'+ext+')'
        result = re.findall(pattern,html,re.S)
        if len(result) > 0:
            for url in result:
                imgurl_list.append(url_deal(url))    
    return imgurl_list  

def save_img(imgurl,savepath,imgname):
    '向本地目錄儲(chǔ)存圖像'
    imgext = imgurl[-4:]
    imgname = imgname + imgext 
    retrieve(imgurl,savepath+os.sep+imgname)

def save_log(dic, path):
    '以pickle文件格式儲(chǔ)存到目標(biāo)路徑'
    try:
        out_file = open(path, 'wb')
        pickle.dump(dic,out_file)
        return path
    except:
        traceback.print_exc()
        return None
    finally:
        out_file.close()     

def load_log(path):
    '從指定文件讀取pickle文件轉(zhuǎn)成字典'
    try:
        in_file = open(path, 'rb')
        dic = pickle.load(in_file)
        return dic
    except:
        traceback.print_exc()
        return None

def main():
    url = 'http://www.weibo.com/p/'+str(uid)+'/photos'
    headers = {
        'Cookie': cookies
    }
    #訪問(wèn)網(wǎng)址轿偎,獲取html文檔
    response = get_response(url, headers=headers)
    print('[%s][INFO] Pro starting at %s ...' % (time.asctime()[11:19], response.url))
    html = response.text
    #檢查html是否有效典鸡;若無(wú)效,報(bào)錯(cuò)并中止
    if len(re.findall('thumb300',html,re.S)) < 1 and len(re.findall('oid',html,re.S)) < 1 and len(re.findall('的微薄',re.S)) < 1:
        print('[%s][ERROR] Invalid cookies or page_id, please check !' % (time.asctime()[11:19]))
        exit()
    #解析文檔坏晦,獲取用戶(hù)信息和圖片路徑
    uname = re.findall(u'content="(.+?)萝玷,',html,re.S)[0]
    imgurl_list = get_imgurl(html)
    #動(dòng)態(tài)獲取循環(huán)
    while True:
        #獲取since_id,進(jìn)一步獲取動(dòng)態(tài)加載的頁(yè)面
        result = re.findall('since_id=(\S+)">',html,re.S)
        if len(result)>0:
            since_id = result[0][:-1]
        else:
            break
        #print(since_id)
        payload={
            'since_id': since_id,
            'page_id': uid,
            'ajax_call': 1
        }
        url = 'http://weibo.com/p/aj/album/loading'
        response = get_response(url,params=payload,headers=headers)
        html = response.text
        print('[%s][INFO] Got new page of %s !' % (time.asctime()[11:19], response.url))
        #解析文檔昆婿,獲取html路徑
        imgurl_list = imgurl_list + get_imgurl(html)
    savepath = dirpath + os.sep + uname
    if(os.path.exists(savepath)==False or os.path.isdir(savepath)==False):
        os.mkdir(savepath)
    imgurl_list.reverse()
    global total_num
    total_num = len(imgurl_list)
    #log文件存在性檢查
    logpath = savepath + os.sep + 'log.pkl'
    if os.path.exists(logpath) and os.path.isfile(logpath):
        print('[%s][INFO] Found log.pkl, loading...' % (time.asctime()[11:19]))
        logdic = load_log(logpath)
        log_last_num = logdic.get('last_num')
        log_imgurl_list = logdic.get('imgurl_list')
        index = log_last_num + 1
    else:
        print('[%s][INFO] Not found log.pkl, creating a new one ...' % (time.asctime()[11:19]))
        log_imgurl_list = []
        index = 1
    #開(kāi)始下載圖片
    num = 1
    for imgurl in imgurl_list:
        if list_find(log_imgurl_list, imgurl) < 0: 
            imgname = '{:0>5}'.format(index)
            save_img(imgurl, savepath, imgname)
            index = index + 1
            last_num = index - 1
            log_imgurl_list.append(imgurl)
            logdic = {
                'last_num': last_num,
                'imgurl_list': log_imgurl_list
            }
            print('[%s][INFO] Writing log ... (%d/%d) !' % (time.asctime()[11:19], num, total_num))
            save_log(logdic, logpath)
            print('[%s][INFO] Successfully saved image as %s (%d/%d) !' % (time.asctime()[11:19], imgname, num, total_num))
        else:
            print('[%s][INFO] Jump this image (%d/%d) !' % (time.asctime()[11:19], num, total_num))
        num = num + 1

if __name__ == '__main__':
    main()

比如我的初始參數(shù)是:

dirpath = 'images' #與腳本同目錄的images文件夾
uid = 1035051191258123 # 韓寒
cookies = 'SINAGLOBAL=221.237.83.131_146556……' #很長(zhǎng)球碉,不給你看

套路是這么個(gè)套路,大家有什么想法可以提一提嘛……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仓蛆,一起剝皮案震驚了整個(gè)濱河市睁冬,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌看疙,老刑警劉巖豆拨,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異能庆,居然都是意外死亡施禾,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)搁胆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弥搞,“玉大人邮绿,你說(shuō)我怎么就攤上這事∨世” “怎么了船逮?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)粤铭。 經(jīng)常有香客問(wèn)我傻唾,道長(zhǎng),這世上最難降的妖魔是什么承耿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任冠骄,我火速辦了婚禮,結(jié)果婚禮上加袋,老公的妹妹穿的比我還像新娘凛辣。我一直安慰自己,他們只是感情好职烧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布扁誓。 她就那樣靜靜地躺著,像睡著了一般蚀之。 火紅的嫁衣襯著肌膚如雪蝗敢。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天足删,我揣著相機(jī)與錄音寿谴,去河邊找鬼。 笑死失受,一個(gè)胖子當(dāng)著我的面吹牛讶泰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拂到,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼痪署,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了兄旬?” 一聲冷哼從身側(cè)響起狼犯,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎领铐,沒(méi)想到半個(gè)月后悯森,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡罐孝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年呐馆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片莲兢。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汹来,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出改艇,到底是詐尸還是另有隱情收班,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布谒兄,位于F島的核電站摔桦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏承疲。R本人自食惡果不足惜邻耕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望燕鸽。 院中可真熱鬧兄世,春花似錦、人聲如沸啊研。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)党远。三九已至削解,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沟娱,已是汗流浹背氛驮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留济似,地道東北人柳爽。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像碱屁,于是被迫代替她去往敵國(guó)和親磷脯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,139評(píng)論 25 707
  • 首先詳細(xì)說(shuō)明一下什么是cookies娩脾? 當(dāng)用戶(hù)通過(guò)瀏覽器首次訪問(wèn)一個(gè)域名時(shí)赵誓,訪問(wèn)的WEB服務(wù)器會(huì)給客戶(hù)端發(fā)送數(shù)據(jù),...
    是藍(lán)先生閱讀 1,250評(píng)論 1 6
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)柿赊、插件俩功、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,103評(píng)論 4 62
  • 死亡,是永恒的主題碰声。在蘇童的筆下诡蜓,死亡少了那份孤獨(dú)與絕望,多了份宿命與奇異胰挑。 讀過(guò)他幾篇短篇蔓罚,里面的人物結(jié)局都...
    瑪貝拉閱讀 1,031評(píng)論 0 1
  • 日子過(guò)得亂七八糟椿肩。尤其是這次返校。 和茜坐在公園里豺谈,偷片刻的歡愉郑象。當(dāng)然,大學(xué)生了茬末,又是周末厂榛,有大把時(shí)光造作,用“偷...
    咕嚕不愛(ài)彈吉他閱讀 311評(píng)論 1 0