python_queue多线程
2015-07-08 21:19
751 查看
最近在看Queue多线程编程,准备写一个爬虫去爬网站的图片,看到的例子很多是一个固定的任务,用线程去跑几遍,实则Queue与Threading结合的方式是,线程可以从队列中获取一个数据去处理,执行任务函数,也就是说,任务函数的参数必须是队列,而任务函数是以队列中单个数据为参数的一个循环。在此基础上,队列就必须是一个全局变量。这类程序的代码组成如下:
全局变量队列
任务函数(队列)
线程执行函数(线程个数)(for循环)
主函数部分调用线程执行函数
遇到的问题:
(1)关于下载图片时图片编号的问题,这个可以定义在任务函数中;
(2)关于线程的参数,args = XXX, ,这里最好写逗号,否则程序可能会对参数类型判断错误,这里必须是队列。
稍后附上代码,初学python,欢迎各位大神指教。
关于学习的心得,熟悉基本的语法之后,对每个常用的模块要深入学习相关的函数,通过练习加以巩固,否则根本不会知道每个函数每个类型在实际使用中会出现什么样的问题。
以上。
全局变量队列
任务函数(队列)
线程执行函数(线程个数)(for循环)
主函数部分调用线程执行函数
遇到的问题:
(1)关于下载图片时图片编号的问题,这个可以定义在任务函数中;
(2)关于线程的参数,args = XXX, ,这里最好写逗号,否则程序可能会对参数类型判断错误,这里必须是队列。
稍后附上代码,初学python,欢迎各位大神指教。
#!/usr/bin/env python # -*- coding:utf-8 -*- import urllib import re import Queue import hashlib import cStringIO import threading from PIL import Image#第三方图像处理库,这个模块需要自己安装 #获取网页内链接 def get_Url(url): html = urllib.urlopen(url).read() raw_reg = r'<a.*?href="http://\w.*?["|\']+?'#匹配原始链接<a href="http:// " raw_pattern = re.compile(raw_reg) raw_link_list = re.findall(raw_pattern, html) reg = 'http://.*\w+'#匹配链接http:// pattern = re.compile(reg) url_list = [] for raw_link in raw_link_list: link = re.findall(pattern, raw_link) url_list.append(link[0]) return url_list #获取网页图片链接 def get_Img_Url(url): html = urllib.urlopen(url).read() raw_reg = r'<img.*?src="http://\w.+?["|\']+?'#匹配图片原始链接<img src="http:// " raw_pattern = re.compile(raw_reg) raw_img_list = re.findall(raw_pattern, html) reg = 'http://.*\w+'#匹配图片链接http:// pattern = re.compile(reg) img_url_list = [] for raw_img in raw_img_list: img = re.findall(pattern, raw_img)#返回结果为list类型 img_url_list.append(img[0]) return img_url_list url_queue = Queue.Queue() img_queue = Queue.Queue() url_crawled = set() img_crawled = set() set_lock = threading.Lock() first_url = 'http://www.sohu.com' url_queue.put(first_url) #下载图片 def down_Img(url_queue): url_num = 0 while not url_queue.empty(): current_url = url_queue.get() print 'current url is %d' % url_num, current_url url_list = get_Url(current_url) img_url_list = get_Img_Url(current_url) current_url_md5 = hashlib.md5(current_url).hexdigest() set_lock.acquire() url_crawled.add(current_url_md5)#set添加一项用add,添加多项用update img_num = 0 for url in url_list: url_md5 = hashlib.md5(url).hexdigest() if url_md5 not in url_crawled: url_queue.put(url) for img_url in img_url_list: img_url_md5 = hashlib.md5(img_url).hexdigest() if img_url_md5 not in img_crawled: img_queue.put(img_url) img_crawled.add(img_url_md5) try: tmpImg = cStringIO.StringIO(urllib.urlopen(img_url).read()) ImgSize = Image.open(tmpImg).size#图片文件无法识别,抛出IOError if ImgSize[0] > 100 and ImgSize[1] > 100: urllib.urlretrieve(img_url, './get_img/%s.%s.jpg' % (url_num, img_num)) img_num += 1 else: pass except IOError: print 'The img url %s is not valid' % img_url set_lock.release() url_num += 1 def main(threads_num): threads_list = [] for i in range(threads_num): t = threading.Thread(target=down_Img, args=(url_queue, )) threads_list.append(t) for t in threads_list: t.start() if __name__ == '__main__': main(4)
关于学习的心得,熟悉基本的语法之后,对每个常用的模块要深入学习相关的函数,通过练习加以巩固,否则根本不会知道每个函数每个类型在实际使用中会出现什么样的问题。
以上。
相关文章推荐
- 提供给开发者 10 款最好的 Python IDE(转)
- OOP in python DEMO
- 【Python 学习手册笔记】介绍Python对象类型
- 汉诺塔和杨辉三角问题的Python实现
- numpy数组基础知识
- Python Web初学解惑之 WSGI、flup、fastcgi、web.py的关系
- [python] tornado.log将输出定向到stdout
- Python使用QRCode生成二维码
- Python文件夹与文件的操作
- python编程之 模拟时钟
- python 文件操作
- Demo of Python "Map Reduce Filter"
- python的学习
- Python安装PyGraphics包 (使用media模块)问题
- python super()
- python子类调用父类的方法-super
- Python记录日志的方法
- Python记录日志的方法
- python初学-03控制流程
- python strip()