python多线程使用场景:多线程采集, 以及性能测试等 。

数据库驱动类-简单封装下

mysqlDriver.py

  1. #!/usr/bin/python3
  2. #-*- coding: utf-8 -*-
  3. # author:zhouchao
  4. # mysql 驱动模型类
  5. import pymysql;
  6. import traceback;
  7.  
  8. class mysqlDriver:
  9. host="localhost";
  10. user="root";
  11. password="";
  12. database="fitcmoe_boke";
  13. charset="GBK";
  14. db = "false";
  15.  
  16. # 连接数据库
  17. def connect(self, host="", user="",password="",database="",charset = ""):
  18. if host and user :
  19. self.host = host;
  20. self.user = user;
  21. self.password = password;
  22. self.database = database;
  23. self.charset = charset;
  24. self.db=pymysql.connect(host=self.host,user=self.user,password=self.password,database=self.database,charset=self.charset);
  25.  
  26. # 查询多条
  27. def select(self,sql,params = []):
  28. if params :
  29. sql = self.bindParams(sql, params);
  30. # print(sql);return;
  31. cursor = self.db.cursor();
  32. cursor.execute(sql);
  33. data = cursor.fetchall();
  34. self.db.close();
  35. return data;
  36.  
  37. # 查询单条
  38. def find(self,sql,params = []):
  39. if params :
  40. sql = self.bindParams(sql, params);
  41. cursor = self.db.cursor();
  42. cursor.execute(sql);
  43. data = cursor.fetchone();
  44. self.db.close();
  45. return data;
  46.  
  47. # 新增
  48. def add(self,sql,params=[]):
  49. if params :
  50. sql = self.bindParams(sql, params);
  51. try:
  52. cursor = self.db.cursor();
  53. cursor.execute(sql);
  54. newId = self.db.insert_id();
  55. self.db.commit();
  56. self.db.close();
  57. return newId;
  58. except "involid level":
  59. # 发生错误时回滚
  60. print("发生异常","involid level");
  61. self.db.rollback();
  62. self.db.close();
  63.  
  64. # 更新
  65. def save(self,sql,params=[]):
  66. if params :
  67. sql = self.bindParams(sql, params);
  68. try:
  69. cursor = self.db.cursor();
  70. resultNum=cursor.execute(sql);
  71. self.db.commit();
  72. self.db.close();
  73. return resultNum;
  74. except "involid level":
  75. # 发生错误时回滚
  76. print("发生异常","involid level");
  77. self.db.rollback();
  78. self.db.close();
  79.  
  80. def delete(self,sql,params=[]):
  81. if params :
  82. sql = self.bindParams(sql, params);
  83. # self.file_put_contents('rt.txt',sql,'append');
  84. # print(sql);return;
  85. try:
  86. cursor = self.db.cursor();
  87. resultNum=cursor.execute(sql);
  88. self.db.commit();
  89. self.db.close();
  90. return resultNum;
  91. except "involid level":
  92. # 发生错误时回滚
  93. print("发生异常","involid level");
  94. self.db.rollback();
  95. self.db.close();
  96.  
  97. # 参数绑定 空格好奇怪啊
  98. def bindParams(self,sql, params):
  99. finalSql = "";
  100. length = len(sql);
  101. replaceNum = 0;
  102. for x in sql:
  103. if x == "?":
  104. x = params[replaceNum];
  105. typeX = type(x);
  106. if typeX.__name__ == "list":
  107. temp = '(';
  108. for t in x:
  109. temp += "'" +str(t)+"',";
  110. x=temp.rstrip(",");
  111. x+=")";
  112. else :
  113. if str(x).isdigit() :
  114. x = int(x);
  115. else:
  116. x = "'" +str(x) +"'";
  117.  
  118. replaceNum = replaceNum + 1;
  119. finalSql += str(x);
  120. # finalSql += x;
  121. return finalSql;
  122.  
  123. # 将sql 写入本地文件
  124. # r+ = pappend 向前追加
  125. # w+ = 覆盖添加
  126. # a+ = append 向后追加
  127. def file_put_contents(self,fileName,content,modeName =''):
  128. if(modeName == 'pappend'):
  129. mode = "r+";
  130. elif(modeName == 'append'):
  131. mode = "a+";
  132. else:
  133. mode = "w+";
  134.  
  135. fileObject = open(fileName,mode);
  136. fileObject.write(content);
  137. fileObject.close();
  138.  
  139. # 使用说明 异常处理类问题??
  140. # ? 代表参数
  141. # ? 可以是列表或数字 如 [1,3,5,7] 和 3
  142. # # 参数位置是按照顺序的
  143.  
  144. # 简单使用
  145. # mysqlD = mysqlDriver();
  146. # mysqlD.connect();
  147. # data = mysqlD.select("select from t_article where id in ? limit ? ",[[33,34,35,38],3]);
  148. # data = mysqlD.delete("delete from t_article where aid in ?",[[43,44,270,280]]);

文件下载函数

file_get_contents.py

  1. #!/usr/bin/python3
  2. #-*- coding: utf-8 -*-
  3. # author:zhouchao
  4. # 文件处理函数
  5.  
  6. def file_get_contents(path,mode="r+"):
  7. fileObject = open(path,mode);
  8. content = fileObject.read();
  9. fileObject.close();
  10. return content;
  11.  
  12. # r+ = pappend 向前追加
  13. # w+ = 覆盖添加
  14. # a+ = append 向后追加
  15. # wb+ 直接使用二进制添加
  16. def file_put_contents(fileName,content,modeName =''):
  17.  
  18. if(modeName == 'pappend'):
  19. mode = "r+";
  20. elif(modeName == 'append'):
  21. mode = "a+";
  22. elif(modeName == 'wb+'):
  23. mode = "wb+";
  24. else:
  25. mode = "w+";
  26.  
  27. fileObject = open(fileName,mode);
  28. fileObject.write(content);
  29. fileObject.close();
  30.  
  31. # file_put_contents('rt.txt','da ge');

批量远程图片下载

multiPool.py

  1. #!/usr/bin/python3
  2. #-*- coding: utf-8 -*-
  3. # author:zhouchao
  4. # 功能:多线程 批量下载远程图片
  5.  
  6. import random
  7. import time
  8. import os
  9. import math
  10. from multiprocessing.dummy import Pool as ThreadPool
  11. import urllib.request
  12. import requests
  13. import sys
  14. sys.path.append(r"../db")
  15. sys.path.append(r"../function")
  16. from file_get_contents import *
  17. from mysqlDriver import *
  18.  
  19. sql = "select img from images limit ?";
  20. mysqlD = mysqlDriver();
  21. mysqlD.connect();
  22. data = mysqlD.select(sql, [100])
  23.  
  24. saveDir = "D:/images/";
  25. def downImg(url):
  26. url = url[0];
  27. ir = requests.get(url)
  28. if ir.status_code == 200:
  29. # wb+ 保存二进制
  30. fileName = str(time.time()) +'.jpg';
  31. file_put_contents(saveDir+fileName,ir.content,"wb+");
  32.  
  33. startTime = time.time();
  34.  
  35. # 不开启多线程
  36. # length = len(data);
  37. # for x in range(length):
  38. # downImg(data[x][0])
  39.  
  40. # 开启多线程
  41. pool = ThreadPool(8) # Sets the pool size to 4
  42. results = pool.map(downImg,data);
  43. pool.close();
  44. pool.join();
  45.  
  46. endTime = time.time();
  47. consumeTime = endTime - startTime
  48. print("程序运行时间:"+str(consumeTime)+" 秒")

注意:

  1. sys.path.append(r"../db")
  2. sys.path.append(r"../function")
    请引用自己保存文件路径
  3.  
  4. 没有开启和开启多线程所耗时间:

python多线程批量下载远程图片的更多相关文章

  1. 批量下载网站图片的Python实用小工具

    定位 本文适合于熟悉Python编程且对互联网高清图片饶有兴趣的筒鞋.读完本文后,将学会如何使用Python库批量并发地抓取网页和下载图片资源.只要懂得如何安装Python库以及运行Python程序, ...

  2. 批量下载网站图片的Python实用小工具(下)

    引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...

  3. php 下载远程图片 的几种方法(转)

    1.获取远程文件大小及信息的函数 function getFileSize($url){          $url = parse_url($url);          if($fp = @fso ...

  4. php下载远程图片方法总结(curl手动解析header)curl跳转问题解决

    常用方法一般有:. file_get_contents file_put_contents readfile($file) //效率很高. 一般代码: /** * 抓取远程图片 * * @param ...

  5. php下载远程图片到本地

    在使用 PHP 做简单的爬虫的时候,我们经常会遇到需要下载远程图片的需求,所以下面来简单实现这个需求1:使用curl 比如我们有下面这两张图片: $images = [ 'https://img.al ...

  6. 织梦dedecms 无法下载远程图片 fsockopen函数被禁用的解决方法

    在linux服务器上fsockopen()函数被无情的禁用了(这其实是出于安全考虑,可以理解),下载远程图片的功能就没有办法使用了.找了一些资料之后,找到了解决方法,就是用stream_socket_ ...

  7. 从CSV文件中读取jpg图片的URL地址并多线程批量下载

    很多时候,我们的网站上传图片时并没有根据内容进行文件夹分类,甚至会直接存储到阿里云的OSS或是七牛云等云存储上.这样,当我们需要打包图片时,就需要从数据库找寻分类图片,通过CURL进行下载.我最近刚刚 ...

  8. python图片爬虫 - 批量下载unsplash图片

    前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...

  9. [记录][python]python爬虫,下载某图片网站的所有图集

    随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html 该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集 ...

随机推荐

  1. JAVASE学习笔记:第八章 经常使用类Util工具包之日期类、数字类

    一.Date类   日期类 所在java.Util工具包     before(Date when)   測试此日期是否在指定日期之前. getDay()  获取星期的某一天     getDate( ...

  2. Web优化 --利用css sprites降低图片请求

    sprites是鬼怪,小妖精,调皮鬼的意思,初听这个高端洋气的名字我被震慑住了,一步步掀开其面纱后发觉非常easy的东西.作用却非常大 什么是CSS Sprites CSS Sprites是指把网页中 ...

  3. freeIPMI README && issue about OpenIPMI kernel driver

    http://www.gnu.org/software/freeipmi/README FreeIPMI - Copyright (C) 2003-2013 FreeIPMI Core Team Fr ...

  4. Maple入门使用教程

    http://anony3721.blog.163.com/blog/static/51197420105173915247/ 命令的运行:1.每条命令必须用":"(运行后不显示) ...

  5. java之集合Collection 具体解释之4

    package cn.itcast_04; public class Student { private String name; private int age; public Student() ...

  6. label 对齐

    <label for="username">用户名</label> <input type="text" id="use ...

  7. (转载)js(jquery)的on绑定点击事件执行两次的解决办法

    js(jquery)的on绑定点击事件执行两次的解决办法—不是事件绑定而是事件冒泡 遇到的问题:jquery中用.on()给页面中新加的元素添加点击事件时,点击事件源,绑定的事件执行两次,这里的ale ...

  8. java -jar 与nohup的区别

    ——作为java程序员,经常会遇到这样一个问题,打个jar包,测试或者上线生产,于是乎面临的选择来了,java –jar or nohup? 下面我来扒一扒: 一.    java -jar a.ja ...

  9. webpack 的编译原理

    自从接触了react,vue 这两个框架,都会用到webpack这个打包工具.面试的时候,经常被问到知道webpack的编译原理吗? 可以简单的介绍一下.每每这个时候都被问的哑口无言,平时用的时候挺顺 ...

  10. js中一些常见写法的含义

    1. 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号 ...