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

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

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

直接上代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/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” 了吗?这个是广播的标识。

那么你就在控制台运行:

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

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

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

那么就这样用:

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

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

1
2
3
4
5
6
7
8
processing...glasslip
download images:
collecting information...
downloading...
download audio:
collecting information...
downloading...
Completed.

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

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

1
python onsen.py -h
exoticknight wechat
扫描关注公众号
Or buy me a coffee ☕ ?