- 在线时间
- 479 小时
- 最后登录
- 2026-4-17
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7790 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2923
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
网上好看的动漫图集,如果手工下载太费时了。简单分析下网页地址规律,写个多线程脚本搞定。- #!/usr/bin/python2 B# c: T# m) b8 b
- # -*- coding: utf-8 -*-6 V+ v7 z, U\" O\" t9 M7 I' `6 x
- # filename: paxel.py
\" M3 ^- E6 g* l0 \: |, l+ T% C3 Q - % N0 s2 U9 `+ ~- _; F
- '''It is a multi-thread downloading tool
9 G. l7 |1 v$ r -
9 R# n* _6 i# x( I: W - It was developed follow axel.( u- A1 j: ]3 b5 E
- Author: volans
4 J7 d* g% m' A$ { - E-mail: volansw [at] gmail.com3 H8 k% g' w+ b- d, Y
- '''
% B% p\" j8 e7 u0 F -
' ?& c2 k' ~8 Y- O( K2 t5 z1 C0 x5 e - import sys' M7 ?/ S9 [% D/ T
- import os
0 a) `7 @+ w' }8 J; `6 K - import time
2 E/ a& r3 I& o# K d$ E - import urllib
2 O6 q& O) i% d/ q0 g+ Y - from threading import Thread+ k\" h2 C$ M5 N- K% I& N; k. J R
- . B; Q7 L5 x( W# [7 f/ D
- local_proxies = {'http': 'http://131.139.58.200:8080'}( S# ?6 i( b7 i+ a9 ~, y
-
+ K+ h1 Y7 G0 B# x( t' A - class AxelPython(Thread, urllib.FancyURLopener):
\" ~! _4 V- q3 W: Z, S) n/ u6 z - '''Multi-thread downloading class.
( U! ?$ W0 P! ~: `4 p -
e; j8 G1 ]\" b; ~ F$ G+ G - run() is a vitural method of Thread., D2 Y4 a% j1 t' n6 {, |/ @\" s4 v
- '''
. N5 V) a% U: n, B# w - def __init__(self, threadname, url, filename, ranges=0, proxies={}):3 U' e' ?0 }' ]& p9 V+ Y( y$ O2 c) P
- Thread.__init__(self, name=threadname), E4 ~; [4 |/ v
- urllib.FancyURLopener.__init__(self, proxies)* E( G1 k0 [5 J( F6 |
- self.name = threadname
, u) `' L# |. d\" F+ L. U. r - self.url = url1 ^* Y0 ~2 Z* d* O# O! s
- self.filename = filename+ e/ ]1 d4 U/ J2 c
- self.ranges = ranges i0 I: Y\" [0 _\" q# J
- self.downloaded = 0
& p' h& [2 R9 s4 q; c4 f -
; ]: ^3 {: x2 Q; o5 n2 z - def run(self):% c( Q C\" L. R2 b2 u7 g# N
- '''vertual function in Thread'''
. I\" v6 J* Q( j7 v+ }3 z - try:
6 Q2 j# I9 _/ I\" J- N& c\" @. ? - self.downloaded = os.path.getsize( self.filename )) [! A! w. [0 M\" o4 ^
- except OSError:, e3 j) z\" P8 }. f+ e
- #print 'never downloaded'
6 k' h, T ^$ [* l0 h9 _) q& }8 { - self.downloaded = 08 l5 v ?# f N* }; L
-
) L5 L. P* C! E8 ~- b - # rebuild start poind/ z+ K/ `% T0 z\" ~4 T9 u$ j& {
- self.startpoint = self.ranges[0] + self.downloaded
- h: ~- F/ ?. y4 [3 |0 E8 s/ Y% ] -
& K z, n4 m3 E5 i; ] z% w - # This part is completed
: S& p6 T) P' ~\" ~7 H - if self.startpoint >= self.ranges[1]:. a6 b/ K- k( \# k
- print 'Part %s has been downloaded over.' % self.filename
( A3 n8 ^* Q! C' D! t - return
8 S4 ~# e i5 W# r' T5 t. } -
9 F: T3 m; N6 y+ X c5 Q4 L* M - self.oneTimeSize = 16384 #16kByte/time
# D& J! }$ F* x ~4 w5 n - print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])
. s. n$ n) P7 ] - 0 ~4 \3 L) J9 l( f7 o
- self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))5 G8 T/ t6 B$ `
- 4 q' }- I5 _( I v$ t8 C
- self.urlhandle = self.open( self.url )
. K3 Q2 ]9 i+ Y -
& ?1 e$ {9 w$ _7 A - data = self.urlhandle.read( self.oneTimeSize )% H6 s1 n8 J) |5 v' Y7 x2 M) h
- while data:
3 ~2 {0 H( ]5 u; @% D+ O R6 d/ d - filehandle = open( self.filename, 'ab+' )
* t' }' d! Y q) L2 t6 E# n - filehandle.write( data )4 \8 H4 A1 J( J: B* d& W' d8 c i
- filehandle.close()
. p; U) n3 v% E3 W& B6 `9 I0 U -
\" d+ x6 z: p0 b( A ? - self.downloaded += len( data )
4 \% g1 P( |* n3 F9 L* Y\" Y+ I - #print "%s" % (self.name)+ {$ l/ ]; ^1 Y. i% w. [# x2 r
- #progress = u'\r...'; Z/ v0 y( E0 i
-
$ R/ P\" b+ K( m8 L L+ u* [5 A - data = self.urlhandle.read( self.oneTimeSize )
! t# \$ h3 g; Q3 ^% P. U -
1 p9 u9 N: Q6 {* S2 a w) L - def GetUrlFileSize(url, proxies={}): e) W7 x3 b* K6 Z, _, h2 U! C# ]8 U
- urlHandler = urllib.urlopen( url, proxies=proxies )% z9 ]5 c\" p0 i) i\" z
- headers = urlHandler.info().headers
! t/ t: f! ]% m m4 x6 L: Q) |. ]- u - length = 0
. F5 H2 M7 X/ ^2 Z+ y$ w/ r - for header in headers:$ Z- Y# P1 ~% c E' W\" o/ p. A
- if header.find('Length') != -1:
+ I/ {7 q6 n: }- r - length = header.split(':')[-1].strip()
4 ^+ n8 z2 ^ X, H# u- E ? - length = int(length)
* ^* |- ?1 b8 p- _8 s - return length- g8 |6 g, w3 c D3 |
- 9 \2 o% X& M' a8 E! Z Z- i
- def SpliteBlocks(totalsize, blocknumber):* _ [% B* V7 Z( n
- blocksize = totalsize/blocknumber7 N8 k1 L8 F0 ^/ V9 G. H7 s
- ranges = []
5 R# P4 F( j- a7 ~/ b: x7 e - for i in range(0, blocknumber-1):& [1 U( M+ Q) V i$ ]3 h5 j
- ranges.append((i*blocksize, i*blocksize +blocksize - 1))$ P% s% \; r) D8 W2 d% b
- ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))
; q( i4 s7 K8 k3 {! \& U -
# C, O2 c$ J5 `* R# a. b - return ranges* R& i% Z! L; b9 W; W9 q
- def islive(tasks):
) b3 k\" t8 {: S, X1 N1 i8 C - for task in tasks:% M. v: R' C! `- P5 ?
- if task.isAlive():( D! ~4 ? \9 c+ n8 }6 m
- return True) i5 k# I+ c5 W2 z
- return False
2 N, x6 |0 |( \ X S7 m6 [3 X -
9 s3 T) [! K0 E) D$ P4 `9 Y - def paxel(url, output, blocks=6, proxies=local_proxies):/ p0 U, [3 G( }1 K8 L; ]& @& y
- ''' paxel
9 W2 ~& W8 D4 i0 B( L7 L - '''
, R! D\" C- A2 y) @, M - size = GetUrlFileSize( url, proxies )0 e4 |5 X9 h$ ^/ |
- ranges = SpliteBlocks( size, blocks )0 j8 v8 t) r3 |& E
- 1 |9 Y% c+ q7 f; J# s+ ~
- threadname = [ "thread_%d" % i for i in range(0, blocks) ]
: C' P+ T! K, A2 e\" g4 p: e) D5 O' ` - filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]/ L9 E/ w# @$ _0 m. c
-
6 Q% E: W' B2 {- e, U - tasks = []8 f- r6 |) P6 N& \1 G; g; j, D
- for i in range(0,blocks):
\" J9 t: c' U9 a) O1 g0 v6 l - task = AxelPython( threadname[i], url, filename[i], ranges[i] ); V: C6 }1 S: A- i: L
- task.setDaemon( True )
5 S+ S+ j# j& J# z) b2 v - task.start()$ Z3 ^$ A( X5 N6 ~0 b: G9 `
- tasks.append( task )
1 G% ~6 n* d\" P# W) n) {' I; A, x - % c' L0 z! Z2 A+ S6 C. ^+ }
- time.sleep( 2 )5 A/ N& m' _! V( y) v8 v
- while islive(tasks):2 V& O; d3 y/ ~2 G
- downloaded = sum( [task.downloaded for task in tasks] )( \' F8 n7 M- a e) k
- process = downloaded/float(size)*100( u' W9 W! i+ d o, L, R7 }1 E7 E
- show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
' b$ R x+ x. Q8 C- R - sys.stdout.write(show)
: ]7 D/ E5 D3 M @8 M$ f - sys.stdout.flush()
' X9 X) \. f, \) R l# k - time.sleep( 0.5 )7 \# ^, S: V k+ I
- ( }! w( p4 i; k
- filehandle = open( output, 'wb+' )
3 p i+ Y\" z* s: w: N* S) r) w8 y - for i in filename:
' W\" o h\" L- |# ~ - f = open( i, 'rb' )
2 U. }& c! a0 P - filehandle.write( f.read() )
1 K& Z. Y5 n6 u6 C - f.close()
$ P/ ~) C& J! H4 d; ` - try:- ?' ]; y! V L
- os.remove(i)
F3 Z; R8 K& s' B2 {2 H$ w - pass
- i# s- z0 r4 C! l3 g - except:$ z* }8 p) c- `+ k1 a/ ^
- pass, D o& [* T6 ?5 i) v) }* }
- 3 [6 U# D. m) C% y\" \! |7 |0 b
- filehandle.close()9 M: m# {, T. Q* m1 ]( t# d0 j; ^
- * b* k; _# b: l8 Y+ ^. ^& E
- if __name__ == '__main__':
- G0 |' d8 w+ Y - url = "http://xz1.mm667.com/xz84/images/001.jpg"+ K B4 y0 W- N( [! x
- output = '001.jpg'
! k9 p$ W, o% Y& S- D - paxel( url, output, blocks=4, proxies={} )
复制代码 % L+ {: ~* b1 I! t2 V
|
zan
|