- 在线时间
- 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
' s) {8 J0 D( e0 V - # -*- coding: utf-8 -*-
. n* y. u& a( A7 b6 F* X: ]7 _' ` - # filename: paxel.py, o2 [, v- [. r/ `7 x& Y
- 5 I# @2 _0 t$ n* I1 ?
- '''It is a multi-thread downloading tool* T1 a/ {. N! f2 G: J7 C' l7 B( ^\" u
-
) |# t1 P2 ?& q8 N - It was developed follow axel.
1 ?) ?$ _) U1 x5 P! }4 f - Author: volans& @* g/ c. L3 P% e. x3 i l k
- E-mail: volansw [at] gmail.com
% T' {0 u$ z$ v7 S$ y- O' K4 u5 N - '''( J3 n, M5 Y- W2 s4 y7 Y
-
/ l2 }8 w5 b- e9 r! y1 c( S - import sys6 u7 T6 ]\" e; a' K F# O+ v\" K
- import os
: V f. b9 C. D# G3 W3 f# T9 B - import time
) X* q8 Y) v+ g/ l8 a1 K V8 } - import urllib
& G5 ~0 F( o* S - from threading import Thread
$ w9 J\" q) u* x - ' X+ s- V$ U\" e; F) j9 u3 m
- local_proxies = {'http': 'http://131.139.58.200:8080'}' |1 Y ^( _* Q- Z4 B* V9 J
- g% s# R\" k) d# K\" e
- class AxelPython(Thread, urllib.FancyURLopener):
% h$ I. ]1 j& \; ^1 e/ @ - '''Multi-thread downloading class.& l/ Q8 W9 P$ k2 m\" e; w
-
3 O& r3 @; x# }( \, G5 F+ s - run() is a vitural method of Thread.
- E h) T# ~# r f - '''1 q1 Q5 V; J, v& p( y
- def __init__(self, threadname, url, filename, ranges=0, proxies={}):: c/ n5 N# E) V: L
- Thread.__init__(self, name=threadname)
7 \9 _# }% P+ _* p0 T8 ]. T - urllib.FancyURLopener.__init__(self, proxies)
8 {) \) e9 Y) L8 h8 \' M - self.name = threadname
- `7 l6 [\" ~, j - self.url = url: o- P6 ~9 m$ i) y) A\" j5 A
- self.filename = filename
2 s5 D3 f( q3 { - self.ranges = ranges5 i: W% M+ Q4 R3 A
- self.downloaded = 05 N- |, Z; }% V; q( i8 r+ G7 f
-
: z# X. E; ]1 ~8 n: L0 v/ C- T - def run(self):
$ @ \1 f4 a9 i, f/ a& I - '''vertual function in Thread'''
2 k- z6 R: l# W ]- S - try:
M4 {' i$ a) y b: h2 {9 r - self.downloaded = os.path.getsize( self.filename )0 O7 C. D\" e! ^8 n$ T
- except OSError:
7 W2 m2 {( k\" p, Q! w - #print 'never downloaded'4 b# z% m' z/ I2 m
- self.downloaded = 0\" _/ F; O. U9 V2 q: }4 R
-
0 ^! J4 k5 }' H+ B3 X - # rebuild start poind) A- f\" B# |* q# V
- self.startpoint = self.ranges[0] + self.downloaded8 Y- d\" y8 }# o' ?+ Z
- ! p' {* b( R4 |9 p# C7 }
- # This part is completed+ |8 Z; q) L' a+ @8 z5 U
- if self.startpoint >= self.ranges[1]:
) W! Q( `9 Z4 J\" N* _- O - print 'Part %s has been downloaded over.' % self.filename
F/ _( x' `0 l! k8 b% b - return2 k; n' S0 U3 c1 Y\" h3 c& R
-
8 w8 V6 ~\" k. d$ Z - self.oneTimeSize = 16384 #16kByte/time2 D( u4 f- ?* m1 T6 ~
- print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])
6 d& R% r; v# l8 X\" F- j0 N - ! d! c0 g8 L8 Y2 \$ J
- self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))4 f E( t6 u1 V2 K# T9 J- [. X
-
, E6 k' w5 c( S5 Z$ q1 }5 A( [1 T - self.urlhandle = self.open( self.url )
# }# ~1 T; A* u! m -
/ W! W# k9 G8 U - data = self.urlhandle.read( self.oneTimeSize )3 |! i4 Z0 N, @* `1 F
- while data:
5 X) v' u$ e\" R/ J3 q - filehandle = open( self.filename, 'ab+' )
- v; {9 |( J6 L. q& D( G: G, h - filehandle.write( data )
( s& s# G9 k8 T0 E; r - filehandle.close()
5 j( P0 ?\" F( W+ d9 f# @+ N6 p& O -
o. x/ G! e% [\" z: S9 s - self.downloaded += len( data )3 v, Q, o' [3 Y; ^ C
- #print "%s" % (self.name), }# u$ O* w! R% B
- #progress = u'\r...'
. C4 n: W( i9 D z- h7 g5 y -
+ N, N& o- k9 q1 w# E - data = self.urlhandle.read( self.oneTimeSize )0 L$ Z. }7 Q( x4 R
- . p! \) I+ e& x+ R) |
- def GetUrlFileSize(url, proxies={}):+ D% s: ^5 G- F y' E/ h7 J) Z
- urlHandler = urllib.urlopen( url, proxies=proxies )9 z/ [9 i6 z4 m& J
- headers = urlHandler.info().headers: r6 J4 F, _9 E\" J# B- Y. |
- length = 0
) b1 C I$ p' r+ r9 c- F - for header in headers:9 W- B3 M9 m4 N/ y; f, y; B( _
- if header.find('Length') != -1:* f f4 A. X8 b% i
- length = header.split(':')[-1].strip()
; }* c' g' t, s - length = int(length)
6 v! @4 O6 R% U - return length7 o4 r0 M. A- n8 |; O V; ]
- ) {. G. s: P! X. K* f! r
- def SpliteBlocks(totalsize, blocknumber):
' r\" V) Q$ \9 o: x2 C - blocksize = totalsize/blocknumber+ U; v8 \+ I- h\" N& n7 _7 j+ \+ a
- ranges = []/ B, u4 f1 U5 _
- for i in range(0, blocknumber-1):
, U. H1 L& r7 B' e% f9 x& g: R\" Y* ~9 i2 Q - ranges.append((i*blocksize, i*blocksize +blocksize - 1))
k# C% q% h* g - ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))
0 [( G) N, n* K+ A -
w/ k3 |7 v8 o6 l$ i - return ranges; q# [- ^6 R6 [% V& X\" u
- def islive(tasks):1 ^ M' \5 k# V
- for task in tasks:/ x. P+ g, o1 ^0 T! }
- if task.isAlive():1 i& G9 e' e) F3 N
- return True. o0 O7 w, y* z3 p5 j
- return False
Z. N5 c( Q$ l, C7 t6 `* G. @7 q - & G6 F$ b# s5 k1 `+ D
- def paxel(url, output, blocks=6, proxies=local_proxies):
3 y/ S9 \- z) `/ X% O+ v0 p+ E - ''' paxel
( I0 B$ l2 u( W9 J8 ` - '''4 M* N: @9 y% S# K3 q& Y4 }
- size = GetUrlFileSize( url, proxies )2 @; r; ?( l! U. `; F2 I E8 @2 r
- ranges = SpliteBlocks( size, blocks )
+ b0 W ]$ P# g; [, C7 p- e5 x -
% n8 U5 |8 ^1 `3 W2 e' g - threadname = [ "thread_%d" % i for i in range(0, blocks) ]
$ m1 V. r1 G% ^& | { - filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]
1 o\" h' a5 d6 ?* X) X! E6 ?* x; S -
8 ]- x1 m; Y8 M H& I. Y' d+ r - tasks = []* L( `0 x5 p- @- P+ W
- for i in range(0,blocks):# I2 f0 `& v4 A/ a\" Z( t
- task = AxelPython( threadname[i], url, filename[i], ranges[i] )
, ?$ j; v) \9 q9 G1 U\" Z# K& L - task.setDaemon( True ), i3 E, j- O* D
- task.start()
2 J8 k3 L1 \0 z. w9 a/ a4 J - tasks.append( task )
+ n. X- A, d% A' \ - & v$ z6 U- x5 F6 B$ g3 ~
- time.sleep( 2 )
) d' S5 E3 P6 ~ A - while islive(tasks):
1 I/ A& G7 }/ \& x4 g - downloaded = sum( [task.downloaded for task in tasks] )% F% y! i8 l7 e+ {\" E: X o
- process = downloaded/float(size)*100
5 U# M, a5 q\" p. Z! t - show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process): J! {2 i I! w* ^- t* O
- sys.stdout.write(show)! b+ K0 T/ {+ f Y9 X! r0 d
- sys.stdout.flush()
. _5 c4 V; t% z& U5 ?% S - time.sleep( 0.5 )
2 b( B+ c: ~3 U6 k; k - * {5 y3 Q, S7 I) z# A
- filehandle = open( output, 'wb+' )$ b% B4 L, m/ C# R& t# N
- for i in filename:1 ]; w) h* O- ~& k
- f = open( i, 'rb' )3 [\" Z- Q; M& p- t, \1 Q
- filehandle.write( f.read() ). M, a- ~& y) @
- f.close()
* H: g8 q) h7 L6 B' x - try:
* Q9 m3 ^$ H# z2 r! ^ - os.remove(i)
6 h% Z\" ^7 F$ b7 R7 q - pass
+ |; N' c h/ C1 j6 p - except:
. j- d1 e\" _% r( ^9 Z - pass
5 L/ o/ ^3 U6 Z [8 c -
2 X/ E( d t' x! e - filehandle.close()0 D( \) Q# A- H2 |) } L' T
- ' \) f: ^4 f6 G4 @
- if __name__ == '__main__':8 K5 d; I7 j6 U& t% I
- url = "http://xz1.mm667.com/xz84/images/001.jpg"
. Q' F6 G6 r- |: K6 ] - output = '001.jpg'\" c7 K O\" s\" i Y5 }
- paxel( url, output, blocks=4, proxies={} )
复制代码
: {9 g( m4 T7 `1 s! } |
zan
|