使用Python3自动批量下载指定Tumblr博客的视频和图片

背景

上周我的基友@大熊发给我一个地址,告知我想下载一些图片素材,然而设计师大神公司的网络并不能直接访问该网站,于是博主准备好梯子一瞅究竟,发现这个网站真不错,图片都很精致,奈何国内网络环境限制,没有梯子的情况下没办法访问,为了增进与设计师大神的友好关系,共筑基友之情,手起刀落脚本撸一发,批量下载指定博客的所有图片资源,至于视频资源嘛~~咳咳~~相信很多老司机都知道,我就不细说了,脚本依然支持批量自动下载,只需要指定车牌号,分分钟带你上车~~

说明

开始之前首先得搭建好梯子,梯子要稳,毕竟下载视频流量还是有点大的,一个视频大小分别在1M到50M之间不等,所以小水管的司机们稍微控制下流量。

说说tumblr这个站吧,这个网站上有很多优秀的资源,暂且不说老司机们所熟知的影视资源,一些比较正经的学术资源那是相当不错的,比如基友@大熊所需要下载素材的这个博客就很不错,地址 https://itunesartworks.tumblr.com ,属于 itunes 官方团队维护的一个素材库博客,上面所提供的素材都是非常精致的图片,能够采集自然是很棒的。

脚本

通过查看页面的源代码发现所需要下载的图片资源的标签都是规律性的,只需要简单的进行正则匹配就能够轻松获取图片URL,然后写入到本地磁盘。

视频方面稍微麻烦一些,视频播放是一个单独的页面,博客首页只是展示的一个列表,获取到的url地址是指向视频播放页面的,所以需要先获取到视频列表链接,便利访问得到所有视频播放页面的代码,提取视频的真实播放地址即可。

原理就是这么简单,直接上脚本

#!/usr/bin/env python
# coding=utf-8

import requests
import sys
import os
import re


def get_source(nickname, page_index, source_type):
    aim_url = "https://%s.tumblr.com/page/%d" % (nickname, page_index)
    print('[o] Get source from blog %s ...' % aim_url)
    try:
        response_string = requests.get(url=aim_url, timeout=50).content.decode('utf8')
        if "posts-no-posts content" not in response_string:
            if source_type == "images":
                source_elements = re.findall(r'<img(.+?)>', response_string)
            else:
                source_elements = re.findall(r'<iframe(.+?)>', response_string)

            if len(source_elements) > 0:
                dir_path = sys.path[0] + '/' + aim_url.split('//')[1].split('.')[0] + '/'
                if not os.path.exists(dir_path):
                    os.makedirs(dir_path)

                for this_source in source_elements:
                    if source_type == "images":
                        image_url = re.findall(r'src="(.+?)"', this_source)[0]
                        image_name = image_url.split('/')[-1]
                        if "tumblr_" in image_name:
                            write_file(image_url, dir_path, image_name)
                    else:
                        if "/video/" in this_source:
                            video_url = re.findall(r"src='(.+?)'", this_source)[0]
                            video_response = requests.get(url=video_url, timeout=50).content.decode('utf8')
                            video_source = re.findall(r'<source src="(.+?)"', video_response)[0]
                            video_name = video_source.split('tumblr_')[1].split('/')[0] + '.mp4'
                            write_file(video_source, dir_path, video_name)

            else:
                print('[x] Can not get any source.')
            page_index += 1
            get_source(nickname, page_index, source_type)
        else:
            print('[!] Get source complete!')
    except Exception as e:
        print(e)
        get_source(nickname, page_index, source_type)


def write_file(source_url, dir_path, file_name):
    if not os.path.exists(dir_path + file_name):
        print('[*] Source %s is downloading...' % file_name)
        file_download = requests.get(url=source_url, timeout=50)
        if file_download.status_code == 200:
            open(dir_path + file_name, 'wb').write(file_download.content)
    else:
        print('[*] Source %s has been downloaded.' % file_name)


if __name__ == '__main__':
    source_type = sys.argv[1]
    user_nickname = sys.argv[2]
    get_source(user_nickname, 1, source_type)

这里对代码进行简单的解释。

脚本使用python3进行编写,考虑到梯子承受的压力比较大,没有启用多线程下载,单线程挂机下载视频够用了,老司机们如果觉得自己的梯子够稳,可以加入多线程批量。

脚本会自动遍历指定博客的文章所有页数进行下载。

脚本使用的时候接受两个参数,第一个是下载的类型,分为图片和视频两种,第二个参数是指定Tumblr的博客地址,老司机们手上肯定是收集了大把的车牌号,随时准备发车吧。

对,就是这么简单,脚本会根据当前的车牌号自动创建对应的文件夹。如果文件夹或者资源已经存在,则会跳过,避免重复下载

2017-11-22 16-02-39屏幕截图.png - 大小: 78.71 KB - 尺寸: 827 x 503 - 点击打开新窗口浏览全图

截图

下面就放一些使用截图吧(老司机都懂)

首先是给基友下载的itunes的图片资源

itunesartworks.png - 大小: 384.37 KB - 尺寸:  x  - 点击打开新窗口浏览全图
2017-11-22 15-53-12屏幕截图.png - 大小: 275.45 KB - 尺寸:  x  - 点击打开新窗口浏览全图
然后就是老司机们比较喜欢的车牌号(随意测试一个,就不认真下载了)

python3 getsource.py video girls-squirting-cum
[*] Source nzoonnR36c1umgj3m.mp4 is downloading...
[*] Source ninfufuXmn1u4mekg.mp4 is downloading...
[*] Source o79hmuu1wY1vqiyol.mp4 is downloading...
[*] Source mrc9n23Vxs1svn096.mp4 is downloading...
[*] Source o6zgxoHMQk1tvpk0r.mp4 is downloading...
[o] Get source from blog https://girls-squirting-cum.tumblr.com/page/2 ...
[*] Source omb96msjhR1w2n6ss.mp4 is downloading...
[*] Source odf5nwFZm91vbvpm2.mp4 is downloading...
[*] Source noc658Esmc1uq5bz4.mp4 is downloading...
[*] Source o6yrj0H6351uxmo1u.mp4 is downloading...
[*] Source o2rkb8hbwr1v3013r.mp4 is downloading...

图片缩小,就不打码了

2017-11-22 16-02-29屏幕截图.png - 大小: 119.22 KB - 尺寸: 827 x 503 - 点击打开新窗口浏览全图

扩展

当然,如果你只是简单的因为国内网络问题访问不了,你可以使用脚本搭建一个远程服务端,博主稍微修改了下脚本配合Flask,变成可远程访问的web服务端,输入车牌号,自动批量下载资源并打包,这样远在美国的服务器就能够全自动高速下载好资源,需要的时候取回来就可以了,方便快捷,具体如何改写Flask就不描述了,博主博客上有Flask开发的相关文章,需要的同学自行参考。

更新

2017.12.08 更新:

新增超级搜索脚本,这个脚本抓取了 https://pastebin.com/raw/zmKcfPqg 上的rss列表,关于列表中所展示的rss都是什么内容,这里不做描述,各位老司机打开地址瞧一瞧就知道了。

脚本新增了多线程下载,自动抓取博客列表地址,自动下载全部图片和视频,多线程下载速度飞,起。

提示

飙车有风险,请文明驾驶

如果您觉得文章有帮助到您,请到 https://www.92ez.com/index.php?action=show&id=23403 进行打赏/捐赠,谢谢!
如果您觉得文章有帮助到您,请 使劲戳这里 进行打赏/捐赠,谢谢!
本文链接:https://www.92ez.com/?action=show&id=23460
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

关键词: python3 , tumblr

上一篇: 博客新增音乐功能的说明
下一篇: 360P2路由器改Flash刷老毛子教程

访客评论
#1
回复 666 2017-11-27, 4:11 PM
6666666666666666666666666666666滴滴,发车了!!
#2
回复 t412 2017-12-01, 2:51 PM
[o] Get source from blog https://itunesartworks.tumblr.com/page/1 ...
name 'ps' is not defined

SS全局开着
在mac上运行

不知道怎么debug..
回复 t412 2017-12-01, 11:38 PM
@t412: 我打错代码了。。。

现在的问题是

tumblr上图片很多,但是代码运行后,下载的图片只有一部分

[o] Get source from blog https://shutdown101.tumblr.com/page/1 ...
[*] Source tumblr_inline_oz7k1fnd3W1uk8ne9_540.png has been downloaded.
[*] Source tumblr_inline_oz7k1uWmIo1uk8ne9_540.png has been downloaded.
[*] Source tumblr_inline_oz7k2aZusr1uk8ne9_540.png has been downloaded.
[*] Source tumblr_inline_oz7k2xF70i1uk8ne9_540.png has been downloaded.
[*] Source tumblr_inline_oz7k3h94o81uk8ne9_540.png has been downloaded.
[*] Source tumblr_inline_oz7k4bzN161uk8ne9_540.jpg has been downloaded.
[*] Source tumblr_inline_oz7k48cVEc1uk8ne9_540.png has been downloaded.
[*] Source tumblr_inline_oz7k4dKcM71uk8ne9_540.jpg has been downloaded.
[*] Source tumblr_inline_oz7k53tLbt1uk8ne9_540.png has been downloaded.
[o] Get source from blog https://shutdown101.tumblr.com/page/2 ...
[o] Get source from blog https://shutdown101.tumblr.com/page/3 ...
[o] Get source from blog https://shutdown101.tumblr.com/page/4 ...
[o] Get source from blog https://shutdown101.tumblr.com/page/5 ...
[o] Get source from blog https://shutdown101.tumblr.com/page/6 ...
回复 KBdancer 2017-12-04, 1:34 AM
@t412: 相关代码已经更新,请到Github同步最新代码,感谢反馈!
发表评论

评论内容 (必填):