python多线程应用实例

来源:互联网 发布:仿有赞微商城源码 编辑:程序博客网 时间:2024/06/05 20:24
#!/usr/env  python
#-*- coding: utf-8  -*-
import urllib
import urllib2
import random
import requests
import os,sys
import Queue
import threading
import MySQLdb
from sgmllib import SGMLParser
import re
queue = Queue.Queue()
out_queue = Queue.Queue()
num=0
try:
    conn=MySQLdb.connect(host='localhost',user='root',passwd='123456',db='addressbookdb',charset="utf8")
    conn.query("set names utf8")
except Exception,e:
    print e
    sys.exit()
cursor=conn.cursor()

class ThreadUrl(threading.Thread):
    """Threaded Url Grab"""
    def __init__(self, queue, out_queue):
        threading.Thread.__init__(self)
        self.queue = queue
        self.out_queue = out_queue

    def run(self):
        while True:
            
            host = self.queue.get()
            print host
            html=requests.get(host)
            result=html.content
            #place chunk into out queue
            self.out_queue.put(result)

            #signals to queue job is done
            self.queue.task_done()

class DatamineThread(threading.Thread):
    """Threaded Url Grab"""
    def __init__(self, out_queue):
        threading.Thread.__init__(self)
        self.out_queue = out_queue

    def run(self):
        while True:
            #grabs host from queue
            result = self.out_queue.get()
            pattern=re.compile('<div class="appdiscrib">[\s\S]*?<h4>(.+?)</h4>')
            data0=re.findall(pattern,result)
            #print data0[0]
            pattern=re.compile('版 本 号(.+?)</li>')
            data1=re.findall(pattern,result)
            pattern=re.compile('开 发 者(.+?)</li>')
            data2=re.findall(pattern,result)
            pattern=re.compile('发布时间(.+?)</li>')
            data3=re.findall(pattern,result)
            pattern=re.compile('文件大小(.+?)</li>')
            data4=re.findall(pattern,result)
            pattern=re.compile('支持固件(.+?)</li>')
            data5=re.findall(pattern,result)
            pattern=re.compile('应用介绍</h3>[\s\S]*?<div class="intro">([\s\S]*?)</div>')
            data6=re.findall(pattern,result)
            for items in data6:
                pass#print re.sub('<br />',' ',items)
            sql="insert into address(name,version,developer,pubtime,filesize,support,introduction) values(%s,%s,%s,%s,%s,%s,%s)"
            for items in data6:
            
                if(data5):
                    values=(data0[0],data1[0],data2[0],data3[0],data4[0],data5[0],re.sub('<br />',' ',items))
                else:
                    values=(data0[0],data1[0],data2[0],data3[0],data4[0],'NULL',re.sub('<br />',' ',items))
                #print values
                #print sql % values
                #cursor.execute(sql,values)
                #conn.commit()
            pattern=re.compile(' <div class="appTitle clearfix">[\s\S]*?<img src=(.+?)/>')
            data=re.findall(pattern,result)
            for j in data:
                print j
                global num
      
                temp=requests.get(j[1:-2])
                f=file("picture/"+str(num),"w+")
                num=num+1
                print num
                f.write(temp.content)
                f.close()  
           
            self.out_queue.task_done()
def main():
    
    for k in range(1,2539):
        url="http://apk.gfan.com/apps_7_1_"+str(k)+".html"
        html=requests.get(url)
        result=html.content
        pattern=re.compile('<a href="([http://apk.gfan.com]?/Product/App\d{1,8}.html)"')
        dataresult=re.findall(pattern,result)
        dataresult=list(set(dataresult))
        
        for a in range(20):
            w = ThreadUrl(queue, out_queue)
            w.setDaemon(True)
            w.start()
        for i in dataresult:
            host="http://apk.gfan.com"+i
            
            queue.put(host)
        for a in range(20):
            dt = DatamineThread(out_queue)
            dt.setDaemon(True)
            dt.start()
        print "hello"
        queue.join()
        out_queue.join()
        
                    
            
    sql="select * from address"
    cursor.execute(sql)
    conn.commit()
    finalresult=cursor.fetchall()
    if finalresult:
        for x in finalresult:
            pass #print x[0:]
    cursor.close()
    conn.close()
    
if  __name__=="__main__":
       main()