网络编程-协程-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()
 

 运行效果:

 

转载于:https://www.cnblogs.com/lz-tester/p/9392299.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值