有正在从事web测试和APP测试工作或想从事此行业的测友们,欢迎与我联系,相互交流! 长期招聘不同级别测试工程师(WEB\APP\性能)有意者请与本人联系!

免费网页数据抓取采集 python实现一个多线程网页下载器

上一篇 / 下一篇  2011-10-23 14:52:56 / 个人分类:python

文章来源
  • 文章来源:【转载】
  1. #!/usr/bin/envpython   51Testing软件测试网OS5cV0d
  2. # -*- coding:utf-8 -*-     51Testing软件测试网R&Ck3O2G8m f!B2^
  3. import urllib, httplib     
    NeR&E$}|K0
  4. import thread     
    4t,uE R3I&j*s6Z0
  5. import time     51Testing软件测试网 G)J1~J8M}.KB
  6. from Queue import Queue, Empty, Full     
    !jC8xF$d Xp0
  7. HEADERS = {"Content-type": "application/x-www-form-urlencoded",     51Testing软件测试网O9Vp@` u5u
  8.                         'Accept-Language':'zh-cn',     51Testing软件测试网$n @|(j s:J(o"e `
  9.                         'User-Agent': 'Mozilla/4.0 (compatible; MSIE 6.0;Windows NT 5.0)',     
    7L!y8@6mA}?0
  10.                         "Accept": "text/plain"}     51Testing软件测试网-M|4v?U n'Md
  11. UNEXPECTED_ERROR = -1     51Testing软件测试网w2F E~ y]i
  12. POST = 'POST'     
    2c.lA*}y;{(v$M0
  13. GET = 'GET'     
    #?9~i9^;Q%aV$c^(~9_*] m0
  14. def base_log(msg):     
    ,Uue#{wCv:\;C4Hq0
  15.     print msg     51Testing软件测试网,L \ J1N}` s.N
  16. def base_fail_op(task, status, log):     51Testing软件测试网|b,@~7{@+q
  17.     log('fail op. task = %s, status = %d'%(str(task), status))     51Testing软件测试网ypZX8D
  18. def get_remote_data(tasks, results, fail_op = base_fail_op, log = base_log):     51Testing软件测试网7h \t$GYBWZ"T-y6\0J
  19.     while True:     
    @ @1h-cGu0J t0
  20.         task = tasks.get()     
    V5\Js1y0
  21.         try:     51Testing软件测试网6Ra)L4E|;R
  22.             tid = task['id']     
    rFJ$c+UY0
  23.             hpt = task['conn_args'] # hpt <= host:port, timeout     51Testing软件测试网8T|6}:U$dz,X0} d.B
  24.         except KeyError, e:     
    9_'U0C y\r1G1a(t0
  25.             log(str(e))     51Testing软件测试网1LK7H*GTX&zO
  26.             continue     
    H&o q @YD `0
  27.         log('thread_%s doing task %d'%(thread.get_ident(), tid))     
    }$yhofIAl*E(Ot0
  28.         #log('hpt = ' + str(hpt))     
    0Y*?8vbCOBQ%XG0
  29.         conn = httplib.HTTPConnection(**hpt)     51Testing软件测试网!S'g)KFv9f Nh
  30.                  
    '[I/n C @*t0e0
  31.         try:     51Testing软件测试网;Qn,FVm~
  32.             params = task['params']     
    8ez6{5@B1E{k0
  33.         except KeyError, e:     51Testing软件测试网;bPgC+Cf.o:g{ b
  34.             params = {}     51Testing软件测试网\%x3g'u5TXg
  35.         params = urllib.urlencode(params)     51Testing软件测试网 ?$k_r F4k-H
  36.         #log('params = ' + params)     51Testing软件测试网.N)Wq1l(z
  37.             
    +V v"hP R {6w#LV0
  38.         try:     
    A!fl|([)]^v(m*q0
  39.             method = task['method']     
    E `KjG]T?WD x;D0
  40.         except KeyError:     51Testing软件测试网&JL I&u`k
  41.             method = 'GET'     
    /wNpl:F"g3] A0
  42.         #log('method = ' + method)     51Testing软件测试网6em2ocU
  43.             51Testing软件测试网.x H9X]MDl I x
  44.         try:     51Testing软件测试网9~VM {X/U d
  45.             url = task['url']     51Testing软件测试网6CP9S(\jM-P8w4a
  46.         except KeyError:     
    w8l d N#d;l!V$JK0
  47.             url = '/'     
    c9DptP2V4H0
  48.         #log('url = ' + url)     
    d{ D)R%OvM:_4@pdMv0
  49.             51Testing软件测试网!q~~2kd
  50.         headers = HEADERS     51Testing软件测试网1dZH9I6i k1ZaM.J
  51.         try:     
    tvi"x7V1~0
  52.             tmp = task['headers']     51Testing软件测试网B bh(^1H0xS5V9Y
  53.         except KeyError, e:     
    ^a3u3Ls*T|!G,T0
  54.             tmp = {}     
    1w {d*^Pe-V0
  55.         headers.update(tmp)     51Testing软件测试网}nK'~}"E9V a%Z,x
  56.         #log('headers = ' + str(headers))     51Testing软件测试网ai0R+yF!c p%D
  57.         headers['Content-Length'] = len(params)     
    ~||?4z` Y X0_c6s"V0
  58.             
    0IbMGl6Zm pNT0
  59.         try:     51Testing软件测试网A e;@|#gq#m,a
  60.             if method == POST:     
    t(O0yu%?Z$E!q+[0
  61.                 conn.request(method, url, params, headers)     51Testing软件测试网*vD| {.ov4|
  62.             else:     
    ^cT-F5x0
  63.                 conn.request(method, url + params)     
    %Uq$l9~Zp3J Q0
  64.             response = conn.getresponse()     51Testing软件测试网4M!NCO7CH*cU
  65.         except Exception, e:     
    %V~8l1S"@\0
  66.             log('request failed. method = %s, url = %s, params = %s headers = %s'%(     
    p!S1m"QMGg/Q0
  67.                         method, url, params, headers))     
    }Gc p4z:A-nm"g0
  68.             log(str(e))     
    RTm^Ep0
  69.             fail_op(task, UNEXPECTED_ERROR, log)     51Testing软件测试网V:b3lzE)E
  70.             continue     51Testing软件测试网$Yd8WY:_
  71.                  51Testing软件测试网6oC Bp0t,xC7[
  72.         if response.status != httplib.OK:     
    G1t z NQA Q0
  73.             fail_op(task, response.status, log)     51Testing软件测试网.I$~l!s7ocX]
  74.             continue     51Testing软件测试网 jvH3e8S~!r
  75.                  
    ])x*b`&gVm"k:]0
  76.         data = response.read()     
    7`&gFF2`0
  77.         results.put((tid, data), True)     
    -_6h8vR+T tnb0
  78.             51Testing软件测试网oFm B7s0O$DZV
  79. class HttpPool(object):     51Testing软件测试网@I#Fq-^ VZ/J
  80.     def __init__(self, threads_count, fail_op, log):     51Testing软件测试网S7V@2{OQ7U%f0E9n8S
  81.         self._tasks = Queue()     
    ?8^HDB6_9eI0
  82.         self._results = Queue()     51Testing软件测试网b`hRE
  83.             51Testing软件测试网YC.Y$L OdD qyI.lB
  84.         for i in xrange(threads_count):     
    GU.M'{q0
  85.             thread.start_new_thread(get_remote_data,(self._tasks, self._results, fail_op, log))     51Testing软件测试网7y(O o3EaV
  86.                  51Testing软件测试网cT gRx\o
  87.     def add_task(self, tid, host, url, params, headers = {}, method = 'GET', timeout = None):     
    d4UlQC1r[0
  88.         task = {     
    mbo"[r7h*F)b+j%K0
  89.             'id' : tid,     51Testing软件测试网i$?4mN4Y4B
  90.             'conn_args' : {'host' : host} if timeout is None else {'host' : host, 'timeout' : timeout},     51Testing软件测试网+a6^.An2khAfQ.{
  91.             'headers' : headers,     51Testing软件测试网J bZsz']wS@
  92.             'url' : url,     51Testing软件测试网%qK e#o'B+Hf2`
  93.             'params' : params,     
    ~Zg$v3b v P;Q0
  94.             'method' : method,     
    !iX(e,vr ~,j c0
  95.             }     
    L,oETwu0
  96.         try:     51Testing软件测试网Q#R1DT)]
  97.             self._tasks.put_nowait(task)     
    Cc$n$t D+Etvq0
  98.         except Full:     
    guN9N0Xs.R0
  99.             returnFalse     51Testing软件测试网 j\ Y S.w
  100.         return True     
    2GcQJSD%D3~%T0|N0
  101.             51Testing软件测试网{w:jQghC+r
  102.     def get_results(self):     
    U\&lIA&^ ngdD%X5r0
  103.         results = []     
    .p$X9Ta3O6K P'A.u h E)W0
  104.         while True:     51Testing软件测试网:oABU#|:b
  105.             try:     51Testing软件测试网6a6d$G.^1r&?&L
  106.                 res = self._results.get_nowait()     
    (UeSVV0
  107.             except Empty:     51Testing软件测试网ofv&m.W]m
  108.                 break     
    g,_n*KOsw$PDI0
  109.             results.append(res)     51Testing软件测试网{OWySc
  110.         return results     
    'x}+M f,m0
  111.             51Testing软件测试网G*a'V$P{
  112. deftest_google(task_count, threads_count):     51Testing软件测试网3xU5{z6AIXA+Y
  113.     hp = HttpPool(threads_count, base_fail_op, base_log)     51Testing软件测试网~$O5iND!q U dXr
  114.     for i in xrange(task_count):     51Testing软件测试网(oI sJ{)AF
  115.         if hp.add_task(i,     51Testing软件测试网,d9\7ouuh5q
  116.                 'www.google.cn',     
    8B {/eOP1J,t1u{0f0
  117.                 '/search?',     
    czY_k ~0
  118.                 {'q' : 'lai'},     51Testing软件测试网&|-vF T)|5^'n
  119. #               method = 'POST'     51Testing软件测试网5Hb"H ] ]L5t
  120.                 ):     51Testing软件测试网)T{-Fz)_%s
  121.             print 'add task successed.'     51Testing软件测试网n\-_v+A
  122.                  
    TcuU!ea/w3[*w0
  123.     while True:     51Testing软件测试网U+vkhAL
  124.         results = hp.get_results()     
    {B-n o2^0
  125.         if not results:     51Testing软件测试网!K@2p H G!y+L5I:A
  126.             time.sleep(1.0 * random.random())     51Testing软件测试网Q/? {cz2K1D&X ah
  127.         for i in results:     
    t}'T~H0
  128.             print i[0], len(i[1])     
    *BG8iZ| i3{0
  129. #           print unicode(i[1], 'gb18030')     51Testing软件测试网 Vw.^au$h
  130.                  
    ?EJ&RR0
  131. if __name__ == '__main__':     51Testing软件测试网B1{6g/s V:|&{\,A$l
  132.     import sys, random     51Testing软件测试网^1P6kl r V[P}
  133.     task_count, threads_count = int(sys.argv[1]), int(sys.argv[2])     
    ,{,ow+i*L0
  134.     test_google(task_count, threads_count)   
有兴趣想尝试运行的朋友,可以把它保存为 xxxx.py,然后执行 python xxxx.py 10 4,其中 10 表示向 google.cn 请求 10 次查询,4 表示由 4 条线程来执行这些任务。
{deVWz@0
h-f-SvK0
[%r S|c5h3~0转自http://blog.csdn.net/lanphaday/archive/2009/04/16/4083852.aspx

TAG: Python python

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar