- 在线时间
- 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; f\" J2 O7 Q! x
- # -*- coding: utf-8 -*-
8 |- u: `. N! @2 Q0 s - # filename: paxel.py
\" E: ]9 ]. R2 V -
3 f& S$ ^\" b( O# d5 {7 k - '''It is a multi-thread downloading tool' y- g& k0 w6 i: G* m% ]
-
! f& ^' ^/ K' l% Z7 g - It was developed follow axel.
1 k8 i! W: H2 z9 b( R/ S - Author: volans% S+ f5 J9 e+ w5 n& k5 W; }' Q
- E-mail: volansw [at] gmail.com
* t5 O. r! @, x* q/ N - '''4 y1 I- `: h! p% ~$ D N+ L# N# X; o
-
* x, [1 a\" y9 M3 c& M7 N0 H7 q - import sys
; ~) m( k k# @5 a - import os4 g: l% B\" E: ?& X( t e# B' B
- import time# Q% ?$ v5 a3 O# l
- import urllib% _6 E0 D7 F) \' u: x: S
- from threading import Thread
! H) J, v- ?0 F! n& \: [3 o - 7 ^9 t* j2 j* D, j
- local_proxies = {'http': 'http://131.139.58.200:8080'}
$ m- w) A& m- ^' Q, q - 3 q1 q3 g$ V/ t+ j7 _
- class AxelPython(Thread, urllib.FancyURLopener):
) A. B: ]$ {& c# ? - '''Multi-thread downloading class.
3 Y, u/ H# Y* w; k. ]9 O3 y! x* M -
& Y7 w+ Y/ L! n - run() is a vitural method of Thread.9 b: h- |9 W- Z( K& C/ J
- '''\" Z1 k- Z# a; M/ l- m# F; C
- def __init__(self, threadname, url, filename, ranges=0, proxies={}):7 ^4 j( I: W\" H\" X; K1 b# D$ K
- Thread.__init__(self, name=threadname)
' N& _8 P- u2 a\" z2 N - urllib.FancyURLopener.__init__(self, proxies)
& K- b6 E' m) o! j - self.name = threadname\" f& R; R; z# Q3 H8 p& L% I; x- k
- self.url = url\" |: |+ q4 y, @0 a
- self.filename = filename
# E1 D ^! j* t1 D' l - self.ranges = ranges; G; x g/ s8 f5 r! @/ ~5 H
- self.downloaded = 0 ]6 }9 c3 u# `! O: N
-
* t0 t2 V( O6 `! o, C - def run(self):
( T1 m3 q4 L4 _/ q - '''vertual function in Thread'''
; O& U6 {5 p S. m! h( T; J3 g: s - try:
0 V X& i- O' f - self.downloaded = os.path.getsize( self.filename ), y- u0 K/ s0 L8 I+ a
- except OSError:
% a3 V9 [. i! s7 _; |4 b2 p% a* ? - #print 'never downloaded'
* `, V- k Y. p( k - self.downloaded = 0! V) W5 J- W( B- @- ]& h
-
2 k2 Q* J+ S. o3 ^ - # rebuild start poind
4 l; L2 p) ?+ t2 b2 _% v7 R - self.startpoint = self.ranges[0] + self.downloaded8 q4 ^7 K1 {& L& j; ~* x' _
- + x0 y+ B* L# ]. r7 A
- # This part is completed
/ p\" ~\" C! W6 x+ Q/ L5 R1 k# x - if self.startpoint >= self.ranges[1]:# N# R. F/ ?' {. D/ w G
- print 'Part %s has been downloaded over.' % self.filename2 G5 y$ ~7 H2 p4 v
- return- d, o\" [; g: _. [5 t5 m* s
-
( t! ^$ I6 ]9 |* F7 ], L - self.oneTimeSize = 16384 #16kByte/time
% o* L; v/ ?+ d; C - print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])
* b0 B8 r, w% A+ c4 _6 O0 f8 X -
2 ~! d9 X/ d6 _ - self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))' R: @! o% ?2 I9 d( ?- P8 t
-
: o, ]! s) K& q4 m( ~! l - self.urlhandle = self.open( self.url )2 V7 V9 `* x ?. C, s3 O: h# D1 k F1 w
-
9 N {3 |$ o7 I - data = self.urlhandle.read( self.oneTimeSize )1 E5 h5 B, q2 Z+ ^! u; m; N
- while data:
7 e6 n# [0 Y* R4 V/ X - filehandle = open( self.filename, 'ab+' )2 i5 k. C6 b# b# b) G H. F' k
- filehandle.write( data )) {4 a5 Y7 h' P\" q\" ]3 P/ a/ {
- filehandle.close(). }6 A0 C) Z# M( R
-
- q7 v6 b( ]1 {3 r2 C# l. P - self.downloaded += len( data )8 R7 [; |$ R( G8 z\" w6 L
- #print "%s" % (self.name)3 O1 \ N- ~) w4 A# C4 m- Q
- #progress = u'\r...'1 W) _- X8 `+ o, l- H
- 8 `6 J* x0 e) H3 e Q* T
- data = self.urlhandle.read( self.oneTimeSize )* w7 @+ k/ T( x4 r8 p, m; y
-
* ~2 {* r0 e2 @2 w - def GetUrlFileSize(url, proxies={}):' S# \: _; w9 Q8 a
- urlHandler = urllib.urlopen( url, proxies=proxies )
4 G+ [2 R% Z6 V: x! r$ c' s - headers = urlHandler.info().headers
: j% {: N1 ~' _ - length = 0
- \6 I3 C0 c0 R8 {& y1 C - for header in headers:
: C( C, ~% B$ n0 l* Z. W: x% n - if header.find('Length') != -1:3 U3 \0 G' ?! `- \5 y
- length = header.split(':')[-1].strip()
( M$ X& [, w3 C2 [, N\" o4 a - length = int(length); _1 m' ^: J9 ?+ f, M* }
- return length0 k! `& G4 k; d( e
- , ]0 O; f$ y9 @& ^4 C\" |' D/ b
- def SpliteBlocks(totalsize, blocknumber):8 {( o\" ~: H n' q% } a) N
- blocksize = totalsize/blocknumber
. u q1 e1 ]) A\" x - ranges = []
! z\" ~# H) }4 m% O\" F0 ^( t - for i in range(0, blocknumber-1):
, o\" `1 f0 ?& Y9 j& o- u - ranges.append((i*blocksize, i*blocksize +blocksize - 1))5 h% B- I1 C( E4 u9 y
- ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))
5 |) K0 Z. c( c5 l& H# { -
2 L2 X+ l4 l$ D. w6 h# h - return ranges
& k$ l! E) V& i6 ]\" Q4 t - def islive(tasks):2 d4 D- X/ J* e8 T1 d
- for task in tasks:6 Y! l2 Q- i3 b; t
- if task.isAlive():3 T/ F/ h; Z1 k5 L
- return True
3 v\" F+ _. W# Y+ h\" }$ P - return False$ P5 R\" m9 I; }( G1 O% T
-
: v, J4 V R6 T& J - def paxel(url, output, blocks=6, proxies=local_proxies):& L$ j- \! D! N. r
- ''' paxel
( u L$ u# l: A - '''
- \3 M3 G2 K$ h1 ^6 c7 E1 i* C - size = GetUrlFileSize( url, proxies )- L- E$ s ~9 T) Z8 v$ L
- ranges = SpliteBlocks( size, blocks )
% r6 J' ?) P. i$ F! x1 L1 l* Y -
6 Y: d1 V6 { B* A7 E) V. a+ v - threadname = [ "thread_%d" % i for i in range(0, blocks) ]1 D9 K0 M4 r+ Q1 t
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]& C3 z+ z x% }3 m0 \- g9 A
-
I, G+ X: A5 N7 a - tasks = []3 Z+ J/ a7 A3 v3 R7 T% t7 p' S
- for i in range(0,blocks):
9 O' ~5 G3 L) A - task = AxelPython( threadname[i], url, filename[i], ranges[i] )
* H) N. I' R. @4 ~0 r - task.setDaemon( True )
6 H, w9 V u0 U3 H6 {( ~+ o - task.start()/ ]9 s- w: S; }6 m: {
- tasks.append( task )
: t+ Y9 ~% _5 F -
: a3 f! G( j* p/ V\" _9 t* v! }% S2 t - time.sleep( 2 )
C9 K4 T5 \6 [5 u3 e* b - while islive(tasks):
5 N) d$ I: T$ I k! } - downloaded = sum( [task.downloaded for task in tasks] )
4 _. ]: _. r# Z* N/ L' m - process = downloaded/float(size)*1001 Y+ Z O9 s6 h6 ~4 @
- show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process). p0 T# G; c! d b\" R; ?$ ?
- sys.stdout.write(show)! E9 N- w( S/ l2 e# c* R$ W9 Z
- sys.stdout.flush()
1 K& ^$ c8 M; W4 V' x- o, t - time.sleep( 0.5 )7 J8 A- P, u5 o( R, f
-
# D9 Q7 d `: E# `) p- T4 D% Z5 y - filehandle = open( output, 'wb+' )
$ ~. [7 y& @- B - for i in filename:
4 B2 _3 Y1 a( m. t - f = open( i, 'rb' )
0 p) h; Y, W G5 ]) [ - filehandle.write( f.read() )
# ?& t' a& o1 d0 K8 } - f.close()) F8 Y/ l: G7 B5 F
- try:
# E* F; f6 m, [. e; ]# h1 }( e - os.remove(i)
0 @! q4 E9 T8 O1 _# K6 n. n - pass% y1 N# }) Z. N T' R) k
- except:; A. D e+ X5 ~, f% Q/ T
- pass6 M. _1 F& s* |) H0 h+ R+ X/ d1 X
- 8 M! I0 x1 w$ X$ g
- filehandle.close()& s$ `+ x& ?/ h6 p& o
- 3 e' I: h2 \9 J\" Y4 {
- if __name__ == '__main__':/ s: g6 I! B: _! z6 e6 O7 R6 r7 j
- url = "http://xz1.mm667.com/xz84/images/001.jpg"# u6 H: n' c$ ?9 B% k+ f
- output = '001.jpg'
* T6 t7 O4 U/ \% n - paxel( url, output, blocks=4, proxies={} )
复制代码 - M' y E# V6 s
|
zan
|