- 在线时间
- 479 小时
- 最后登录
- 2026-4-17
- 注册时间
- 2023-7-11
- 听众数
- 4
- 收听数
- 0
- 能力
- 0 分
- 体力
- 7790 点
- 威望
- 0 点
- 阅读权限
- 255
- 积分
- 2923
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1171
- 主题
- 1186
- 精华
- 0
- 分享
- 0
- 好友
- 1
该用户从未签到
 |
网上好看的动漫图集,如果手工下载太费时了。简单分析下网页地址规律,写个多线程脚本搞定。- #!/usr/bin/python) P\" O8 A1 Z( `2 Q* F9 ~9 I
- # -*- coding: utf-8 -*-\" \+ x8 C1 I0 ?( c# r\" ~5 ?
- # filename: paxel.py
% k1 q: w8 s4 ~4 p& M# | -
) E# t2 g6 [\" x- ?' H - '''It is a multi-thread downloading tool
6 a! s% a6 F% H( `2 ` -
! |# G. K8 w2 c2 P - It was developed follow axel.
: ~7 X+ y7 g1 X1 b- Q - Author: volans
- e# X# D8 w\" {. t' { - E-mail: volansw [at] gmail.com
\" B: q+ m) s- [% R$ i x; D - '''3 J% q2 W3 n: c' L8 E* y$ \
- + U2 @ U% P; G. L$ l' b
- import sys( O) s+ b) ~. e' \+ q4 w9 [
- import os7 w. T g% r0 g C9 `( S; ]: L
- import time# K7 }4 Y\" l0 i) |9 D
- import urllib, C! I# z5 X) @/ x
- from threading import Thread7 f) d+ k4 t- a2 B
- 2 g$ o9 B5 @( S* g Y
- local_proxies = {'http': 'http://131.139.58.200:8080'}
2 o( | [& {8 e D! x1 a+ \6 U -
\" s1 \1 _ C% Z - class AxelPython(Thread, urllib.FancyURLopener):
. P/ r( ~: Z4 I - '''Multi-thread downloading class.: \3 C, \, Z x& r* {
- ! b6 g/ ~/ j' o, V2 L8 m
- run() is a vitural method of Thread.. a0 ^( E. [- I9 K* O6 ?& _
- ''', [- Z( t- \6 _: m9 w E3 n, q+ j4 y' g
- def __init__(self, threadname, url, filename, ranges=0, proxies={}):
( n- l( Z! W- Z: y, a! ~1 }' o+ S - Thread.__init__(self, name=threadname)7 T# J0 ?% G. q9 v6 s9 A3 w- E
- urllib.FancyURLopener.__init__(self, proxies)+ y) l* ^: z% S9 j }' `
- self.name = threadname+ a0 E& G* G* j/ i
- self.url = url' m7 L+ S5 X) E4 p: r. o
- self.filename = filename
0 {1 R) j. L& q; H6 v' K8 S7 _ - self.ranges = ranges
{5 O3 _\" x4 o* z' Y: u7 } - self.downloaded = 0( v6 r# D/ i# U6 }, {/ k
- ( q) M- B3 d\" w
- def run(self):% E* L/ X# A6 U3 E1 v: K\" | k) ~
- '''vertual function in Thread'''
4 U0 ^1 z5 |! I5 x( j( w - try:
2 E s& K* p W4 W - self.downloaded = os.path.getsize( self.filename ). U5 s: _% H( T$ x% I
- except OSError:, F$ C0 b3 o5 }
- #print 'never downloaded'1 @\" s\" F; n. o f* m' R
- self.downloaded = 0
' U5 K7 A9 p; t: ` -
9 j\" ]( k- H* o& c& m& [ - # rebuild start poind
& t/ s) q/ y1 |\" {1 b! S - self.startpoint = self.ranges[0] + self.downloaded
. Z* O7 \) j. v( ~/ W/ @ -
( ~( t( [+ H- u/ e! d - # This part is completed
9 c! M0 _! d: R2 Q# M% a# x5 K0 c - if self.startpoint >= self.ranges[1]:
( t/ i+ B4 I/ [- ` - print 'Part %s has been downloaded over.' % self.filename# V) h' ^, E- H6 {9 T; E
- return
( k! Q6 a) ~1 ]8 l& M7 i - , m5 X0 [: z\" \+ g' ~
- self.oneTimeSize = 16384 #16kByte/time, S& W' t5 R4 ^6 g- k4 r4 u
- print 'task %s will download from %d to %d' % (self.name, self.startpoint, self.ranges[1])) A; D: R' [7 V ^' K
-
3 g% [9 U$ {3 O+ v8 F; b0 U - self.addheader("Range", "bytes=%d-%d" % (self.startpoint, self.ranges[1]))/ {( D! O* y) {/ i h3 `- {
-
! n2 J5 I: v* Q% Z - self.urlhandle = self.open( self.url )5 {; y1 c0 l& u/ y7 [5 S
- 5 \5 B. i+ ?; [' E
- data = self.urlhandle.read( self.oneTimeSize )4 {: E0 H\" h' S# |
- while data:3 l& I5 d# s i( h5 P6 T6 A, X
- filehandle = open( self.filename, 'ab+' )
$ m3 o/ V+ G3 }& B/ C, T; U - filehandle.write( data )( Q. }0 y; G$ `. Q7 h# i \. F' {
- filehandle.close()
! s( S) E\" F) b: I1 {3 ] m% r/ s\" x -
# j0 N9 j G: d7 c: Q; X/ f3 g' v - self.downloaded += len( data )6 R l2 @7 ` m8 ?, q% S
- #print "%s" % (self.name)* M8 z\" D) Y4 m* d8 z0 E
- #progress = u'\r...'
- `\" ~4 m% e- F% G1 P! d2 W3 ?- D - 5 j0 Q\" |/ B1 G; Z7 o
- data = self.urlhandle.read( self.oneTimeSize )
5 |1 w' v' M, y' l1 x -
* { E9 N5 j0 Z1 U\" A - def GetUrlFileSize(url, proxies={}):
2 Q+ i0 o+ c9 B+ E* W7 J - urlHandler = urllib.urlopen( url, proxies=proxies )
8 x t, F\" z1 E) g7 h# ? - headers = urlHandler.info().headers$ b0 U' i! {7 h
- length = 0
c; C8 M, H) A\" T/ U - for header in headers:
! R& `\" Y8 N3 ]7 b5 L\" | - if header.find('Length') != -1:2 \! M! u5 R$ y2 L r5 |
- length = header.split(':')[-1].strip()& @9 I# S b3 h- Q$ D
- length = int(length)
8 Y8 m. c2 J\" b1 |+ Z - return length
! t T! c# H- x0 @ -
4 d, U6 @+ r/ n! B; a$ Y& B - def SpliteBlocks(totalsize, blocknumber):
0 A8 e( G9 R$ G - blocksize = totalsize/blocknumber
% l% w* F0 _4 G3 K0 Q/ K4 K - ranges = []
6 e$ |( r+ M. E5 _/ Q' u' R - for i in range(0, blocknumber-1):
' M! l* A6 @0 J. w8 Z - ranges.append((i*blocksize, i*blocksize +blocksize - 1))
0 S. s- B( E5 b( [& a; g4 l - ranges.append(( blocksize*(blocknumber-1), totalsize -1 ))# H. w# O8 G) ~2 p# G0 o! ? g
- 0 K/ M' v/ N( o
- return ranges
: z* a0 _7 j, \3 e& v4 Y - def islive(tasks):
6 r) l( `) r1 [/ d! C) L - for task in tasks:% W5 T3 Z1 b* K\" J8 T
- if task.isAlive():
- `# e( @( X, Y. D/ x3 K - return True+ p6 h. u% l* q- z1 p
- return False$ {. _# z f/ q) W; r7 Z
- . b k4 ~7 R$ h' F9 V2 @9 p5 z
- def paxel(url, output, blocks=6, proxies=local_proxies):
+ _1 }3 A# s S - ''' paxel
o7 @6 e8 I2 \% c - '''
3 r/ {1 D8 D7 r4 e0 B - size = GetUrlFileSize( url, proxies )2 `, @: b2 ~! R/ a' F* z) ?
- ranges = SpliteBlocks( size, blocks )
/ Z& M g# ?' d9 @6 Q -
8 l- p! ]3 h6 a& C4 [8 Q; k\" O& v - threadname = [ "thread_%d" % i for i in range(0, blocks) ]
$ q' L4 m# h+ ^/ l, K' t - filename = [ "tmpfile_%d" % i for i in range(0, blocks) ]
: A& @\" }! I) x( e4 e' z- Z -
( R4 ^& d' L: ?& H - tasks = []
\" @3 q: ~, O; B% P* Q' V - for i in range(0,blocks):# s4 q9 k* m( }! g5 o/ k
- task = AxelPython( threadname[i], url, filename[i], ranges[i] )- |9 |% Q\" v. Q |
- task.setDaemon( True ), y0 ]4 B1 e: C% c$ {
- task.start()
2 a2 j+ Q$ h/ w: A. F9 z1 c - tasks.append( task )1 C r; J6 k& j$ T z& l\" \
- 9 U4 Z( c( z' Q2 k2 d( a5 P; O
- time.sleep( 2 )2 z) q/ E' H2 l+ ] L0 q
- while islive(tasks):
1 D( O: L# v- ^* P5 F; n - downloaded = sum( [task.downloaded for task in tasks] ), Z1 f8 b: H% y5 t& y/ E
- process = downloaded/float(size)*1005 {& {; G\" n7 J) R
- show = u'\rFilesize:%d Downloaded:%d Completed:%.2f%%' % (size, downloaded, process)
4 A6 B5 S: `, ^\" C( I - sys.stdout.write(show)
7 P& Z# I( l+ X, ?7 g1 B V - sys.stdout.flush()- b( ?. R\" y\" c$ Y
- time.sleep( 0.5 )
) M! O$ p& E9 n) V) K) E% } -
& h3 Y8 e1 C$ U, ^; ~/ C7 c - filehandle = open( output, 'wb+' )
% C1 F2 X- y$ F8 O - for i in filename:5 ?4 Y3 ?; O) c
- f = open( i, 'rb' )/ `% ^, V/ b2 e9 C& O
- filehandle.write( f.read() )
1 d* N\" g7 j8 n9 Y9 ?3 }4 _( d - f.close(): l$ Y, r. w: E1 Q9 U+ e# _; T
- try:
6 t5 F2 G- l0 ?2 k8 E5 s - os.remove(i)# o; N! a8 {& c8 ]- |$ W0 D, l
- pass
8 C5 U. J3 {9 g- b2 y$ J; y - except:* y6 V* W% i7 x
- pass$ L; i\" t$ R, b4 \
- $ i\" S9 ^8 j5 `) T
- filehandle.close()
1 \& p. } _6 u: c* Z) D! ?- ` -
% r# a7 P w8 j: o2 d2 v3 E - if __name__ == '__main__':
( R! P7 I6 x& U, U' a1 y. W* R - url = "http://xz1.mm667.com/xz84/images/001.jpg"
: r7 o d2 r8 T - output = '001.jpg'
2 q) x/ S3 d' w+ k - paxel( url, output, blocks=4, proxies={} )
复制代码
' F. x# N: A' }: I( i |
zan
|