zoukankan      html  css  js  c++  java
  • 验证采集[Python]代理抓取并验证多线程

    题记:写这篇博客要主是加深自己对验证采集的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢。

        没有应用列队 ,也没有线程池 还在习学  只是多线程 

    #coding:utf8
    import urllib2,sys,re 
    import threading,os
    import time,datetime
    
    '''
    这里没有应用列队 只是采取多线程分发 对理代量不大的网页还行 但是几百几千能性就很差了
    '''
    
    def get_proxy_page(url):
        '''析解理代页面 取获全部理代地址''' 
        proxy_list = []
        p = re.compile(r'''<div>(.+?)<span class="Apple-tab-span" style="white-space:pre">.*?</span>(.+?)<span class="Apple-tab-span" style="white-space:pre">.+?</span>(.+?)(<span.+?)?</div>''')   
        try:
            res = urllib2.urlopen(url)
        except urllib2.URLError:
            print 'url Error'
            sys.exit(1)
            
        pageinfo = res.read()
        res = p.findall(pageinfo) #掏出全部的
        #组合成全部理代服务器表列成一个符合规矩的list
        for i in res:
            ip = i[0]
            port = i[1]
            addr = i[2]
            l = (ip,port,addr)
            proxy_list.append(l)
        return proxy_list
    
    
    #步同锁装饰器
    lock = threading.Lock()
    
    def synchronous(f):
        def call(*args, **kw):
            lock.acquire()
            try:
                return f(*args, **kw)
            finally:
                lock.release()
        return call
    
    
    #间时计算器 
    def sumtime(f):
        def call(*args, **kw):
            t1 = time.time()
            try:
                return f(*args, **kw)
            finally:
                print u'共总用时 %s' % (time.time() - t1)
        return call
    
    
    proxylist = []
    reslist = []
    
    #取获单个理代并理处
    @synchronous
    def getoneproxy():
        global proxylist
        if len(proxylist)>0:
            return proxylist.pop()
        else:
            return ''
    
    #添加验证胜利的理代    
    @synchronous
    def getreslist(proxy):
        global reslist
        if not (proxy in reslist):
            reslist.append(proxy)
            
    def handle():
        timeout = 10
        test_url = r'http://www.baidu.com'
        test_str = '030173'
        
        while 1:
            proxy = getoneproxy()
            #最后一个回返是空
            if not proxy: 
                return        
            print u"正在验证 : %s" %proxy[0]
            
            #第一步启用 cookie
            cookies = urllib2.HTTPCookieProcessor()
            proxy_server = r'http://%s:%s' %(proxy[0],proxy[1])
            #第二步 装载理代
            proxy_hander = urllib2.ProxyHandler({"http":proxy_server})            
            #第三步 组合request
            try:
                opener = urllib2.build_opener(cookies, proxy_hander)
                pass 
            except urllib2.URLError:
                print u'url设置错误'
                continue 
            #配置request 
            opener.addheaders = [('User-Agent','Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.89 Safari/537.1')]
            #发送请求
            urllib2.install_opener(opener)
            t1 = time.time()
            try:
                req = urllib2.urlopen(test_url,timeout=timeout)
                result = req.read()
                pos = result.find(test_str)
                timeused = time.time() - t1 
                if pos>1:
                    #保存到表列中
                    getreslist((proxy[0],proxy[1],proxy[2],timeused))
                    print u'胜利采集',proxy[0],timeused
                else:   
                    continue
            except Exception,e:
                print u'采集失败 %s :timeout' %proxy[0]
                continue         
    
    def save(reslist):
        path = os.getcwd()
        filename = path + '/Proxy-'+datetime.datetime.now().strftime(r'%Y%m%d%H%M%S')+'.txt'
        f = open(filename,'w+')
        for proxy in reslist:
            f.write('%s %s %s %s \r\n'%(proxy[0],proxy[1],proxy[2],proxy[3]))
        f.close()
    
    @sumtime
    def main():
        url = r'http://www.free998.net/daili/httpdaili/8949.html'
        global proxylist,reslist
        #取获全部线程 
        proxylist = get_proxy_page(url)
        print u'一共取获 %s 个理代' %len(proxylist)
        #print proxylist
        print '*'*80   
        
        #线程建创和分发务任
        print u'开始建创线程理处.....'
        threads = []
        proxy_num = len(proxylist)
        
        for i in range(proxy_num):
            th = threading.Thread(target=handle, args=())
            threads.append(th)
            
        for thread in threads:
            thread.start()
            
        for thread in threads:
            threading.Thread.join(thread)
        
        print u'取获有效理代 %s 个,当初开始排序和保存 '%len(reslist)    
        reslist = sorted(reslist,cmp=lambda x,y:cmp(x[3],y[3]))
        save(reslist)
                         
        
    if __name__=='__main__':
        main()
        每日一道理
    漫漫人生路,谁都难免会遭遇各种失意或厄运。在凄风苦雨 惨雾愁云的考验面前,一个强者,是不会向命运低头的。风再冷,不会永远不息;雾再浓,不会经久不散。风息雾散,仍是阳光灿烂。

        

        出输:

        一共取获 31 个理代
    ********************************************************************************
    开始建创线程理处.....
    正在验证 : 122.10.48.13
    正在验证 : 122.72.76.121
    正在验证 : 122.72.11.129
    正在验证 : 222.89.159.131
    正在验证 : 218.5.74.174
    正在验证 : 218.203.107.165
    正在验证 : 219.224.101.81
    正在验证 : 221.176.169.14
    正在验证 : 112.5.254.85
    正在验证 : 113.106.73.210
    正在验证 : 114.247.21.212
    正在验证 : 122.72.76.122
    正在验证 : 219.239.26.23
    正在验证 : 222.89.154.14
    正在验证 : 58.67.147.197
    正在验证 : 222.188.88.26
    正在验证 : 103.247.16.241
    正在验证 : 183.221.250.141
    正在验证 : 183.221.250.137
    正在验证 : 122.72.80.108
    正在验证 : 122.72.76.125
    正在验证 : 122.72.11.131
    正在验证 : 122.72.80.101
    正在验证 : 122.72.120.41
    正在验证 : 122.72.120.38
    正在验证 : 122.72.120.35
    正在验证 : 218.203.105.26
    正在验证 : 221.130.18.211
    正在验证 : 110.77.236.48
    正在验证 : 218.91.206.146
    正在验证 : 211.162.16.210
    胜利采集 114.247.21.212 0.300999879837
    胜利采集 218.203.105.26 0.306999921799
    胜利采集 221.176.169.14 0.417000055313
    胜利采集 122.72.120.35 0.369999885559
    采集失败 218.5.74.174 :timeout
    胜利采集 122.72.120.38 0.40900015831
    胜利采集 183.221.250.137 0.608999967575
    胜利采集 122.72.11.131 0.679999828339
    胜利采集 183.221.250.141 0.791000127792
    胜利采集 113.106.73.210 0.891000032425
    胜利采集 122.72.76.121 1.40299987793
    胜利采集 122.72.80.108 1.4470000267
    胜利采集 211.162.16.210 1.625
    胜利采集 122.72.76.125 1.6819999218
    胜利采集 112.5.254.85 1.74399995804
    胜利采集 122.72.80.101 1.79799985886
    胜利采集 122.72.11.129 2.00900006294
    胜利采集 122.72.120.41 1.99099993706
    采集失败 222.188.88.26 :timeout
    胜利采集 122.72.76.122 3.49100017548
    胜利采集 218.91.206.146 3.66000008583
    胜利采集 122.10.48.13 3.91799998283
    胜利采集 222.89.154.14 3.93499994278
    胜利采集 222.89.159.131 3.99699997902
    胜利采集 221.130.18.211 3.99500012398
    采集失败 219.224.101.81 :timeout采集失败 218.203.107.165 :timeout


    采集失败 58.67.147.197 :timeout
    采集失败 103.247.16.241 :timeout
    采集失败 110.77.236.48 :timeout
    胜利采集 219.239.26.23 12.2809998989
    取获有效理代 24 个,当初开始排序和保存 
    共总用时 13.2810001373

    文章结束给大家分享下程序员的一些笑话语录:  一边用着越狱的ip,一边拜乔帮主的果粉自以为是果粉,其实在乔帮主的眼里是不折不扣的叛徒。

  • 相关阅读:
    Python字符串的encode与decode
    python数据操作方法封装
    python的继承
    python常用模块
    python导入模块和包的使用
    python实现curl功能
    [转]Java反射机制详解
    kafka入门
    [转]Servlet的学习之Filter过滤器技术
    [转]Java泛型
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3057392.html
Copyright © 2011-2022 走看看