- 在线时间
- 479 小时
- 最后登录
- 2026-4-17
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7790 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2923
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
网上好看的动漫图集,如果手工下载太费时了。简单分析下网页地址规律,写个多线程脚本搞定。- #!/usr/bin/python
/ B/ E. x8 W! \& j g9 E. S$ p. m - # -*- coding: utf-8 -*-3 x, v/ d! S7 V
- # filename: paxel.py
1 s; c\" I1 [1 {/ _; t* M& G - : K+ V+ k8 t, p6 L) s, j
- '''It is a multi-thread downloading tool
4 v+ T7 [5 H8 V: H -
: b, B# m: v5 l5 ^/ ] - It was developed follow axel.
$ ^: p7 x9 k* |( D - Author: volans8 q\" ~ C! u; w* O8 l
- E-mail: volansw [at] gmail.com- w; [& |9 b6 Y% |4 G
- '''* N9 `& B' y z r/ d! v; D M
- 5 x9 @+ W8 z3 f+ k
- import sys
! |4 l# V) X/ C\" F - import os: @( F1 v/ w0 k0 Q3 c6 Y% f6 D
- import time
% d- }: y\" n ]( w' p% i0 b - import urllib. P) Y$ W# n0 K\" k
- from threading import Thread; ~\" V3 e6 w! p5 g
- 8 X1 ]7 Z0 I3 A
- local_proxies = {'http': 'http://131.139.58.200:8080'}- E1 u( Q# u- R. Y
-
, }+ e G. e& B8 b5 z, p1 Y - class AxelPython(Thread, urllib.FancyURLopener):
( L% X( ?3 B/ i( Y% x( e - '''Multi-thread downloading class.8 ^+ R+ k# t M5 d
- . w$ f/ t8 z\" l
- run() is a vitural method of Thread.
+ ^ I( e6 T' I% `1 ? - '''7 A, m( l( P/ r' _5 c7 \5 N- K5 C
- def __init__(self, threadname, url, filename, ranges=0, proxies={}):1 m2 q9 z% `; x$ g6 O _
- Thread.__init__(self, name=threadname)
/ P) f$ B& K% }, S - urllib.FancyURLopener.__init__(self, proxies): d, {' F( |4 g! e, [3 ^! t
- self.name = threadname+ l4 N0 K5 m: T( o( l
- self.url = url. d' V* C4 f- c; m' M! w\" s& E+ B
- self.filename = filename
& m+ l/ G7 O+ m4 P$ N9 P3 x/ x - self.ranges = ranges. K! `2 q1 T' x& ~3 e/ E
- self.downloaded = 0
- k+ c\" k) {4 Y6 U4 Q4 V - 9 ]! B8 a* Z) [+ h7 v8 W3 D
- def run(self):
0 w! g% A/ s- K/ U4 Q1 r Y- f% R - '''vertual function in Thread'''4 ~0 q1 A8 K5 n3 H
- try:
\" o+ R9 P' y: h% u4 s\" {: Y - self.downloaded = os.path.getsize( self.filename )* b( }/ Z% K; i( H
- except OSError:
8 T8 m8 H, N3 Q' C - #print 'never downloaded'
, L) j0 a. O% k - self.downloaded = 0 ^2 |6 d3 D) V2 l+ o% R H
-
' z8 `\" N/ v# m, i - # rebuild start poind5 d& T; ~\" Q- b7 Q\" ?) ]
- self.startpoint = self.ranges[0] + self.downloaded' n5 T4 u+ U5 C% q
-
5 R4 i\" U% k$ J- b+ y& B - # This part is completed
; d- a: ]: C- I\" Y% e1 a& Y - if self.startpoint >= self.ranges[1]:8 `( C6 s% C- H! t
- print 'Part %s has been downloaded over.' % self.filename
& R P {8 J1 F% t3 T - return
) c$ ^6 {* k; b0 Y! f -
4 w3 ] Q2 r/ D2 H- V - self.oneTimeSize = 16384 #16kByte/time
7 ]3 M+ B4 m1 W; } - print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])- O* o* n$ `; R
-
F8 a6 i/ r; O# z, j% ? S - self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))& }2 D+ o8 ]7 I1 T\" G! v0 N& o5 x
- ' N8 k3 I1 x\" X
- self.urlhandle = self.open( self.url )
, m1 j; N6 A6 v3 s& \ - ' n9 l4 m7 Z2 i0 { B3 m
- data = self.urlhandle.read( self.oneTimeSize )
$ ^\" W+ Y1 E! o4 x - while data:1 F4 M# ^5 Z! q\" E: M
- filehandle = open( self.filename, 'ab+' )
* C1 U( B. e7 N: b( I7 J - filehandle.write( data )
. I) l# U3 |3 O9 J\" F - filehandle.close()
' G- C$ k5 l w% e* L* q. ? -
& x) E P; n* V, f! O. A0 V2 G; u3 i - self.downloaded += len( data )
/ o# g) n; J! p7 m& |; q: r- c* W - #print "%s" % (self.name)& i: ~6 o# [7 |7 u# ~ I
- #progress = u'\r...'; g g! j2 u5 r4 t
-
( A( f; _! m9 d0 p# H) I - data = self.urlhandle.read( self.oneTimeSize )
5 E! Y j+ C! F, \ -
0 f1 }- o1 G( o$ v8 I# F - def GetUrlFileSize(url, proxies={}):2 X+ @/ R( w3 e5 j, `' m
- urlHandler = urllib.urlopen( url, proxies=proxies )$ k2 Z3 b( e+ K' S6 i
- headers = urlHandler.info().headers
# c2 {5 _( g+ q - length = 0( \8 ~3 j2 y1 z; C2 L$ Q
- for header in headers:
4 q/ H8 }% v- \8 Z+ a2 R5 W - if header.find('Length') != -1:
- M+ M- m/ I. k* h( Z2 z - length = header.split(':')[-1].strip()' T: v' O2 x\" p1 r' t
- length = int(length)3 g- c6 i6 F! `% f2 ]7 e
- return length! B w3 k3 U8 g1 w$ ]
-
+ |& I8 X+ ? U3 e) `/ `+ v - def SpliteBlocks(totalsize, blocknumber):8 O* j9 T& I8 K; P1 W. y
- blocksize = totalsize/blocknumber
0 X9 m+ o3 i4 D - ranges = []
% P; K; V. [) w% |# J. H; r- k - for i in range(0, blocknumber-1):
* x1 V5 j% M2 E( f0 n8 p/ ~! w - ranges.append((i*blocksize, i*blocksize +blocksize - 1))- O, w% Y& F% B* _- {
- ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))
) n# Z f0 l8 C% ^. P/ K& G - 7 Q: }* Y( ^! l( L# k/ T6 S$ p
- return ranges0 z5 p/ b% L1 x) }1 e
- def islive(tasks):1 S+ n/ \; J* A6 S+ L5 g
- for task in tasks:% ~- ?/ J\" k$ g; r# D
- if task.isAlive():
- G2 T, c) R) O\" ^' U8 e - return True1 J U1 s: }- p. a3 y
- return False
7 u! j0 U: Z4 C: T - / H3 R; R* V, j \9 C/ c+ u( F
- def paxel(url, output, blocks=6, proxies=local_proxies):# ~( E2 z7 ]0 e9 d
- ''' paxel# S; j8 R9 B% v, [3 R& G
- '''0 F5 ~$ s: {1 ?( I, N\" n6 G
- size = GetUrlFileSize( url, proxies )
' S/ b; v% P1 z$ W5 U - ranges = SpliteBlocks( size, blocks )
- F8 }, R6 j/ I8 ?1 a8 l - $ s! ]5 y: H\" H* d
- threadname = [ "thread_%d" % i for i in range(0, blocks) ]/ J4 U7 w5 n5 \% i3 V% @
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]
- ^& x1 v. Q* N' B. ]. J' {* }* A -
9 v! x3 J! ?1 E( }% ]# K- ^ - tasks = []+ K+ [1 \7 d0 A$ w# \, B# X; s
- for i in range(0,blocks):
: w& B\" u, u$ o M% v) S6 p - task = AxelPython( threadname[i], url, filename[i], ranges[i] )
! f8 g$ \% r% ~; u: S/ k9 U - task.setDaemon( True )
' V/ ?8 T( N7 F8 z - task.start()6 ^7 w: x k+ o q\" S0 r
- tasks.append( task )
% q+ i7 G; L2 a5 Q' k -
2 n. f# n9 f: ]9 S$ G3 a g; W6 c# b - time.sleep( 2 )
: D5 ?0 Z5 j5 [, {% u - while islive(tasks):1 y4 l& t& o\" w+ _
- downloaded = sum( [task.downloaded for task in tasks] )
, c* q# P; O# r# V# L' E. v - process = downloaded/float(size)*1006 M- t$ r: |5 Z! P4 z& ?+ P
- show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
' n6 M. A7 Q% a7 j$ {) d; V5 _# e - sys.stdout.write(show)
) C3 N* t7 i3 f$ k1 e: }& b - sys.stdout.flush()
1 w& v+ s1 d5 J! f( \0 Y - time.sleep( 0.5 )\" c; q' F7 e, i5 K! t
- , P1 }7 h8 O6 z
- filehandle = open( output, 'wb+' )& a; b; w1 o, I
- for i in filename:1 C+ I, X9 J$ ^( I1 @- y* e
- f = open( i, 'rb' )6 q3 `' `) D h; D+ f
- filehandle.write( f.read() )9 i& u( o6 q% n* B( V+ z
- f.close()
4 c7 Q, ?3 g3 U4 _7 ?+ P+ Y - try:
& i5 c* j' [% X( `: X3 h - os.remove(i)
; y; ^4 O( i\" S7 u9 X' ^ - pass5 Y8 j0 ? `. N$ M; C8 R
- except:
5 N$ y3 g9 {. x( t( ]1 C( k\" b. y - pass, Q7 \$ k, z% {
- 9 P' \% o1 p( M, b4 R
- filehandle.close()
0 l; D9 w4 m+ i) r1 \. k) ? -
' ]! c6 y6 s R1 N. D7 Y: Q - if __name__ == '__main__':; a4 S4 E& E4 u$ v0 b
- url = "http://xz1.mm667.com/xz84/images/001.jpg"* C2 N1 o- L) d7 G( {0 u, [* b7 E
- output = '001.jpg'/ @: {( }3 Z7 y, l5 c! d
- paxel( url, output, blocks=4, proxies={} )
复制代码
* p/ }9 @6 `6 X' v/ z1 g |
zan
|