- 在线时间
- 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
, I+ U( U( M! J7 P# I9 Y- C* D0 f - # -*- coding: utf-8 -*-
$ g( r7 j( ?) n z( @+ m - # filename: paxel.py
; u) h9 p* _1 m+ F- `5 ~ -
7 n& a* ]$ e8 [/ U0 ~4 V [ - '''It is a multi-thread downloading tool8 Q+ p7 _9 |) s0 K S/ v$ h' e
-
9 x$ C4 D+ U: ^) G& j - It was developed follow axel.; L& c8 ?\" A4 U$ M2 W
- Author: volans
# ?) N1 e8 L) d* [\" e - E-mail: volansw [at] gmail.com% x! N% ]* b* \3 H
- '''
5 c3 ~) h6 w% ` -
+ b. x8 X6 E5 {7 g/ L& p - import sys& a2 C2 K& H, @3 X. F1 w
- import os% `6 ]! n; a, | C' t( m
- import time4 I! n7 Y9 E0 B: p/ N2 b: M, l* L
- import urllib; l# M7 h' X' y; ]5 r
- from threading import Thread
1 ?& @+ Q) h; b( m - - a' K3 d% j+ H* E4 }. `
- local_proxies = {'http': 'http://131.139.58.200:8080'}
9 T& I+ s+ B* u0 i: p7 Q+ m -
9 L\" b/ v; X: E; N' g - class AxelPython(Thread, urllib.FancyURLopener):
9 H' T* B' Y- u3 U: v0 T0 r6 n - '''Multi-thread downloading class.
' a; s# k) h: v O! E# i0 W. | -
7 w, m3 T( d1 u5 L' M# r' q - run() is a vitural method of Thread.$ ]\" b- X8 p- x1 L
- ''' @; \6 j! h8 J0 P( y
- def __init__(self, threadname, url, filename, ranges=0, proxies={}):
+ f' E9 {* K* d0 |) j2 N, H6 j - Thread.__init__(self, name=threadname)
5 @- x& p3 ^! D& R/ ~2 t - urllib.FancyURLopener.__init__(self, proxies)
' ]2 n\" a. @5 i$ N/ I; {0 U9 |) R - self.name = threadname; {( g\" B! F6 k' C/ G1 ^/ _4 v' P
- self.url = url* m u8 P( [5 Y
- self.filename = filename
K1 C- \( Z3 f j' U - self.ranges = ranges# K/ h: F8 V, p* j
- self.downloaded = 0! i3 ?8 i6 G* o, m2 y, M
- % T; u6 ~8 v+ ]
- def run(self):
\" y+ z% q3 R4 L6 t - '''vertual function in Thread'''
$ } _3 k8 O1 e# t7 `7 S1 J+ H - try:
' v( g/ Z& O- @! |\" }8 n, t - self.downloaded = os.path.getsize( self.filename )
0 s6 }% B Y6 G* e7 G - except OSError:
/ X8 V$ d- r! u9 P0 c6 T, C0 t - #print 'never downloaded'
; m, [) z- {\" G- M x; | - self.downloaded = 0
: ^1 b0 `8 G8 U: G1 J! ] - 7 N; z' q! z\" m! [8 v: X
- # rebuild start poind
1 Q4 w$ a$ X& Y - self.startpoint = self.ranges[0] + self.downloaded: C* _# i9 H& w, p! z+ b
-
3 @! C7 ]. o3 X' k% L5 |) ?! Q' i - # This part is completed
) w1 ~/ w* N3 [0 i( ?* J - if self.startpoint >= self.ranges[1]:
7 T; v4 O5 Y2 x\" T( l4 r5 u# K3 v - print 'Part %s has been downloaded over.' % self.filename: o- G; |5 N4 f+ j1 R
- return\" X) {2 Q1 k. R. d4 _$ J3 V0 ~
-
, A* n2 }; l) I6 ^, e- z6 T) L - self.oneTimeSize = 16384 #16kByte/time; M( e- |\" N# _0 X; C
- print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])
6 H% G+ i i4 k0 w& P( m/ x% P' W - \" M% D8 \/ [% P) }; J* Y Q
- self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))
5 h: D- T, C# c' M. q1 j1 s6 s -
1 R% a: J\" c3 ^& l$ V - self.urlhandle = self.open( self.url )
\" j. d# b% E! c6 S - - \1 B. ^! W8 r1 u* f
- data = self.urlhandle.read( self.oneTimeSize )5 F\" G, d* O0 s- k, K- u
- while data:+ ^& f1 \, Y2 Y
- filehandle = open( self.filename, 'ab+' )) I$ E2 e) f# G. R\" i
- filehandle.write( data )9 \/ v4 m. D! ~( R
- filehandle.close()& ~: A+ M, H2 S- v
-
: s% }2 o( `$ U0 N# L' O7 J' U- m3 G - self.downloaded += len( data )
0 ?/ k+ Q4 w o - #print "%s" % (self.name)/ k7 K7 L4 s\" H0 e\" e' E+ C4 m: J* K
- #progress = u'\r...'9 k8 M0 |1 z/ J+ n9 j* p; a
- / d, B) d+ P2 K# f; T
- data = self.urlhandle.read( self.oneTimeSize )
4 }! h) J$ x1 J -
( z4 \2 q\" e# P. u$ o( E - def GetUrlFileSize(url, proxies={}):# n6 w5 T6 z4 ?, E
- urlHandler = urllib.urlopen( url, proxies=proxies )
' o( l: ? l$ r' b\" F- @) R - headers = urlHandler.info().headers- m2 c9 d+ u. l; s\" a8 |
- length = 08 R; p8 l; x) {
- for header in headers:! J$ ?7 W0 j+ T2 n# Q$ O; N
- if header.find('Length') != -1:
\" a* {% r0 s' J - length = header.split(':')[-1].strip()4 A7 k1 L$ F ^3 a2 h2 q
- length = int(length)- z+ E* I& K5 d
- return length# m# q9 z7 S' C+ e
- $ V: R$ g2 u& S# s: W, b\" y. Q# G
- def SpliteBlocks(totalsize, blocknumber):
8 G\" N$ x0 i: _\" F3 _\" U - blocksize = totalsize/blocknumber
1 c$ i% V3 S% l) \0 S* m - ranges = []
- f F. v7 K* O5 Z\" D* l - for i in range(0, blocknumber-1):
\" x5 m$ ?5 y- ]) ~4 L - ranges.append((i*blocksize, i*blocksize +blocksize - 1))9 M3 Q. u8 [# m/ I7 K
- ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))
; `) W* y4 r4 `: F0 x/ S' i6 [ -
+ F) e5 o8 Z7 m2 z- q9 f4 _ - return ranges
' b8 w* d6 o7 l& g7 f$ P - def islive(tasks):
/ o5 w9 t5 k' H - for task in tasks:9 s1 |) `( W3 {3 L
- if task.isAlive():: I$ ]- q, `# W, I
- return True
\" \/ B% X0 L7 ^/ T n - return False, \4 |: s( _7 Y2 r/ @, j
-
?& d$ F$ P# o7 r# g' w G0 v8 V - def paxel(url, output, blocks=6, proxies=local_proxies):1 l7 L: R1 H% R3 H( ~
- ''' paxel
J* W6 C9 r3 A6 Y4 W - '''
; K: g1 p+ M+ N2 X' H1 Z) T - size = GetUrlFileSize( url, proxies )
! M9 n g; ?' G\" i) Y\" `& o/ x8 G - ranges = SpliteBlocks( size, blocks )
) m- m6 J: |3 p& D* Z# C4 m8 \$ K -
* |' r1 j- p; ?# y3 V - threadname = [ "thread_%d" % i for i in range(0, blocks) ]; i% h/ @\" L; i% D3 W$ `
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]
% l/ v/ m9 b, t+ \ b( e -
; A% `9 S! ~9 K8 _% N\" g - tasks = []. [% [6 K8 K! B7 A
- for i in range(0,blocks):
& b1 V5 A- o, c& O* R\" ]6 W, A - task = AxelPython( threadname[i], url, filename[i], ranges[i] )5 ?' o' I9 O l/ s/ ]& _$ I/ Y
- task.setDaemon( True )
) u& F7 O; [; K1 ]: ^, E - task.start() A z) Y\" W) r# G& x
- tasks.append( task ) j! m( p. z F\" a
- * ]4 w' P; | ~% M1 ]. Q
- time.sleep( 2 )
8 ?, [) {$ Z$ r0 u% c, c; j - while islive(tasks):# l9 j1 G+ w9 l' L5 J/ w* [
- downloaded = sum( [task.downloaded for task in tasks] )
& a) j( V- a) x\" }) \ - process = downloaded/float(size)*100
5 M; l3 W6 ]9 o\" b. h f! j - show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
. v# A0 Q( x* [% P - sys.stdout.write(show)+ ]1 n- F: J* j8 ?
- sys.stdout.flush()2 }( t- b8 ?4 X5 {6 {2 G4 B* w
- time.sleep( 0.5 )
- q9 V! k! |& N9 r% @, g% I1 ^. H -
0 B- e: ^2 }8 }6 |: g. { - filehandle = open( output, 'wb+' )) v1 W7 u) C, Y7 |$ s) r2 M
- for i in filename:: [& S# k4 l/ j4 U, A
- f = open( i, 'rb' )
( A9 c0 a1 d+ D; o \ - filehandle.write( f.read() )
: D }9 G* T. N0 E - f.close()
+ O& u) e0 S/ J8 w - try:$ W4 ], P2 i) M7 [) C- i6 ~9 H9 y. d* W
- os.remove(i)/ x' f9 C( N3 b\" T+ k- |$ V. v
- pass
; y1 e4 C3 n8 P1 @, S\" d - except:
' a1 R, |8 ~1 V, D - pass
) J4 B9 N1 V0 T -
5 w3 Y9 @4 t8 J) ^; l5 ~7 q% B* E - filehandle.close()4 K. I\" \( n: _( q) l8 w
-
/ g- P7 Y( P8 O3 c9 H- d - if __name__ == '__main__':\" a, ]/ w# N9 b6 h$ Y
- url = "http://xz1.mm667.com/xz84/images/001.jpg"# L7 h8 [5 t0 T }( m: O
- output = '001.jpg'+ I3 y\" l, `' Y& C8 n' }
- paxel( url, output, blocks=4, proxies={} )
复制代码 , h% X+ ~& u( S8 M8 L8 i S
|
zan
|