最近学习了一下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()

更多相关文章

  1. 基础入门_Python-进线协程.分分钟玩转multiprocessing多进程编程
  2. Python随心记--进程、线程
  3. 我需要一个django-芹菜守护进程来监听特定的rabbitmq通道
  4. python + selenium多进程分摊爬虫任务基础
  5. 使用nagios+python监控nginx进程数
  6. 脚本结束后如何运行进程并退出?
  7. python subprocess模块 监控子进程的2种方式 忙等待和立即返回同
  8. 初探Linux kernel之进程相关二
  9. 检查进程是否仍在运行

随机推荐

  1. 从零开始学android开发- layout属性介绍
  2. 设置图片重复
  3. win10 编译 Android ffmpeg
  4. android cts 认证测试
  5. Android开机自启动设置
  6. Android上层启动过程的几个关键点
  7. 生成android自签名证书流程
  8. Android(安卓)Log 日志系统
  9. Android HttpURLConnection应用技巧分享
  10. Android属性动画之ObjectAnimator