- 在线时间
- 482 小时
- 最后登录
- 2026-9-11
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7953 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2978
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1183
- 主题
- 1198
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
网上好看的动漫图集,如果手工下载太费时了。简单分析下网页地址规律,写个多线程脚本搞定。- #!/usr/bin/python
/ ~. d) f. Z, n& o/ C - # -*- coding: utf-8 -*-# I' \6 z1 }' q+ H) G/ l r
- # filename: paxel.py0 F5 f! a( a: `' o4 h; h3 B+ a
-
i# ^/ ?8 j0 A - '''It is a multi-thread downloading tool/ H) o% o, y9 r0 @8 [0 J1 x
-
u( y. g# U\" F) N# Y - It was developed follow axel.8 x9 [, L* h; g9 Z! \( N1 F8 h
- Author: volans2 Q, B4 r- S% J# D# `) Q& a
- E-mail: volansw [at] gmail.com
) C7 P! \0 C/ C% Q! w9 W - '''2 g; D% j1 U9 l# P9 q
-
* ?0 p( p# P# W. [2 G\" p - import sys' S4 r\" E$ V l6 u7 g: I
- import os2 E6 c# S' L. J, H8 g4 c
- import time
8 T; v0 k* ~5 n& z$ T' \$ T# X - import urllib
9 _* f+ W) P: ]: d8 a - from threading import Thread
Q# @1 e8 I4 ?7 L& M' F2 r -
/ i Q% {% f3 g - local_proxies = {'http': 'http://131.139.58.200:8080'}
6 U: k3 L& }\" w1 X5 S/ p - ; ?/ A' _9 A l1 A9 r+ }3 ?
- class AxelPython(Thread, urllib.FancyURLopener):
; ~: ]# s$ ^( z. b2 ?) p - '''Multi-thread downloading class.
) Q( g\" P# i% x -
7 ^+ d) |3 {) H$ }1 ~ - run() is a vitural method of Thread.
6 Y: Q7 w; t/ g( c; } - '''2 W4 Q3 t8 P1 [% D/ {
- def __init__(self, threadname, url, filename, ranges=0, proxies={}):
4 l8 i5 A+ T3 G% ~ - Thread.__init__(self, name=threadname)
: [* \1 X: W& k - urllib.FancyURLopener.__init__(self, proxies)
: V+ M. f1 _( x& U2 g# S3 E+ }& J - self.name = threadname
$ Z1 d: s- @4 P- G1 O% H' E - self.url = url! \2 k. l% r/ t6 K\" R3 O
- self.filename = filename- t7 K) L7 B( G) P% {
- self.ranges = ranges
& ^2 Q: k8 w! d* [; D\" ]5 f$ m - self.downloaded = 0
% w8 m9 v0 O+ g, a/ Q - ) U9 n% v' J* r3 Z& I* u8 W
- def run(self):7 ?) K* d2 W% H! P4 X, m& k
- '''vertual function in Thread'''3 D8 t& S0 w; `; m% z' \1 v
- try:
6 J( A& U& s6 W( H( _ - self.downloaded = os.path.getsize( self.filename )2 F\" x+ K: x- \2 j k7 n8 L1 M
- except OSError:0 S. g6 ~6 D$ u0 G\" D$ d' j
- #print 'never downloaded'
6 J6 T9 d0 w4 B6 U, i - self.downloaded = 0- `5 N3 a2 e\" n0 f0 W# N
-
/ | G% J. c# x- l1 O6 i4 I* x - # rebuild start poind
! `) x9 U* p* W# \8 b0 t( P6 O3 Z - self.startpoint = self.ranges[0] + self.downloaded% `# D0 g/ T* Z* Y7 W+ z. k! a- o
-
# T) z/ t8 M\" ^% e\" d+ W+ m - # This part is completed; t; D/ P) S9 T/ }
- if self.startpoint >= self.ranges[1]:
$ j: ~6 P K. b3 a- J - print 'Part %s has been downloaded over.' % self.filename/ @( B: M! l' x
- return; G) F9 ]) u; i8 `! c* a/ ^* V5 u2 s
-
: P4 M: W; C# K - self.oneTimeSize = 16384 #16kByte/time
' ~+ k9 H$ o( e\" s+ P4 z( O- M - print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])' |\" c\" @% d- I+ h) t( T7 V
- : \5 o6 U0 K) _4 _. o6 Y
- self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))& t1 o) u. E# Z; D8 A% C ]
- 8 C# T v& z+ b3 Z5 q) ?
- self.urlhandle = self.open( self.url )4 [2 j, L* G4 h8 m; I$ g% G
- 9 G8 Z, I' y0 U0 l( _+ ~
- data = self.urlhandle.read( self.oneTimeSize )
: v4 F$ g2 i. t6 n\" }% p - while data:
0 u$ m1 b3 ^7 | - filehandle = open( self.filename, 'ab+' )
! J\" l: Z/ L1 K% O - filehandle.write( data )/ }; [. ?6 M) W b4 |9 Q
- filehandle.close()0 z( o\" u/ p5 \5 |' |
-
\" g) J* R& P# e* h1 ]& z - self.downloaded += len( data ). _7 P; l/ o\" m) S
- #print "%s" % (self.name)2 Y# r$ V3 B3 d6 c
- #progress = u'\r...' M' f# L/ @2 F. F
- ( J$ e% @& i# t' b* |4 G
- data = self.urlhandle.read( self.oneTimeSize )
: }/ n' j9 ]$ ]& T _' e. O( A5 b -
\" ?7 v% z9 P `7 d5 J - def GetUrlFileSize(url, proxies={}):0 H+ ]: Y- v; y; E
- urlHandler = urllib.urlopen( url, proxies=proxies )8 e- ^\" A5 S1 T0 S, I; D
- headers = urlHandler.info().headers: s2 f& I* r\" ?\" K, B
- length = 0
7 U4 u1 u5 b- j2 M# a - for header in headers:
2 ~7 n9 e5 A9 G; H: r\" |: m0 f3 ]8 D - if header.find('Length') != -1:
' r6 f0 G# B& i7 b1 [* F# J% E g7 x - length = header.split(':')[-1].strip()
8 V0 i# Z1 M* {( n, V8 ~9 w - length = int(length)9 C% ]; R* R/ k/ g* T) ]$ w* y\" R
- return length3 F( o) f8 C4 U t' b, {
-
) o' B! e% h6 N1 q/ f - def SpliteBlocks(totalsize, blocknumber):\" p( r3 }% Z# \# n9 p/ H
- blocksize = totalsize/blocknumber# c- `/ `2 a5 ~1 ]1 T. ~6 m3 x: s
- ranges = []
; H; `7 n\" b. W4 K, _6 e - for i in range(0, blocknumber-1):/ D3 f/ R$ V\" {/ ?
- ranges.append((i*blocksize, i*blocksize +blocksize - 1))
+ z0 J5 r/ E5 g - ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))
, I8 h6 u9 y. D) g# J( A -
# N- L& A$ m; b& s! N6 F, J - return ranges/ k/ G S) F. O! H
- def islive(tasks):
$ p\" a9 O; {5 p/ q6 D C: E9 i - for task in tasks:$ `6 K# B) |7 r9 h, k$ ^, t& e
- if task.isAlive():
# M6 _5 c/ L, n! J# x& G - return True+ H- Q\" [- R' e. e
- return False
9 U, M/ S: [+ ~5 e8 Z/ x# Y - % p8 s# ~2 L' e: g5 E! s: A
- def paxel(url, output, blocks=6, proxies=local_proxies):5 G& |6 y\" S- a
- ''' paxel( B* W u# [0 A$ ]7 Z L! v- o3 d
- '''9 B/ m3 q5 Y' n& h
- size = GetUrlFileSize( url, proxies )
P: @% J0 B' ~+ l+ H: j/ ~4 c7 E - ranges = SpliteBlocks( size, blocks )7 C( E! H! r' l4 s. L1 L
- P) S; {+ g' y3 t, l! d$ [
- threadname = [ "thread_%d" % i for i in range(0, blocks) ]4 ]6 z8 U4 N& |; r
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ] _2 Q& x2 l0 J/ r4 s
-
( U0 w\" R: ?3 U. k9 k F - tasks = []3 E\" G$ J w; o+ k9 b2 F1 [
- for i in range(0,blocks):
\" h2 z0 q% y5 ^- }+ _ - task = AxelPython( threadname[i], url, filename[i], ranges[i] )3 h7 M( j5 z7 ^8 o* F6 R
- task.setDaemon( True )\" t# ~- j& ]0 @5 |
- task.start(), u- Y# V/ X7 z8 [! J1 k$ h' m
- tasks.append( task )1 r: t+ ?7 m/ m! e: e\" T
-
4 |/ v- [0 a\" O$ W' y - time.sleep( 2 )! ~! `9 X$ g- w0 ?
- while islive(tasks):
# @) S) Z/ h; w0 o\" o - downloaded = sum( [task.downloaded for task in tasks] )
Z& {: W3 N* u! N+ }% {9 W - process = downloaded/float(size)*100$ Q* Z$ F. h- i( K% a\" j
- show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)* l1 C5 v x/ ~' ^6 `& S7 M
- sys.stdout.write(show)* M' ^5 O; q) W) b0 ]) A
- sys.stdout.flush()
9 C' U1 ]' G. c! a3 ~ - time.sleep( 0.5 )
6 g7 |9 m6 A& ^& e0 n -
, [* L& B* g9 H - filehandle = open( output, 'wb+' )* W. p# X/ j5 ?: d
- for i in filename:
7 o; V: `) V' b! M - f = open( i, 'rb' )- Q0 Y) E4 j1 n0 R( L m
- filehandle.write( f.read() )
4 |; f/ {6 t/ I/ _ - f.close()
# p* k' m9 q) a - try:
5 i% i3 g) g9 p+ w' c - os.remove(i)6 a' U* v+ A4 _0 O2 Y- a$ _: }
- pass: Q1 _+ q( \, q' L: |+ p
- except:
+ u\" x0 Z7 N' A6 v6 J0 Q A7 }& D9 G0 [ - pass
( x' G: I6 y. k& e - + {8 J( r- T( Z
- filehandle.close()# T) L$ q. d1 ^1 Z
- 4 R( b* R$ A, {$ P* g/ R% b1 @
- if __name__ == '__main__':7 y\" f/ i' @) A% M3 y4 I/ C- z
- url = "http://xz1.mm667.com/xz84/images/001.jpg"
- Y, K( d4 ~6 U V( I: [1 [ - output = '001.jpg'! a) z/ T& L\" M/ j0 J
- paxel( url, output, blocks=4, proxies={} )
复制代码
9 b( J" [9 W S: o6 }. C+ S$ @ |
zan
|