- 在线时间
- 481 小时
- 最后登录
- 2026-8-25
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7859 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2946
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1177
- 主题
- 1192
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
网上好看的动漫图集,如果手工下载太费时了。简单分析下网页地址规律,写个多线程脚本搞定。- #!/usr/bin/python
7 f& d, P$ k B, b - # -*- coding: utf-8 -*-7 }! c4 [4 @% k
- # filename: paxel.py
) J/ R* ~3 f! ^3 L - \" c( n+ {: L: l
- '''It is a multi-thread downloading tool
1 a% l$ q3 \4 f\" f! L( c- m - / n8 L8 f7 H: q! l1 f
- It was developed follow axel.
' \6 C$ W% n* u$ {9 K) C$ C! @ - Author: volans
# N0 G E$ I- s$ [8 t4 [0 s q$ l! | - E-mail: volansw [at] gmail.com. q: {! r0 V1 p
- '''6 V/ s( }5 @& \/ U
-
2 y( D H6 ~- v - import sys
% G' {: _6 E4 [, U: P+ E: ? - import os' W) H f% Y. z2 c\" L' T
- import time
% G3 `7 N# s& \; D4 L\" w1 N - import urllib
& C* p& y) w6 X) y8 D6 A - from threading import Thread( S0 ]9 q& q+ Q( G( p' w: M# f. q
-
}7 Q1 I. I5 w$ r - local_proxies = {'http': 'http://131.139.58.200:8080'}
3 Q2 U% c& h Q) ^ -
! }) j) I: D/ G3 Z& W* A1 N - class AxelPython(Thread, urllib.FancyURLopener):
4 J9 B$ G3 S' u4 @ - '''Multi-thread downloading class.+ |7 U; A; ^ P+ B. u4 V
-
8 @! Q, }9 ]% Q - run() is a vitural method of Thread.
; d\" ^, J$ f @% g0 U6 v - '''
. s! ?) ?& M* ~/ j5 P - def __init__(self, threadname, url, filename, ranges=0, proxies={}):
; F+ \: x6 x6 U - Thread.__init__(self, name=threadname)* Z( e& X5 O) j' O2 \
- urllib.FancyURLopener.__init__(self, proxies)2 x' G4 ? J6 ]\" ~
- self.name = threadname! m4 s5 [& U- v5 I; r& p
- self.url = url
- [) Q/ \/ y( }* h. Y: ?' i - self.filename = filename
7 D# z* V\" k+ }6 o, r2 r) c* M - self.ranges = ranges
$ V8 O6 `' R# a+ F. U4 [* T - self.downloaded = 0+ L\" q7 j6 ~9 x# ~
-
\, t# c4 U+ \6 K3 V - def run(self):
% i- U4 W5 ~7 c( B# [- o) g4 i - '''vertual function in Thread'''3 J+ d) h4 r) `5 a2 V+ ?
- try:
; E' l2 D0 x2 c4 y - self.downloaded = os.path.getsize( self.filename ) a. s6 U+ F, ]
- except OSError:0 @* G9 ~* M- {* L4 {
- #print 'never downloaded'- E z0 \- q& h6 {. [- L! Q6 r
- self.downloaded = 0
& M1 w\" g+ A, ]2 J/ j( `8 z - % E$ ^8 s4 |\" o) ]! g) z
- # rebuild start poind
6 ^+ F/ a; J& b2 d - self.startpoint = self.ranges[0] + self.downloaded
( N9 v1 e3 K0 K\" h3 q. [5 k( e - 3 @$ O' j' k8 M3 G
- # This part is completed
% Z5 b7 s$ G0 q: a - if self.startpoint >= self.ranges[1]:
5 [+ }3 w2 A$ F9 l8 @ - print 'Part %s has been downloaded over.' % self.filename& b) w- b, b/ g$ q4 U
- return
3 _) ?, |- ~8 u! ]% q - 9 f$ ^0 K6 d) N* y& `! ?5 Y
- self.oneTimeSize = 16384 #16kByte/time$ |\" a0 { F* G# \* B
- print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])
+ q4 U' G% u* V. g/ A -
, Y2 ]$ k; {0 G! c+ Q - self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))4 J$ [. O* u9 r) N: @2 K) K9 @
-
0 m/ [! z! u9 B2 _- n6 Y( t) f7 _ - self.urlhandle = self.open( self.url )
* L1 u* ~) t1 V1 ]* z1 F- Z1 K+ o - 4 { M j* Q% v. J% M0 \5 X a0 I
- data = self.urlhandle.read( self.oneTimeSize )
( i) g8 L& C2 g( f- d& e( Y% k; N# Z - while data:0 n$ G: k' s _& ?& w8 _( L# Y
- filehandle = open( self.filename, 'ab+' )\" m/ z, H$ |# g
- filehandle.write( data )
7 Z% M& l# A k* D5 g* _\" G& m; m - filehandle.close()4 z# d1 l# P( S; b- u
-
/ u- W( D/ J2 f5 Z# N - self.downloaded += len( data )
\" A W; \9 R( i, l; `1 l/ B9 A - #print "%s" % (self.name)3 a6 p0 |7 g; Q
- #progress = u'\r...'
3 \9 P- X9 _: }- i\" Y - $ Q& e$ |% d) o1 f1 N( I
- data = self.urlhandle.read( self.oneTimeSize )4 r8 e0 e9 B; _! _% \2 u
-
: t# Q6 `0 l# a9 [' a - def GetUrlFileSize(url, proxies={}):# C1 v, W\" r# W+ h7 Q/ U& h. Z& n
- urlHandler = urllib.urlopen( url, proxies=proxies )1 t4 k8 P' z, G6 o2 S5 L& N
- headers = urlHandler.info().headers! b r C H3 Z8 `) e z/ K
- length = 0. Z+ |' R5 ^6 V- m0 w6 k1 C6 M5 W
- for header in headers:
# C# [: ~7 Q: `$ @3 r\" c+ { - if header.find('Length') != -1:
( k9 E! ]5 ?! E- d# K R - length = header.split(':')[-1].strip()
: j0 v& k9 \* F5 s4 o% C5 L& a - length = int(length)
' B5 ]& M% ?- x& f# m {& {; c - return length u& r7 z c\" t
- ! J5 x5 k\" D# [6 \
- def SpliteBlocks(totalsize, blocknumber):
7 R/ n% l6 k/ t6 c - blocksize = totalsize/blocknumber' Q$ q8 o8 u3 \4 \
- ranges = []
# g H( ^: \. p% {) g; q - for i in range(0, blocknumber-1):
7 W9 M% n/ d# R - ranges.append((i*blocksize, i*blocksize +blocksize - 1))
$ Y4 r2 m6 S* | o# D, d - ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))& ^, X3 R4 _1 q4 E* P
- 7 d3 ~' P& b& M1 g/ z# X9 ?/ `
- return ranges: z6 I+ Y( @8 Y\" a2 n
- def islive(tasks):1 ?0 B7 E [& l( w/ j7 w1 @) m2 k
- for task in tasks:& }0 C5 ^! V4 N+ d
- if task.isAlive():
9 j6 C- @: m( z8 C! t - return True
2 n\" E: }8 p$ o0 t - return False& R: P3 d T4 B r/ E# I$ a: T
-
@7 B( o) s- M$ ?8 N: C - def paxel(url, output, blocks=6, proxies=local_proxies):
\" I1 b3 g' s4 O* f; X - ''' paxel/ q' K5 }\" ?' N0 Y8 P
- '''
$ u5 o7 q( ^& I; P0 R+ N - size = GetUrlFileSize( url, proxies )
% W! r: k' O ?+ f4 X l8 V6 J; n - ranges = SpliteBlocks( size, blocks )
+ r' k8 m$ }5 l/ S5 X -
J# b; e5 V7 ]5 k - threadname = [ "thread_%d" % i for i in range(0, blocks) ]/ E! \4 G6 _/ x: T& F
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]
2 K$ C2 A/ B$ j' q! I9 W# b -
5 J1 B+ m9 R- D3 M - tasks = []
4 ?# F% l6 A\" { K! W - for i in range(0,blocks):
- u/ |2 q/ H\" k5 Z% |% m - task = AxelPython( threadname[i], url, filename[i], ranges[i] ); @! F2 b8 P' A$ S* a( O' L
- task.setDaemon( True )
6 }7 u- F! I+ F' i - task.start()- Q. f, y. H( `
- tasks.append( task ); V% f, x9 q; U; ~& B, g; f8 r
-
6 ]. ^3 }- F4 }( A/ n7 |- x - time.sleep( 2 )- v% _, G& K0 r
- while islive(tasks):
5 h9 N# E' k: ] - downloaded = sum( [task.downloaded for task in tasks] )\" f$ x7 q\" _, I T) R
- process = downloaded/float(size)*100
9 A, j3 [# ?; B U( v f - show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process) t7 {, u: L5 W+ I- b/ W3 U7 v
- sys.stdout.write(show)4 {. x7 M( o( Q# R
- sys.stdout.flush()
( h. g/ j' w+ X2 C - time.sleep( 0.5 )
+ c$ _6 f- C; U- `# Q5 [0 K\" y' z -
5 E U\" i: D5 p - filehandle = open( output, 'wb+' )
# v' ^1 s9 |& a! @ - for i in filename:
3 k8 x* j, j; o/ P3 r\" } - f = open( i, 'rb' )
2 ^0 ~\" e5 F+ c - filehandle.write( f.read() )1 l8 ]) w0 S v' g6 Y
- f.close()
[5 o3 Z$ F$ W. t - try:
( a# o# g9 o- O6 g& X+ `9 h - os.remove(i)
& o, Z0 {9 u0 g& J3 z }( Y - pass5 \. \. s& u1 }# X, H! E4 ^
- except:
# j! J ]+ ^$ U3 G+ g- a8 [7 C% \ - pass- ~$ p2 e5 Z+ Z; p; g/ p/ a
-
- x! }\" q+ Q; H6 B8 d2 t$ d - filehandle.close()2 X' F2 A9 p: [9 C6 v; e
-
2 l' o# H+ a% P7 G - if __name__ == '__main__':
8 g9 t1 I/ G- l+ b4 \ - url = "http://xz1.mm667.com/xz84/images/001.jpg"$ s! R6 _: q5 O+ Z
- output = '001.jpg'
. K: a/ y' q. q4 v7 F$ f9 e5 k) N - paxel( url, output, blocks=4, proxies={} )
复制代码
- S# s- L6 i! h |
zan
|