- 在线时间
- 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
% F, s) v6 _9 {+ H* o& E6 {# b - # -*- coding: utf-8 -*-
( f# K# N& J' z2 J - # filename: paxel.py
?% t7 v1 W! |9 \4 Y& }( F - 1 t6 a' X' b2 |% K8 H% c
- '''It is a multi-thread downloading tool
7 E\" o, K% Y7 l; ^, d# l/ M9 p - 4 q2 S$ H, f O9 h
- It was developed follow axel.( e! Q. i4 Y. D5 u
- Author: volans
) `) n/ ]3 g0 Q4 V3 ` - E-mail: volansw [at] gmail.com
& @- K2 J2 S/ \- D7 n, { f4 r - '''
o: @5 {: I7 ]- S3 s0 a -
$ I- o$ R9 y( S3 K# s, c( d - import sys
7 L& p' g0 P) z( ~ - import os
& J# r* `, K) V: J - import time7 {0 D- ~: n3 R4 V4 \ @
- import urllib3 |9 ?3 a) Z* L
- from threading import Thread/ [' J4 h' s' d/ U4 s' M
- \" ]. z9 r, {/ x3 S- n
- local_proxies = {'http': 'http://131.139.58.200:8080'}
5 x' w5 _. s' f! e0 j - 8 X5 _# L% c8 @; I
- class AxelPython(Thread, urllib.FancyURLopener):\" z7 Q7 L7 D3 }1 m C* ~) R
- '''Multi-thread downloading class.9 m) R\" E0 X0 ~# f) D0 K) v4 D. U+ `$ O
- 9 g ~. _ [! k- b- A6 |
- run() is a vitural method of Thread.
& ] S. s0 ]! j* [ - '''
- T2 ]9 x9 _7 `\" @3 j2 C/ M' V - def __init__(self, threadname, url, filename, ranges=0, proxies={}):& ]4 b# _- r' ] w2 d V+ V$ S) ?4 V
- Thread.__init__(self, name=threadname)1 d; V& b5 n( K8 w& K8 ]
- urllib.FancyURLopener.__init__(self, proxies)
3 l& I2 Q1 p9 O, F/ r - self.name = threadname
, {* b( S# ^0 h3 t% j - self.url = url2 y& E1 A5 z\" s
- self.filename = filename\" G$ s2 R' s5 z+ i
- self.ranges = ranges H1 P! c, I5 ~
- self.downloaded = 0! y\" t0 L/ ?0 w+ y8 p# j) E
-
; T* `$ I6 O0 I5 `1 V+ ~# G - def run(self):
' q) q- i\" }\" B5 {* O+ v3 p4 w - '''vertual function in Thread'''
) ?; s5 @$ {/ _$ d - try:\" c8 Z x8 Q2 a\" _& K0 C) n$ f: L
- self.downloaded = os.path.getsize( self.filename )# y2 x$ h7 f4 P% o( T, V2 D/ _3 U
- except OSError:3 Q# F, P- p% S( r7 H5 g5 A8 U/ S
- #print 'never downloaded'
* u; G3 L8 ^7 L9 E - self.downloaded = 0
1 l1 l3 e' K\" W: Q' X. I! c -
\" C# z. a/ M7 E\" W6 j! v - # rebuild start poind4 u9 z; J @& Z- j& n
- self.startpoint = self.ranges[0] + self.downloaded
\" q) v7 l4 @- { j/ G0 j - 3 I, j\" Y6 _4 @3 ~! h
- # This part is completed) D7 C4 w9 G) C- J\" W0 B
- if self.startpoint >= self.ranges[1]:
4 P6 I* i4 V6 r\" e! ~3 ~, k - print 'Part %s has been downloaded over.' % self.filename s7 j9 R* Q) E* f# C0 W
- return
% j. N& v5 D) u8 A6 Y2 [ - 4 }2 p% A9 m! I7 W# h
- self.oneTimeSize = 16384 #16kByte/time1 t7 m0 z; w4 R\" v\" g3 K0 N
- print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])\" d' a6 D\" o7 {3 L
- $ _2 U+ o* b5 ^9 J5 s
- self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1])); q: [& z& C% @; M# f# ]
-
9 P8 r1 p6 y1 M, Y - self.urlhandle = self.open( self.url )% m* x* J( Z: K5 y$ g% Q
-
% ~7 \+ Y5 h- Y9 e2 i6 t+ |5 }8 X - data = self.urlhandle.read( self.oneTimeSize ). [, U\" X: t s
- while data:
7 r0 H9 G8 A$ C- T: ]\" L - filehandle = open( self.filename, 'ab+' )
: _5 x$ W( ?5 v3 u# O- @\" G - filehandle.write( data )
+ c8 i! [8 t. a# Q - filehandle.close(): J( f, W% h+ t5 K Q5 X
- % ^% ?& k. W% w- u4 H4 g( M
- self.downloaded += len( data )
\" o, E% S7 n( } N' \ R& U7 v - #print "%s" % (self.name)
; j- N+ C9 f0 x/ h9 [ - #progress = u'\r...'4 I6 g% a7 Y: y' |6 @ a
- 4 l* c: N* u6 b
- data = self.urlhandle.read( self.oneTimeSize )
; ]; J7 V1 x\" ~# j* c/ N+ A - 0 o | L7 I. @7 d# p
- def GetUrlFileSize(url, proxies={}):6 E% T3 m+ Z% h8 {4 c, X& T
- urlHandler = urllib.urlopen( url, proxies=proxies )
; y4 m% A0 B: W+ f& X6 w2 k# i - headers = urlHandler.info().headers
# T+ b\" K( T7 I/ L5 k1 n - length = 0
& m2 m1 ^9 _! \8 P9 E6 x$ P - for header in headers:
' E3 U! C- {( H9 `4 X- Q' R7 M - if header.find('Length') != -1:+ I+ D! x5 k/ D4 P! R' s! g* Z
- length = header.split(':')[-1].strip()- ^! A t, J$ Q
- length = int(length)
. t1 m+ C! O) L7 @( s. Y$ l/ h - return length
7 V7 l! F\" m% B' G4 i/ C -
. \; I1 `* z4 z\" z5 j- T - def SpliteBlocks(totalsize, blocknumber):
, r# F/ K T: T2 y6 n\" ` - blocksize = totalsize/blocknumber
0 k7 V2 ~$ ~6 ?3 {* h# W; U - ranges = []
, g& O( B' q) T0 C) X% a6 i) z - for i in range(0, blocknumber-1):
r* i) d* u! m- \\" g. I, q - ranges.append((i*blocksize, i*blocksize +blocksize - 1))
# d/ l: t- v8 T: E: K. o - ranges.append(( blocksize*(blocknumber-1), totalsize -1 )): {! j5 |. e9 }/ F. u; K
-
( O& {- z1 M5 n - return ranges/ {( |9 M1 T- R6 d: N4 G# V* ?
- def islive(tasks):
% Z' W; V. u2 {; {; }\" R5 @ - for task in tasks:: w3 Y1 }0 p/ |2 ^1 ^
- if task.isAlive():
) u- Q' E6 r4 X0 |2 r - return True
3 m u @3 v* M) y - return False5 N% h/ k\" G' r( A9 @# X! s
- + ~0 S1 x' l% I
- def paxel(url, output, blocks=6, proxies=local_proxies):
* T1 Z/ T/ H+ w2 `% ] - ''' paxel
0 ^/ z, Y: W8 f7 w; s$ V8 H - '''
4 }; l\" u. E8 B: E- m' c4 S - size = GetUrlFileSize( url, proxies )
. x: P! {5 V1 R5 a' R; \ - ranges = SpliteBlocks( size, blocks )
, z\" c: R, M( E7 B; f0 Y - ! d/ ~9 D# V# S\" l
- threadname = [ "thread_%d" % i for i in range(0, blocks) ], Y4 K( x1 c: W% H
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]- s4 O4 x+ s' Z8 C+ r9 T5 M
-
+ L$ ?* }; z- `) A - tasks = []7 J0 t. l! X- J
- for i in range(0,blocks):
H s% u$ t; L# v) z\" N' \ - task = AxelPython( threadname[i], url, filename[i], ranges[i] )
^7 w$ v6 V ?& d - task.setDaemon( True )1 H, @. W1 V s8 b% v
- task.start()
& p\" M ?' n; g2 A1 \ - tasks.append( task )) C- Q2 o0 o\" J9 b0 H8 Y/ b
-
9 K5 `2 A4 P5 ^' P* H3 b - time.sleep( 2 )
' D2 c/ m) B* o0 i1 j( ~& a( g: Q - while islive(tasks):
2 u# ? W: z$ C9 n\" e/ p - downloaded = sum( [task.downloaded for task in tasks] ): I3 }/ A: G. @4 K
- process = downloaded/float(size)*100' s5 J; j& h( _7 R4 ~
- show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process); a) w\" `: |: `. ?$ z$ Q
- sys.stdout.write(show)
! e) B+ d' |( ?) {) v+ j' b! h; ` - sys.stdout.flush()
, j, R\" C/ b\" t u1 l - time.sleep( 0.5 )4 C3 X7 O! |1 K% X* v\" i7 C
- , ~& q, C% {; b5 _: m/ s
- filehandle = open( output, 'wb+' )) e7 c- D\" `) O, i; a* f, L
- for i in filename:
( l3 q( ~. w1 } K\" z4 s3 b - f = open( i, 'rb' )
6 F9 K: r% s4 k* X\" H6 B\" A6 e - filehandle.write( f.read() )
. e- C# }+ k! v - f.close()8 K3 P) u8 @$ A* ]% V# X
- try:
! R y' ]7 k. t5 v! m4 d9 u\" ~1 t/ [+ s - os.remove(i). |' r0 i; _4 u7 {5 e( O5 t: ^
- pass+ e% o0 ]- \$ g0 Y7 C! Y
- except:
, N* g9 R1 N2 z j - pass
; t1 n2 k% ^& x# h -
& ]' k) W4 X s - filehandle.close()& }& t( Q. k# W* F
- ) L. Z- `+ }) j: M3 D2 i9 {
- if __name__ == '__main__':
/ z, P& ^3 L$ r4 w! S9 w+ J5 u - url = "http://xz1.mm667.com/xz84/images/001.jpg"4 Z' X' G& H j, l% W4 P: }; `
- output = '001.jpg'
% q# N; ^1 L. e% W5 z - paxel( url, output, blocks=4, proxies={} )
复制代码 : r" M3 \/ I s5 [+ H" ^2 ^* b8 d- n
|
zan
|