- 在线时间
- 480 小时
- 最后登录
- 2026-6-1
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7823 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2934
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1174
- 主题
- 1189
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
网上好看的动漫图集,如果手工下载太费时了。简单分析下网页地址规律,写个多线程脚本搞定。- #!/usr/bin/python
9 Y# x: }: E* B6 Y! e) P - # -*- coding: utf-8 -*-
+ t. P8 z+ r$ W) n% [- L& X - # filename: paxel.py$ N- z5 @7 h2 Z4 V) m$ g
- 9 E- Y- P+ }/ l$ E: `1 b; z
- '''It is a multi-thread downloading tool\" m- _9 t* }4 E! I3 y' w
- 1 B% C* G' i+ O9 P
- It was developed follow axel.
, X O$ T7 G' g- E0 u; M - Author: volans
+ C& i4 t) ~7 k/ S4 _7 L7 w - E-mail: volansw [at] gmail.com
$ {! [2 H1 r9 K: ?- J - '''
2 Y( Z z\" @3 G+ F, p# { - 4 h' f( t% X E/ ~! x
- import sys
; R8 v [+ | Y7 J, v! J - import os
3 S5 k5 a! U; n2 [ - import time8 e3 s\" Z5 \ h( E2 e2 c
- import urllib
# o. |1 K0 B% ` - from threading import Thread( [; G; j% I6 X1 ]) C
- 5 v; o; I3 b- N6 n( M
- local_proxies = {'http': 'http://131.139.58.200:8080'}2 H- ]% G1 @1 b4 v/ g) a) s
-
# o8 {3 S# F8 q6 x7 v h6 A - class AxelPython(Thread, urllib.FancyURLopener):/ ?2 M! C0 g' ?
- '''Multi-thread downloading class.! W6 C( z9 z7 ^, e* j$ k# e
-
_4 e3 f l0 ~) ~! n - run() is a vitural method of Thread. Z) r% Y: c/ F3 S7 r/ m
- '''
& I1 T+ R/ d3 J# w3 P - def __init__(self, threadname, url, filename, ranges=0, proxies={}):
\" n& U& D8 k9 l9 N ?. ? - Thread.__init__(self, name=threadname)& {0 S/ h/ J! o F/ k\" w
- urllib.FancyURLopener.__init__(self, proxies)
+ `8 S\" c/ g& {( i - self.name = threadname
3 C! z& q2 }6 W: x$ J - self.url = url
, q+ e0 D c/ C; ^% z5 S9 f1 D - self.filename = filename; L5 g8 `6 M, [: i6 J' L. j+ n5 S
- self.ranges = ranges4 h\" F, ^$ i) a2 M# s. w$ l+ U
- self.downloaded = 0 @% r, J5 i$ _: z
-
g) a6 I% X* f - def run(self):$ R/ a3 M% z6 \
- '''vertual function in Thread''': E8 y9 Y( L% Z\" a
- try:
) U8 f( t! Z) m& X p$ t - self.downloaded = os.path.getsize( self.filename )
( V\" [+ A+ ], @$ e. z - except OSError:
' c& s6 U! O+ w% z) Y$ h& f - #print 'never downloaded'
! j8 R4 N& r6 } - self.downloaded = 0
# m8 S5 o5 c! y: o: }( Q - & h9 ~$ @7 F; L: p9 l1 m
- # rebuild start poind
{6 J\" N8 U$ G% [8 v - self.startpoint = self.ranges[0] + self.downloaded
0 z9 O- @8 r; H C3 } - ! `% S/ F2 f3 E\" g, Q0 A0 t
- # This part is completed
3 l' c8 n/ l; ?6 V\" p - if self.startpoint >= self.ranges[1]:& i9 S5 s* j\" [6 y! _ {
- print 'Part %s has been downloaded over.' % self.filename/ W3 ]+ J( h7 |- f% V; b' Z
- return) ^: F3 S\" @, l, q( E/ x
-
; ?6 `- R: u8 W; D0 a, ~ - self.oneTimeSize = 16384 #16kByte/time
0 J( W& `/ @ N - print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])* ^3 S0 ]3 [: G* M
-
, @8 A9 i7 E0 P4 s/ W2 p - self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))7 A+ Z; }. g2 H% r# B
- ) p2 S\" O3 y7 L: P
- self.urlhandle = self.open( self.url )9 q! @# Y8 H# [1 {3 d3 \; L$ o
- + ]) } F: }( ^2 J6 H7 B
- data = self.urlhandle.read( self.oneTimeSize )
7 _, a2 ?2 _8 v* r - while data:
: |7 m( V/ n9 b' Q- r+ G - filehandle = open( self.filename, 'ab+' )\" H; E3 w9 @# C% h) [2 l6 T
- filehandle.write( data )
, L# ^2 Z\" Z! q4 T2 ?\" c; |/ U - filehandle.close()) A6 X! z3 U8 \0 u3 U; i; P9 m
- ; j9 R/ m1 K3 B r2 N: X; D
- self.downloaded += len( data )
* {6 m: R+ `8 ~ - #print "%s" % (self.name)
/ Z0 b4 w# ]0 l% l. H0 _ - #progress = u'\r...'7 o% t: c' ^: g
- ) t A$ d2 p, c2 v
- data = self.urlhandle.read( self.oneTimeSize )0 Q) a6 i i( F, K# k) M
- 2 l$ n+ s4 a A2 O2 I\" p
- def GetUrlFileSize(url, proxies={}):
9 t s' d( g% F4 l - urlHandler = urllib.urlopen( url, proxies=proxies )7 u8 G4 n1 X\" A; i% U+ {0 Q
- headers = urlHandler.info().headers V& L; d; r5 F0 k6 B
- length = 0+ M! E0 q) s6 b, c$ X$ z! M
- for header in headers:$ B+ G( ?, L4 z* _1 @
- if header.find('Length') != -1:
3 o0 f. M- B( s4 N# _3 t0 p - length = header.split(':')[-1].strip()7 `5 W$ q' {+ Y5 h. k
- length = int(length)6 y+ d+ A2 m) D. ~+ h
- return length
$ k6 i- c1 ~9 ^ t' I1 e -
, M* r, A1 O6 c# E6 [) A$ d - def SpliteBlocks(totalsize, blocknumber):. [- y. H- G1 F/ f# L. B; J' M( J
- blocksize = totalsize/blocknumber
: g! i+ C: N. d7 y - ranges = []5 a, Z% h z, u) t2 J1 u M
- for i in range(0, blocknumber-1):
+ }7 |. m1 h/ L% u* u - ranges.append((i*blocksize, i*blocksize +blocksize - 1))
+ @# Y' l! E+ }/ s8 p# x7 F - ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))& C0 r s! ?! j/ I0 Z# [. c
-
\" V& d u2 k/ y L - return ranges
' k, B; z5 G! E! t H; s - def islive(tasks):! E\" |, M7 R* F Y6 E1 E$ m
- for task in tasks:
\" E& V! t3 L2 a4 o - if task.isAlive():/ @\" I\" U% C# r- U- |+ s) S9 E
- return True
( X1 L' t2 N: P: F0 o - return False
* @) a5 Y5 k% d2 b6 z- z - 6 K. G% L |( m\" H& T
- def paxel(url, output, blocks=6, proxies=local_proxies):
. N4 f' D! e K- d5 \6 m: U: V1 C - ''' paxel. H. O) K& }( i. ]# e
- '''
+ n$ e/ \) b4 Z; H& i- O - size = GetUrlFileSize( url, proxies )
$ p: w' q1 Y$ Q- _! P1 } - ranges = SpliteBlocks( size, blocks )
; \' N3 R }\" F\" y! [* t - : v3 R/ J2 V/ ? F: }! Z\" @
- threadname = [ "thread_%d" % i for i in range(0, blocks) ]2 s3 j; W$ @! j% h1 W0 L% _6 @: M7 m* d
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]! e6 \! [, l! V- Y3 g D
- ' R# V, t: G: d
- tasks = []. ?6 n+ T5 M! g! K* Z
- for i in range(0,blocks):, ^9 s6 ?7 ~! c* |: z( Y) S4 I9 n
- task = AxelPython( threadname[i], url, filename[i], ranges[i] )/ k. ?% ?$ H. o' ]8 C\" g
- task.setDaemon( True )9 J\" k6 Q4 B( J, R& |# A
- task.start()4 z& y N! _1 c, M$ F# s; ~' Q# p
- tasks.append( task )! f: }3 G! w1 R3 O+ m
- 8 O$ ]' V3 N0 R6 N6 }\" c B4 R0 G
- time.sleep( 2 )
: H+ q3 f# c. q+ r - while islive(tasks):
% a) F$ s6 b- |. W - downloaded = sum( [task.downloaded for task in tasks] )2 f1 B* g2 J! }8 @\" i) P+ ^
- process = downloaded/float(size)*100
1 q1 |, X/ s U\" k - show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
6 o: ^- s$ ?% a0 }\" X( A - sys.stdout.write(show): N1 ]5 x; }2 a+ c7 m
- sys.stdout.flush()+ a9 H0 T) `, T; k& M) c) A; C
- time.sleep( 0.5 ). [/ x( G' o! z& B/ j6 J
- 7 v9 G) e: M! \# f
- filehandle = open( output, 'wb+' )\" a) M( a1 d$ b9 ]
- for i in filename:' `9 U$ V, {5 j$ a\" Q\" p- W
- f = open( i, 'rb' )
; M4 E* r. x5 x, K% m) u; R: W - filehandle.write( f.read() )
* |1 r6 Y% g, V5 e8 V - f.close()8 @; u) ^+ M9 ~\" }2 f- \5 G
- try:
/ D) m- O5 L+ i8 u4 ? - os.remove(i)( s$ w\" ~0 r. ]2 G! D
- pass- ]+ z) F/ E; M3 ^, ]& t: e
- except:\" _/ n$ e: R# t2 Z\" j0 h
- pass
3 a# W, ^; @$ ]$ h -
4 E( j+ O R, Q8 Y - filehandle.close()
& X3 A; l6 O) m2 M9 j& d& Z: _ -
/ C: D( A; P) T3 j - if __name__ == '__main__':
( k\" @) f% M4 ~6 V, |3 C, ]' ? - url = "http://xz1.mm667.com/xz84/images/001.jpg"3 P& L) i6 ?6 ?3 O: T8 f1 |
- output = '001.jpg'7 H9 v G3 ]8 B' z) _- ]7 A8 E
- paxel( url, output, blocks=4, proxies={} )
复制代码
+ l: R+ R0 o. r; U8 Q, ~ |
zan
|