Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

exoticknight's blog


年寿有时而尽,荣乐止乎其身,二者必至之常期,未若文章之无穷。

为上一篇分析如何保存网络广播的博文追加一个脚本

上一篇博文中,只是给出了提取“響”上的广播的mms协议地址的脚本,这些地址使用某雷来下载就可以了。但是其中有一节提到音泉上的广播是可以直接提取到mp3的地址的,这就意味着可以直接使用http协议来下载。

于是我今天下午写了一个辅助的python脚本出来,方便自己用。

直接上代码:

#!/usr/bin/env python
# _*_ coding: utf-8 _*_

from bs4 import BeautifulSoup  
import argparse  
import urllib2  
import sys  
import json


def download_audio(name, proxy):

    print("collecting information...")
    try:
        respose = urllib2.urlopen(u"http://www.onsen.ag/data/api/getMovieInfo/{name}".format(name=name), timeout=60)
        bangumi = json.loads((respose.read())[9:-3])
    except Exception, e:
        print("Error:{0}".format(e))
        return

    path = bangumi["moviePath"]["pc"]
    filename = path[path.rindex("/")+1:]

    print("downloading...")
    if proxy is None:
        import urllib
        urllib.urlretrieve(path, filename=filename)
    else:
        if proxy[0] == "http":
            # not sure whether this works...
            import urllib
            urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler({"http": proxy[1]})))
            urllib.request.urlretrieve(path, filename=filename)
        elif proxy[0] == "socks":
            proxy_ip, proxy_port = proxy[1].split(":")
            import socks
            import socket
            socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, proxy_ip, int(proxy_port))
            socket.socket = socks.socksocket
            import urllib
            urllib.urlretrieve(path, filename=filename)


def download_images(name):  
    print("collecting information...")
    soup = BeautifulSoup(urllib2.urlopen(u"http://www.onsen.ag/program/{name}/".format(name=name), timeout=60))
    print("downloading...")
    for pic in soup.select(".newProgramLeft > img"):
        path = pic["src"]
        filename = path[path.rindex("/")+1:]
        import urllib
        urllib.urlretrieve(u"http://www.onsen.ag/program/{name}/".format(name=name) + path, filename=filename)


def process(option, proxy):  
    print("processing...{0}".format(option.name))

    if option.image:
        print("download images:")
        download_images(option.name)

    if option.audio:
        print("download audio:")
        download_audio(option.name, proxy)

    print("Completed.")


if __name__ == "__main__":  
    parser = argparse.ArgumentParser(version="1.0")

    parser.add_argument("-i", "--image", action="store_true", dest="image", help="download images")
    parser.add_argument("-a", "--audio", action="store_true", dest="audio", help="download audio")
    proxy_group = parser.add_mutually_exclusive_group()
    proxy_group.add_argument("--NOPROXY", action="store_true")
    proxy_group.add_argument("-p", "--proxy", nargs=2, action="store", dest="proxy", help="set the proxy address", metavar=("http/socks", "PROXY_ADDRESS"))
    parser.add_argument("name", action="store", help="list of bangumi name, name")

    SUPPORT_PROXY = ["http", "socks"]

    try:
        args = parser.parse_args(sys.argv[1:])
    except argparse.ArgumentError, e:
        print("bad options: {0}".format(e))
    except argparse.ArgumentTypeError, e:
        print("bad option value: {0}".format(e))
    else:
        if args.NOPROXY:
            process(args.name, None)
        else:
            if args.proxy[0] not in SUPPORT_PROXY:
                print("proxy type {0} is not supported!".format(args.proxy[0]))
            else:
                process(args, args.proxy)

脚本没什么好解释的,流程就是解析参数→执行process函数→调用图片下载函数/音频下载函数。其中的过程不过是上一篇文章中分析的结果而已。

注意这个脚本需要配合SocksiPy来使用,就是一个socks.py的文件而已,点击下载

为什么这么蛋疼,因为urllib不支持socks代理……而我使用的日本代理就是用socks的……

我没有日本ip的http代理,所以无法测试http代理是否有效。如果有好心人测试一下,出问题的话请给我发邮件:draco.knight0#gmail.com

最后再说说怎么用吧,方便那些连命令行都不会打的人。

一般来说,如果你要下载一个广播,比如新番玻璃之唇的广播,那么你在访问这个广播在音泉上的主页,网址就是:http://www.onsen.ag/program/glasslip/

看到“program/”后面的“glasslip”了吗?这个是广播的标识。

那么你就在控制台运行:

python onsen.py -a -i --NOPROXY glasslip  
  • 参数-a代表下载音频,也可以用长参数--audio
  • 参数-i代表下载图片,也可以用长参数--image
  • 参数--NOPROXY表示不使用代理

而因为音泉限制日本ip,所以我花了大力气来支持代理的下载。

比如你有一个使用socks协议的代理,本机开启的端点是127.0.0.1:8080

那么就这样用:

python onsen.py -a -i -p socks 127.0.0.1:8080 glasslip  

运行完之后大概会输出这么的东西:

processing...glasslip  
download images:  
collecting information...  
downloading...  
download audio:  
collecting information...  
downloading...  
Completed.  

就表示搞掂了,在脚本目录下找图片和mp3吧。

一时忘了怎么用,直接加-h参数就可以了。

python onsen.py -h  

About the author

exoticknight


Discussions

comments powered by Disqus