网络编程-协程-3、使用协程创建多任务高效率爬虫图片

知识点:协程在博客前面的章节已经说了,特点是效率高,占用资源小,这里就用协程做一个高效率爬虫图片的案例

 

1、我这里就爬一百多张意思一下:


import re
from urllib import request
from gevent import monkey
import gevent
import os


"""思路:1、获取页面的html信息
2、分析html中哪个是图片的地址信息
3、用正则表达式去获取图片地址信息
4、创建多任务函数
5、创建gevent运行多任务函数
"""


# 自动替换任务中耗时为gevent中的耗时
monkey.patch_all()
"""提取网页中图片地址"""
headeers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)\
Chrome/65.0.3325.181 Safari/537.36'}
url = 'http://699pic.com/food.html?sem=1&sem_kid=45712&sem_type=1'
res = request.Request(url=url,headers=headeers)
result = request.urlopen(res).read().decode('utf-8')
a = r"(?<=data-original=\").+?(?=\")|(?<=data-original=\').+?(?=\')"
urls = re.finditer(a, result) # 利用正则表达式获取页面中所有图片地址,finditer返货一个迭代器,在任务中用next先取出对象,
#然后用group取出图片的url

# 新建一个文件夹
name2 = 'img'
os.mkdir(name2)

"""创建俩个任务,利用gevent同时执行下载图片任务,也可以建多个下载任务,提高效率"""
def down_load(urls):
name2 = './img'
num = 1
while True:
name1 = str(num) + '.jpg'
try:
jpg = request.urlopen(next(urls).group()).read() # next(urls).group()获取到的就是图片地址
except:
break
with open(name2 + '/' + name1, 'wb') as f: # 将图片写到文件中
f.write(jpg)
num += 1


def down_load1(urls):
num1 = 1
while True:
name1 = '0'+str(num1) + '.jpg'
try:
jpg = request.urlopen(next(urls).group()).read()
except:
break
with open(name2 + '/' + name1, 'wb') as f:
f.write(jpg)
num1 += 1


def main():
t1 = gevent.spawn(down_load, urls)
t2 = gevent.spawn(down_load1, urls)
gevent.joinall([t1, t2])


if __name__ == '__main__':
main()
 

 运行效果:

 

posted @ 2018-07-30 19:21  上海小盖伦  阅读(173)  评论(0编辑  收藏  举报