python多线程多队列(BeautifulSoup网络爬虫)详解编程语言

程序大概内容如下:

程序中设置两个队列分别为queue负责存放网址,out_queue负责存放网页的源代码。

ThreadUrl线程负责将队列queue中网址的源代码urlopen,存放到out_queue队列中。

DatamineThread线程负责使用BeautifulSoup模块从out_queue网页的源代码中提取出想要的内容并输出。

这只是一个基本的框架,可以根据需求继续扩展。

程序中有很详细的注释,如有有问题跪求指正啊。

    import Queue   
    import threading   
    import urllib2   
    import time   
    from BeautifulSoup import BeautifulSoup   
       
    hosts = ["http://yahoo.com","http://taobao.com","http://apple.com",   
             "http://ibm.com","http://www.amazon.cn"]   
       
    queue = Queue.Queue()#存放网址的队列   
    out_queue = Queue.Queue()#存放网址页面的队列   
       
    class ThreadUrl(threading.Thread):   
        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()   
                url = urllib2.urlopen(host)   
                chunk = url.read()   
                self.out_queue.put(chunk)#将hosts中的页面传给out_queue   
                self.queue.task_done()#传入一个相当于完成一个任务   
       
    class DatamineThread(threading.Thread):   
        def __init__(self,out_queue):   
            threading.Thread.__init__(self)   
            self.out_queue = out_queue   
       
        def run(self):   
            while True:   
                chunk = self.out_queue.get()   
                soup = BeautifulSoup(chunk)#从源代码中搜索title标签的内容   
                print soup.findAll(['title'])   
                self.out_queue.task_done()   
       
    start = time.time()   
    def main():   
        for i in range(5):   
            t = ThreadUrl(queue,out_queue)#线程任务就是将网址的源代码存放到out_queue队列中   
            t.setDaemon(True)#设置为守护线程   
            t.start()   
       
        #将网址都存放到queue队列中   
        for host in hosts:   
            queue.put(host)   
       
        for i in range(5):   
            dt = DatamineThread(out_queue)#线程任务就是从源代码中解析出<title>标签内的内容   
            dt.setDaemon(True)   
            dt.start()   
       
        queue.join()#线程依次执行,主线程最后执行   
        out_queue.join()   
       
    main()   
    print "Total time :%s"%(time.time()-start)  

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/8228.html

(0)
上一篇 2021年7月18日
下一篇 2021年7月18日

相关推荐

发表回复

登录后才能评论