- 在线时间
- 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
0 g7 R' d6 p+ Q) K0 z& d( Q - # -*- coding: utf-8 -*-
' E+ [: M% H! i; p\" d0 a3 y - # filename: paxel.py8 |( l9 J+ I/ V8 c\" z
-
% ?( B\" {$ F\" N4 f- O5 G - '''It is a multi-thread downloading tool8 W1 {& \) P; g9 E9 ?\" H' Y
- % S\" R ]+ @5 D& U$ i: p! Y
- It was developed follow axel.
5 U! `( l. l8 z- u8 n9 Y& ^: w - Author: volans% U\" Y, ~- ?& B, Z7 z
- E-mail: volansw [at] gmail.com
4 Y1 w* b( l1 [0 g. ` - '''
* ?3 h2 r+ P$ |\" | -
m& A8 c( V( z7 { - import sys
& X( k3 `: `* U6 ^7 r5 Q4 v, i - import os ^5 x1 u( }1 G, T' `2 x
- import time. o* @+ G* \- B \2 E/ E) B
- import urllib' u7 I9 S4 B( T( V4 Z; L
- from threading import Thread: r o+ ~9 G; j4 c. ?
-
: s* S- Q* {+ \ - local_proxies = {'http': 'http://131.139.58.200:8080'}
0 E6 `$ X3 \\" K - * d1 \+ D' [# D3 F
- class AxelPython(Thread, urllib.FancyURLopener):
, w$ g5 I8 D( T% J - '''Multi-thread downloading class.
\" o* B$ X' y% Y# G/ I! R8 m -
: H# u9 t# K+ S t - run() is a vitural method of Thread.( P& {5 r- r/ b# {# y2 b\" W# p
- '''
4 S# |7 S, d8 x8 h( M) x7 t6 _6 V - def __init__(self, threadname, url, filename, ranges=0, proxies={}):4 l% N: f2 |* a: R' F, V
- Thread.__init__(self, name=threadname)
% G3 M. d4 |0 a' K: N\" j( T - urllib.FancyURLopener.__init__(self, proxies)! T\" m$ U0 T. C9 G
- self.name = threadname
\" F: ^( F- G& T. Z) J) A - self.url = url
8 T9 U$ \\" s; D4 w2 P+ s7 y; m - self.filename = filename
z; X- M* p9 s3 y Z - self.ranges = ranges; K; N\" l! X2 ?* ?6 f
- self.downloaded = 0
& e% Z# R$ m+ r$ R - , H, _3 X, q- V+ W3 o
- def run(self):8 o+ g+ z* l ]5 [
- '''vertual function in Thread'''! E& e b' x+ i$ K, G
- try:5 j. O- ?) x' N3 C% Q4 _8 H: k
- self.downloaded = os.path.getsize( self.filename )
- u( p# W- m\" ^0 s/ s# y6 V - except OSError:, `# D- C2 G. p4 O: ~
- #print 'never downloaded'
8 {3 L* p, \& V1 N! m' ` - self.downloaded = 0
. P% N {( w8 S( I m! R6 c% T - # g: G6 \6 E) }& S+ S+ U* Z: ]
- # rebuild start poind) r: t- H$ s7 Y* ]
- self.startpoint = self.ranges[0] + self.downloaded) ~. Z: W: c: M) W
-
\" ?/ L \( o h - # This part is completed
: Z( w. B7 G! f/ `# L; M# y* n& Z - if self.startpoint >= self.ranges[1]:
4 _7 _' e0 l _% d6 V, H - print 'Part %s has been downloaded over.' % self.filename0 e- b& B% A p\" c4 g- @: J+ d6 T
- return
4 n5 s) t! x+ l; Z - 8 O7 i- `( z6 L/ [
- self.oneTimeSize = 16384 #16kByte/time
8 y5 e4 l) P% s' \, L - print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])2 y; G1 k* V, ` K+ H
- + Q# Q: H* A( Y
- self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))5 d! y- }2 q. L4 P4 ^$ A
- , H* {7 R. [$ u/ Q
- self.urlhandle = self.open( self.url )6 x, u5 j8 _# m: R7 j) [
-
& e/ t: @( T8 r- B, z - data = self.urlhandle.read( self.oneTimeSize )
, x( a; _1 u8 w# X\" i, H6 | - while data:7 J/ i0 d& {5 [$ H5 u q$ Y) R7 ]9 h
- filehandle = open( self.filename, 'ab+' )
% ^- _9 R$ j: ^9 _! W) x7 Y6 ^6 C) n - filehandle.write( data )
4 G+ {$ W5 ]8 p+ r+ q - filehandle.close()& }9 G; s# p/ M
- 0 e1 _3 ], m! A. r) ]& x
- self.downloaded += len( data )2 a( B6 R% m! P) h% t0 s
- #print "%s" % (self.name)* o `; h; Y' @7 I5 C0 j
- #progress = u'\r...'/ j3 m0 f: G6 b+ L\" h
- : U5 Z' v( v) X2 `\" Y# u; I: ^, c
- data = self.urlhandle.read( self.oneTimeSize )
6 z\" `& x) |' G R+ A& z -
# T e7 {: G\" |9 o - def GetUrlFileSize(url, proxies={}):2 t( T$ ]$ ?2 ]9 p- E
- urlHandler = urllib.urlopen( url, proxies=proxies )
4 x4 @) ]1 |. M/ B( U/ u - headers = urlHandler.info().headers
' c/ K2 f I, j9 h - length = 01 _, B' \* h: b8 ^- E5 H5 f
- for header in headers:2 q4 T$ e8 Y' A$ ^9 L! X. x' I
- if header.find('Length') != -1:7 e- R- t: F$ w( G3 c) W1 t
- length = header.split(':')[-1].strip()
+ `& V: U. n3 `9 B7 r' w- [+ g# Z: O - length = int(length)
. l7 f0 J$ s) {! s4 _, ]! I/ @9 m - return length, c- |2 U; i; g! M$ |
- 6 P7 p; h4 c4 p+ ~7 x' G
- def SpliteBlocks(totalsize, blocknumber):$ s/ G2 D3 q7 j5 {
- blocksize = totalsize/blocknumber: e, @! x2 K! n4 Y
- ranges = []
! N) j4 d ]; Y0 m - for i in range(0, blocknumber-1):/ x! H- r5 \- C) }
- ranges.append((i*blocksize, i*blocksize +blocksize - 1))
6 u* ?+ A7 f\" G5 y - ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))4 d L% h) S/ _
- ( q4 h+ ^. j3 O: a. }) z1 i& |4 N
- return ranges
' W& g2 E* s* b( ] - def islive(tasks):
$ p7 E8 c% `' V' L8 T: c% P - for task in tasks:
$ K) c, t* L M5 b5 ? - if task.isAlive():
) F* i9 c9 D7 Z$ ?: e+ p/ i - return True
7 S1 q2 r* O! Q3 ^( B - return False
- Q: t: U# R/ R - 1 v, S; [# b9 o
- def paxel(url, output, blocks=6, proxies=local_proxies):7 B, \- ^; t, O( Z) b6 L0 f4 Y
- ''' paxel
; A `$ {( d* Z: S% A - '''
( O. x! j8 r( ]* I7 W8 U - size = GetUrlFileSize( url, proxies )
, d# ]) A7 Y7 L\" x* J - ranges = SpliteBlocks( size, blocks ): m6 j2 o: k% b& I% i$ m8 o\" w' Q
-
- L7 t# i) U* T/ n4 Q$ ?5 ? - threadname = [ "thread_%d" % i for i in range(0, blocks) ]# n$ W6 Q* r0 f, a* O
- filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]% O+ D% Y/ V, C Y! {$ _) L8 W
-
/ z. J# R* N) Y, P7 d6 Z8 j - tasks = []3 y\" \& p4 g' O, F5 C! ~
- for i in range(0,blocks):
2 g9 N0 A: M. l - task = AxelPython( threadname[i], url, filename[i], ranges[i] )6 f+ Z1 T5 D, Y
- task.setDaemon( True )' E% K! Q7 m1 a/ I I8 T! J
- task.start()
) L! ]# w! C! b - tasks.append( task )# `' K$ v$ H. |$ C
-
W$ T/ C3 G: q. q. o' L - time.sleep( 2 )0 g: R5 R1 z+ [
- while islive(tasks):/ ]; r: P) m: G. m
- downloaded = sum( [task.downloaded for task in tasks] ). O2 ]8 f( A- f
- process = downloaded/float(size)*100
2 g6 A( U\" P. D\" M: O l) z - show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
2 n2 C l$ m% I$ R, g; c - sys.stdout.write(show)2 Q# v) X. K7 P% ]. X( x
- sys.stdout.flush()
/ E1 m9 r; r! R% z* ?1 ` - time.sleep( 0.5 )% G, I: C& ^0 r2 g/ n1 e
- & ~6 Y! Z5 f! ]/ K1 w5 P& P! |
- filehandle = open( output, 'wb+' )( ^- G# v- f5 a6 ?% C
- for i in filename:* q% T5 f8 [% B0 P9 W, B6 D
- f = open( i, 'rb' )
1 w i( ]1 _% C) R0 ` |8 c - filehandle.write( f.read() )! ?' v. l0 `4 O( s P
- f.close()0 \0 e% c* \# j: h/ Z. N6 D. u! ?$ r
- try:; o1 C' g5 _) `2 }, |) V. M
- os.remove(i)
c6 D' z$ I6 | h& u - pass
& d6 j) X$ I* _, b; c - except:8 o$ _/ \9 ]6 t9 n: \ D
- pass
5 ]. I0 G8 @: w\" E* D% a - 9 R& B3 _+ K4 \) j
- filehandle.close()
4 {# [3 A. m( i. ]2 i2 l -
* E% u5 C4 S+ h+ V4 Q) x# G - if __name__ == '__main__':* w& N& H8 l. c0 z
- url = "http://xz1.mm667.com/xz84/images/001.jpg"
8 e4 s+ q( j\" e2 {' j9 ]! m - output = '001.jpg'1 Z0 S$ [+ t, Z
- paxel( url, output, blocks=4, proxies={} )
复制代码 6 k3 P, M9 h6 E3 T% W/ t8 k5 m0 u
|
zan
|