- 在线时间
- 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' H9 j6 {* c, R4 O
- # -*- coding: utf-8 -*-
, i0 F. X, b8 f - # filename: paxel.py7 L\" I9 ]: H, z, G+ w
-
8 f9 C$ F! F5 o6 e7 ~ - '''It is a multi-thread downloading tool
$ }5 u0 a: `5 W9 c# W - - B% k, L4 Q, C- G- Y
- It was developed follow axel.
\" b+ F2 Q6 _\" c - Author: volans O8 e- P4 j2 B/ C. ~
- E-mail: volansw [at] gmail.com
( `/ X; ^+ C5 N - '''
* G8 L9 z% [, Z3 u3 O# {7 ~; [ -
; _5 V, c. [6 k( H+ x/ _ - import sys
; p; b8 x- ] _ s - import os, Z9 n% Y# i& b: `6 v
- import time1 r7 T4 S0 E( N8 P& C
- import urllib
; e# t\" [, ]7 }, n - from threading import Thread) G1 d9 k' O! j( B: {) v
-
( _: V0 K) O& m - local_proxies = {'http': 'http://131.139.58.200:8080'}
- U- `. C2 o1 V6 |. O -
( B. w* H! x7 N - class AxelPython(Thread, urllib.FancyURLopener):
( G. d8 E9 |5 e% C! y; S - '''Multi-thread downloading class.3 ~5 q7 T, _1 p* ~
-
\" ~* r/ r, A: t. t - run() is a vitural method of Thread.
$ R v* [6 f. }# s! j - '''# M4 V; D9 Q2 Z9 B
- def __init__(self, threadname, url, filename, ranges=0, proxies={}):
% j$ E Z9 t( S7 @; y# H1 N - Thread.__init__(self, name=threadname): Q; l5 o9 l# }\" U
- urllib.FancyURLopener.__init__(self, proxies)
5 L9 L i0 J1 i2 R, D8 m3 s - self.name = threadname) @: S5 T1 y3 q/ E
- self.url = url
% O2 U# S. W3 f - self.filename = filename
6 { ^5 q6 r) }$ W3 Y5 \ - self.ranges = ranges
) p6 r' ~2 s- C* ]; P. ~ - self.downloaded = 0( l A5 u; Q4 u3 z! n- m
-
\" ^, u% G7 r+ O+ u' s, Q0 \ - def run(self):
' W0 h\" X' I. D& {6 F - '''vertual function in Thread'''! ?9 U( x# \+ B' v
- try:. m* n: w0 j( @# s
- self.downloaded = os.path.getsize( self.filename )
$ y, O# m; v( p - except OSError:' M) |6 H# U/ C2 W6 R) W Q
- #print 'never downloaded'
. T6 u; `) ^7 @' F& h& b, x - self.downloaded = 0$ [, Y) K$ x; \& K
- ! b# B* {) N4 U9 }- o1 i! b
- # rebuild start poind
/ p. N% J! C; u9 ]3 @4 q - self.startpoint = self.ranges[0] + self.downloaded8 v2 s\" l+ |. t+ \
-
9 e: I; V, V) b6 b - # This part is completed* j5 ]' z, h5 E- X7 u
- if self.startpoint >= self.ranges[1]:$ O* f( E% D7 J) d! T4 Q3 x
- print 'Part %s has been downloaded over.' % self.filename0 }6 g/ w. |6 a: x2 m$ v% H. T- o
- return6 G1 |1 J6 @. j; |+ G+ l
-
! y7 }) q$ U+ S+ N - self.oneTimeSize = 16384 #16kByte/time- G& Q- Y\" m' U3 C& r
- print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])\" ^9 w' h& V0 u5 r8 T3 m) ]
- \" t8 ~4 j\" N# M+ h
- self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))- |0 r: U8 a# W' [; c$ _, j
-
% Z$ b' V4 M\" |4 M - self.urlhandle = self.open( self.url )
. K6 @5 D- Z) D -
% j% y1 D) V8 w) x - data = self.urlhandle.read( self.oneTimeSize ); t: G/ d* T% l' X `
- while data:
4 ?* y3 p: N- \7 c - filehandle = open( self.filename, 'ab+' ), d: m\" U) P! b! E6 n! n5 `
- filehandle.write( data )' P& w/ N! T C( C j) ?( p
- filehandle.close()
\" E5 q4 z- M\" i# } - % c3 f3 i& O; ] ^: g E ]
- self.downloaded += len( data )
7 I- Y U% ]& X) ^ - #print "%s" % (self.name); }# T\" P8 B: L\" W
- #progress = u'\r...' v c3 h( ~ r
-
5 ^) y, u f5 m- ? - data = self.urlhandle.read( self.oneTimeSize )
+ _2 B\" l/ a- Y: l& @ -
{- g. \3 Z: P7 {\" ^4 f - def GetUrlFileSize(url, proxies={}):
4 U/ M! m- H3 N1 b - urlHandler = urllib.urlopen( url, proxies=proxies )* P8 o8 g5 a5 { l
- headers = urlHandler.info().headers! }6 Q q$ g* v8 A6 j\" k
- length = 0, d3 S) U* @7 q* w
- for header in headers:; _1 D; [, D+ p8 ]( l& b/ Q: O
- if header.find('Length') != -1:
}/ |8 [. c+ r, _- i - length = header.split(':')[-1].strip()& z, t& _$ g4 [
- length = int(length): ?0 X8 d+ @4 D! Y) l# Y
- return length; H0 _# g# O( o! B5 z# C( `
-
/ y% r F/ l* ?1 s - def SpliteBlocks(totalsize, blocknumber):
6 D X1 [: ~7 Z9 l - blocksize = totalsize/blocknumber
\" {3 c3 o, ~% e - ranges = []5 B: x8 S0 n! ?7 C' i. {- M
- for i in range(0, blocknumber-1):
1 |% d, R$ S3 V* _/ y9 A. Q - ranges.append((i*blocksize, i*blocksize +blocksize - 1)); m* q6 i8 |* j& Y3 ^8 ~. s) O$ L7 i
- ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))
! z+ S C, Y\" z5 ^/ z( P5 x8 X9 @ -
0 A- p7 J0 q' ]$ h( G& k6 _7 Q - return ranges4 w7 z% s# n- {3 @% E0 \
- def islive(tasks):
* O; Z# l% L* f* O S1 { - for task in tasks:0 `1 X4 z' f! u8 }; A% A
- if task.isAlive(): o$ l8 m! ]2 a; Y4 H8 ~
- return True; g K% j7 D9 W- C R( n
- return False
% u1 @) @, E\" G9 e% ~4 d5 c3 F - ( R9 G z7 Q/ {1 C1 m
- def paxel(url, output, blocks=6, proxies=local_proxies):' D, Y3 @$ t: @# v: U
- ''' paxel
; ]! q$ E8 h% C* u# Z8 ?/ q, l6 O- y - '''
$ K8 V6 W5 ?; O* d - size = GetUrlFileSize( url, proxies ). d7 Q' z) ~! [\" @) V% K( A
- ranges = SpliteBlocks( size, blocks )
0 p g\" M& D' g( y -
\" t5 Y/ j! `/ }# m8 H. e - threadname = [ "thread_%d" % i for i in range(0, blocks) ]5 J8 w7 c4 a1 W
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]+ A$ ?: ?1 n, u3 X$ ~
- 7 B$ g2 U1 p2 j
- tasks = []
% K\" i) R: Q$ D, t% r* T\" o - for i in range(0,blocks):3 A9 P: t# X! W( H3 V
- task = AxelPython( threadname[i], url, filename[i], ranges[i] )7 J0 m, D1 \+ {8 k6 s
- task.setDaemon( True )$ {0 U) U9 E8 g\" j, p6 R, g2 d; u
- task.start()) f( b/ a' d% `
- tasks.append( task ), n7 ?# J& n. J6 f
-
; [ r- b5 k6 B4 X1 Y( q+ G - time.sleep( 2 ) z/ q) R! {9 {% i. f5 W
- while islive(tasks):
0 V. {. ^% z' L0 t: V# q+ @9 g7 } - downloaded = sum( [task.downloaded for task in tasks] )4 \0 Y4 c R9 y* [1 v# O& }+ w
- process = downloaded/float(size)*100' x5 \8 L& b3 U, F' U
- show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
% p, P$ Q2 H4 ~2 }* q - sys.stdout.write(show)
1 J0 G+ a& n7 s5 g - sys.stdout.flush()3 `0 \' s8 q\" u5 ^
- time.sleep( 0.5 )! N* }9 D1 M( I I0 i; w5 ?/ G
- 3 @5 V& z+ e \1 G
- filehandle = open( output, 'wb+' )
; F$ @# `% Z+ [% Q6 B5 r% y0 ` - for i in filename:
4 G8 l' I: @' l8 q6 X' K1 F - f = open( i, 'rb' )
e7 w- K) I3 k4 l+ ` - filehandle.write( f.read() )
1 L7 y$ B' `# Z7 F+ R - f.close()1 p& ^4 r4 F7 m* o2 N
- try:
- e8 z! L/ c$ P1 U - os.remove(i)1 ^. a8 p: i5 G& z- R
- pass5 C6 ^6 P: e2 b6 E
- except:
! X/ b) L( t0 j( t r: o - pass
, m4 s, ?% E4 A; Q8 v - \" T) v4 |6 ?- T' v
- filehandle.close()- D1 p& Q% a* \6 P
- ' @2 E7 E9 h: t7 C3 C
- if __name__ == '__main__':
* M; `* \7 G* K+ m4 ^ - url = "http://xz1.mm667.com/xz84/images/001.jpg", q1 O/ b( B# o
- output = '001.jpg'
1 q8 {: }$ O\" i) E7 v+ v& f - paxel( url, output, blocks=4, proxies={} )
复制代码
; P" E7 F( K5 z6 l( X$ F |
zan
|