Linux 下使用 wget/aria2 进行离线迅雷批量下载

标签: Apps axel Transmission Vuze wget | 发表时间:2011-10-26 19:58 | 作者:zhangkaixuan Wynnsyt
出处:http://www.osmsg.com

在Linux下资源下载的速度长期受限,ed2k,torrent什么都木有速度,坑爹呀,自从购买了迅雷VIP的服务,可以直接以http形式来从迅雷服务器内下载自己托迅雷下载的东西,而且如果你这个资源别人下载过的话,你就不用再次下载了,迅雷马上提示你这个任务已经完成了。–#roowe撰写

至于其他的,用过的人都知道了,也不再细说。如果windows平台配合迅雷客户端用迅雷VIP的话,这个脚本也没有啥意义了(因为客户端更人性化^_^,当然占用资源也不少,嘿嘿),所以前提是你的OS要是Linux,然后使用迅雷离线的web界面。

由于firefox下载迅雷离线的东西存在这样几个问题,比如文件名中文乱码,要自己改(暗骂编码ing),不支持断点续传(我挂过几次,不过无奈重新下载了T_T),迅雷在点击下载的时候,响应慢死了,好久才跳出窗口。

出于这几个原因,我就去研究了下PT酱的那个离线下载的脚本,然后根据自己的需要重新写如下:(也可以在这里下载脚本

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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
#!/usr/bin/env python
# -*- coding: utf-8 -*-  
#Time-stamp: <2011-10-25 21:36:28 Tuesday by roowe>
#File Name: thuner_xl_with_wget.py
#Author: bestluoliwe@gmail.com
#My Blog: www.iroowe.com
 
import re
import time
import os
import logging
import sys
from htmlentitydefs import entitydefs
import subprocess
LOG_FILE = "/tmp/thuner_with_wget.log"
log = None
def log_init(log_file, quiet=False):
    logger = logging.getLogger()
    logger.setLevel(logging.DEBUG)
    hdlr = logging.FileHandler(log_file)
    formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s")
    hdlr.setFormatter(formatter)
    logger.addHandler(hdlr)
    if not quiet:
        hdlr = logging.StreamHandler()
        hdlr.setFormatter(formatter)
        logger.addHandler(hdlr)
    return logger
 
def handle_entitydef(matchobj):
    key = matchobj.group(1)
    if entitydefs.has_key(key):
        return entitydefs[key]
    else:
        return matchobj.group(0)
def collect_urls(html, only_bturls = False):
    """
    collect urls
    """
    urls = []
    for name, url in re.findall(r"<a.+?name=['\"]bturls['\"] title=['\"](.+?)['\"].+?href=['\"](http.+?)['\"]>", html):
        name = re.sub("&(.*?);", handle_entitydef, name)
        url = re.sub("&(.*?);", handle_entitydef, url)
        urls.append((name, url))
    if not only_bturls:
        for id, name in re.findall(r'<input id=[\'"]durl(\w+?)[\'"].+title=[\'"](.+?)[\'"].+', html):
            result = re.search(r'<input id=[\'"]dl_url%s[\'"].+value=[\'"](http.*?)[\'"]' % id, html)
            if result:
                name = re.sub("&(.*?);", handle_entitydef, name)
                url = result.group(1)
                url = re.sub("&(.*?);", handle_entitydef, url)
                urls.append((name, url))
    log.info("Filter get %d links" % len(urls))
    return urls
def choose_download(urls):
    download_list = {}
    for name, url in urls:
        while True:
            ans = raw_input("Download %s?[Y/n](default: Y) " % name)
            if len(ans) == 0:
                ans = True
                break
            elif ans.lower() == 'y':
                ans = True
                break
            elif ans.lower() == 'n':
                ans = False
                break
            else:
                sys.stdout.write("please enter y or n!\n")
                continue
        download_list[name] = ans
    return download_list
def thuner_xl_with_wget(urls, output_dir, cookies_file, quiet=False):
    download_list = choose_download(urls)
    for name, url in urls:
        if len(url) == 0:
            log.debug("Empty Link, Name: " + name)
            continue
        if not download_list[name]:
            continue
        cmd = ["wget", "--load-cookies", cookies_file, "-c", "-t", "5", "-O", os.path.join(output_dir, name), url]
        if quiet:
            cmd.insert(1, "-q")
        log.info("wget cmd: '%s'" % ' '.join(cmd))
        ret = subprocess.call(cmd)
        if ret != 0:
            log.debug("wget returned %d." % ret)
            if ret in (3, 8):
                log.error("Give up '%s', may be already finished download, or something wrong with disk." % name)
            else:
                urls.append((name, url))
                log.error("will retry for %s later." % name)
            continue
        else:
            log.info("Finished %s" % name)
        time.sleep(2)
def thuner_xl_with_aria2c(urls, output_dir, cookies_file, quiet=False):
    """
    download with aria2c
    """
    download_list = choose_download(urls)
    for name, url in urls:
        if len(url) == 0:
            log.debug("Empty Link, Name: " + name)
            continue
        if not download_list[name]:
            continue
        cmd = ["aria2c", "--load-cookies", cookies_file, "-d", output_dir, "-c", "-m", "5", "-s", "5", "-o", name, url]
        if quiet:
            cmd.insert(1, "-q")
        log.info("wget cmd: '%s'" % ' '.join(cmd))
        ret = subprocess.call(cmd)
        if ret != 0:
            log.debug("wget returned %d." % ret)
            if ret in (13):
                log.error("Give up '%s', file already existed." % name)
            else:
                urls.append((name, url))
                log.error("the exit status number is %d, and then will retry for %s later." % (ret, name))
            continue
        else:
            log.info("Finished %s" % name)
        time.sleep(2)
 
if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser(description='Thuner li xian with wget', formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    parser.add_argument('-p', nargs='?', default="~/user_task.htm", help="load page file")
    parser.add_argument('-c', nargs='?', default="~/cookies.txt", help="load cookie file")
    parser.add_argument('-o', nargs='?', default="~/Downloads", help="output dir")
    parser.add_argument('-b', action='store_true', default=False, help="bt files only")
    parser.add_argument('-q', action="store_true", default=False, help="quiet, only log to file.")
    parser.add_argument('-a', action="store_true", default=False, help="download with aria2c")
    args = parser.parse_args()
 
    only_bturls, cookies_file, output_dir, page_file, quiet = args.b, args.c, args.o, args.p, args.q
 
    page_file = os.path.expanduser(page_file) 
    cookies_file = os.path.realpath(os.path.expanduser(cookies_file))
    output_dir = os.path.expanduser(output_dir)
 
    log = log_init(LOG_FILE, quiet = quiet)
    if not os.path.exists(cookies_file):
        log.info("please export cookies file")
        sys.exit(0)
    if not os.path.isdir(output_dir):
        log.info("No such %s", output_dir)
        sys.exit(0)
    with open(page_file) as f:
        page_html = f.read()
    urls = collect_urls(page_html, only_bturls)
    if not args.a:
        thuner_xl_with_wget(urls, output_dir, cookies_file, quiet)
    else:
        thuner_xl_with_aria2c(urls, output_dir, cookies_file, quiet)

用法如下,有两个东西要解释下:
第一个,user_task.htm就是你的迅雷任务页面,在Firefox可以用Ctrl+S进行保存下来,下载信息都在里面;
第二个,cookie file就是你的cookie文件,这个是给wget用的,这个文件你可以用firefox的export cookie这个插件获取(一般重新登陆之后就需要再次export一次,因为这个时候旧的cookie已经失效了),其他浏览器请自行问google;output dir就是你的下载保存路径,其他就不说了,不明白可以联系我。

1
2
3
4
5
6
7
8
9
10
11
12
13
(virpython2)[roowe@Arch mytools]$ ./thuner_xl_with_wget.py -h
usage: thuner_xl_with_wget.py [-h] [-p [P]] [-c [C]] [-o [O]] [-b] [-q] [-a]
 
Thuner li xian with wget
 
optional arguments:
  -h, --help  show this help message and exit
  -p [P]      load page file (default: ~/user_task.htm)
  -c [C]      load cookie file (default: ~/cookies.txt)
  -o [O]      output dir (default: ~/Downloads)
  -b          bt files only (default: False)
  -q          quiet, only log to file. (default: False)
  -a          download with aria2c (default: False)

执行下面的命令即可:

1
(virpython2)[roowe@Arch mytools]$ ./thuner_xl_with_wget.py -o /home/ftpusers/ics/movies/ -p ~/user_task.htm  -c ~/cookies.txt

Read More:

相关 [linux wget aria2] 推荐:

Linux 下使用 wget/aria2 进行离线迅雷批量下载

- Wynnsyt - OSMSG
在Linux下资源下载的速度长期受限,ed2k,torrent什么都木有速度,坑爹呀,自从购买了迅雷VIP的服务,可以直接以http形式来从迅雷服务器内下载自己托迅雷下载的东西,而且如果你这个资源别人下载过的话,你就不用再次下载了,迅雷马上提示你这个任务已经完成了. 至于其他的,用过的人都知道了,也不再细说.

Linux wget命令

- - CSDN博客推荐文章
wget是linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径. 例如: # wget  http://www.linuxsense.org/xxxx/xxx.tar.gz. 简单说一下-c参数, 这个也非常常见, 可以断点续传, 如果不小心终止了, 可以继续使用命令接着下载.

firefox/ie下载百度网盘大文件/linux,wget下载百度网盘大文件

- - 行业应用 - ITeye博客
1.登录后类似这个网址http://pan.baidu.com/disk/home?adapt=pc. 2.修改为http://pan.baidu.com/wap/home?adapt=pc. 4.真正下载后点击下载项任务列表/下载进度列表. 已有 0 人发表留言,猛击->> 这里<<-参与讨论.

用wget同步ftp

- - 天空极速
wget 可以下载整个网站或者ftp. 如果有两个ftp站点,需要同步,可以使用以下命令:. 解释下,前面是ftp的授权用户,密码,ftp的站点,端口. -r 是表示递归,-x表示强制创建目录,-c表示断点续传. Tags - windows , wget , ftp , 备份 , 同步.

wget 下载整个网站或目录

- - 深度VPS
wget是linux下命令行的下载工具,功能很强大,虽然我很少用,一般下在一些小东西都是直接用firefox,seamonkey这些浏览器自带的下载功能下载,没有必要用wget或者其他下载工具. 但是某些时候却不是浏览器自带的下载功能和一些其他的下载软件所能做的的,这时候就得用wget了. 比如如果你想下载一个网页目录下的所有文件,如何做呢.

Javascript 里跑Linux

- rockmaple - Shellex&#39;s Blog
牛逼到暴的大拿 Fabrice Bellard,用Javascript实现了一个x86 PC 模拟器,然后成功在这个模拟器里面跑Linux(请用Firefox 4 / Google Chrome 11打开,Chome 12有BUG). 关于这个东西… 伊说 “I did it for fun“,大大啊大大啊….

Linux Ksplice,MySQL and Oracle

- Syn - DBA Notes
Oracle 在 7 月份收购了 Ksplice. 使用了 Ksplice 的 Linux 系统,为 Kernel 打补丁无需重启动,做系统维护的朋友应该明白这是一个杀手级特性. 现在该产品已经合并到 Oracle Linux 中. 目前已经有超过 700 家客户,超过 10 万套系统使用了 Ksplice (不知道国内是否已经有用户了.

linux makefile编写

- hl - C++博客-首页原创精华区
在讲述这个Makefile之前,还是让我们先来粗略地看一看Makefile的规则. target也就是一个目标文件,可以是Object File,也可以是执行文件. prerequisites就是,要生成那个target所需要的文件或是目标. command也就是make需要执行的命令. 这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在 command中.

Linux下的VDSO

- 圣斌 - Adam&#39;s
VDSO(Virtual Dynamically-linked Shared Object)是个很有意思的东西, 它将内核态的调用映射到用户态的地址空间中, 使得调用开销更小, 路径更好.. 开销更小比较容易理解, 那么路径更好指的是什么呢. 拿x86下的系统调用举例, 传统的int 0×80有点慢, Intel和AMD分别实现了sysenter, sysexit和syscall, sysret, 即所谓的快速系统调用指令, 使用它们更快, 但是也带来了兼容性的问题.

linux 小技巧

- - DBA Blog
2:如何限制用户的最小密码长度. 修改/etc/login.defs里面的PASS_MIN_LEN的值. 比如限制用户最小密码长度是8:. 3:如何使新用户首次登陆后强制修改密码. 4:更改Linux启动时用图形界面还是字符界面. 将id:5:initdefault: 其中5表示默认图形界面. 改id:3: initdefault: 3表示字符界面.