python使用多进程爬取图片
16lz
2021-01-22
最近学习了一下python的多进程和多线程,于是就想到使用进程去现实一个爬虫。通过比较实用多进程比使用普通函数的效率更高,节省了大量的时间。话不多说,看下面的代码,希望对各位有所帮助。
1 import os, sys, io, urllib, requests, re, chardet, time 2 import multiprocessing 3 4 #设置系统输出流的编码为utf-8 5 sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8') 6 7 headers = { 8 'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Mobile Safari/537.36' 9 } 10 11 url = 'http://www.ivsky.com/tupian/ziranfengguang/' 12 13 def Schedule(blocknum, blocksize, totalsize): 14 """ 15 blocknum:已经下载的数据块 16 blocksize:数据块的大小 17 totalsize:远程文件的大小 18 """ 19 per = blocknum * blocksize / totalsize * 100.0 20 if per > 100: 21 per = 100 22 print('当前下载进度: %.2f%%'%per) 23 24 def download_page(): 25 try: 26 res = requests.get(url, headers=headers) 27 if res.status_code == 200: 28 res.encoding = chardet.detect(res.content).get('encoding')#通过chardet库的detect方法获取页面的编码 29 return res.text 30 except requests.HTTPError as e: 31 return None 32 33 def parser_html(html): 34 if not html: 35 return 36 patt = re.compile(r'<img src="(.*?)" alt="(.*?)" />', re.S)#获取图片的链接和名字 37 content = re.findall(patt, html) 38 return content #返回图片链接和名字列表 39 40 def download_pic(url, name): 41 if not os.path.exists(r'./pic'): 42 os.mkdir(r'./pic') 43 filename = './pic/{}.jpg'.format(name) 44 print('开始下载:{}'.format(name)) 45 urllib.request.urlretrieve(url, filename, Schedule)#使用urllib.request.urlretrieve方法下载图片并返回当前下载进度 46 time.sleep(1) 47 48 if __name__ == '__main__': 49 html = download_page() 50 contents = parser_html(html) 51 for content in contents: 52 p = multiprocessing.Process(target=download_pic, args=(content[0],content[1])) 53 #启动进程和连接进程 54 p.start() 55 p.join()
更多相关文章
- 基础入门_Python-进线协程.分分钟玩转multiprocessing多进程编程
- Python随心记--进程、线程
- 我需要一个django-芹菜守护进程来监听特定的rabbitmq通道
- python + selenium多进程分摊爬虫任务基础
- 使用nagios+python监控nginx进程数
- 脚本结束后如何运行进程并退出?
- python subprocess模块 监控子进程的2种方式 忙等待和立即返回同
- 初探Linux kernel之进程相关二
- 检查进程是否仍在运行