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

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

mysqlDriver.py

#!/usr/bin/python3
#-*- coding: utf-8 -*-
# author:zhouchao
# mysql 驱动模型类
import pymysql;
import traceback; class mysqlDriver:
host="localhost";
user="root";
password="";
database="fitcmoe_boke";
charset="GBK";
db = "false"; # 连接数据库
def connect(self, host="", user="",password="",database="",charset = ""):
if host and user :
self.host = host;
self.user = user;
self.password = password;
self.database = database;
self.charset = charset;
self.db=pymysql.connect(host=self.host,user=self.user,password=self.password,database=self.database,charset=self.charset); # 查询多条
def select(self,sql,params = []):
if params :
sql = self.bindParams(sql, params);
# print(sql);return;
cursor = self.db.cursor();
cursor.execute(sql);
data = cursor.fetchall();
self.db.close();
return data; # 查询单条
def find(self,sql,params = []):
if params :
sql = self.bindParams(sql, params);
cursor = self.db.cursor();
cursor.execute(sql);
data = cursor.fetchone();
self.db.close();
return data; # 新增
def add(self,sql,params=[]):
if params :
sql = self.bindParams(sql, params);
try:
cursor = self.db.cursor();
cursor.execute(sql);
newId = self.db.insert_id();
self.db.commit();
self.db.close();
return newId;
except "involid level":
# 发生错误时回滚
print("发生异常","involid level");
self.db.rollback();
self.db.close(); # 更新
def save(self,sql,params=[]):
if params :
sql = self.bindParams(sql, params);
try:
cursor = self.db.cursor();
resultNum=cursor.execute(sql);
self.db.commit();
self.db.close();
return resultNum;
except "involid level":
# 发生错误时回滚
print("发生异常","involid level");
self.db.rollback();
self.db.close(); def delete(self,sql,params=[]):
if params :
sql = self.bindParams(sql, params);
# self.file_put_contents('rt.txt',sql,'append');
# print(sql);return;
try:
cursor = self.db.cursor();
resultNum=cursor.execute(sql);
self.db.commit();
self.db.close();
return resultNum;
except "involid level":
# 发生错误时回滚
print("发生异常","involid level");
self.db.rollback();
self.db.close(); # 参数绑定 空格好奇怪啊
def bindParams(self,sql, params):
finalSql = "";
length = len(sql);
replaceNum = 0;
for x in sql:
if x == "?":
x = params[replaceNum];
typeX = type(x);
if typeX.__name__ == "list":
temp = '(';
for t in x:
temp += "'" +str(t)+"',";
x=temp.rstrip(",");
x+=")";
else :
if str(x).isdigit() :
x = int(x);
else:
x = "'" +str(x) +"'"; replaceNum = replaceNum + 1;
finalSql += str(x);
# finalSql += x;
return finalSql; # 将sql 写入本地文件
# r+ = pappend 向前追加
# w+ = 覆盖添加
# a+ = append 向后追加
def file_put_contents(self,fileName,content,modeName =''):
if(modeName == 'pappend'):
mode = "r+";
elif(modeName == 'append'):
mode = "a+";
else:
mode = "w+"; fileObject = open(fileName,mode);
fileObject.write(content);
fileObject.close(); # 使用说明 异常处理类问题??
# ? 代表参数
# ? 可以是列表或数字 如 [1,3,5,7] 和 3
# # 参数位置是按照顺序的 # 简单使用
# mysqlD = mysqlDriver();
# mysqlD.connect();
# data = mysqlD.select("select from t_article where id in ? limit ? ",[[33,34,35,38],3]);
# data = mysqlD.delete("delete from t_article where aid in ?",[[43,44,270,280]]);

文件下载函数

file_get_contents.py

#!/usr/bin/python3
#-*- coding: utf-8 -*-
# author:zhouchao
# 文件处理函数 def file_get_contents(path,mode="r+"):
fileObject = open(path,mode);
content = fileObject.read();
fileObject.close();
return content; # r+ = pappend 向前追加
# w+ = 覆盖添加
# a+ = append 向后追加
# wb+ 直接使用二进制添加
def file_put_contents(fileName,content,modeName =''): if(modeName == 'pappend'):
mode = "r+";
elif(modeName == 'append'):
mode = "a+";
elif(modeName == 'wb+'):
mode = "wb+";
else:
mode = "w+"; fileObject = open(fileName,mode);
fileObject.write(content);
fileObject.close(); # file_put_contents('rt.txt','da ge');

批量远程图片下载

multiPool.py

#!/usr/bin/python3
#-*- coding: utf-8 -*-
# author:zhouchao
# 功能:多线程 批量下载远程图片 import random
import time
import os
import math
from multiprocessing.dummy import Pool as ThreadPool
import urllib.request
import requests
import sys
sys.path.append(r"../db")
sys.path.append(r"../function")
from file_get_contents import *
from mysqlDriver import * sql = "select img from images limit ?";
mysqlD = mysqlDriver();
mysqlD.connect();
data = mysqlD.select(sql, [100]) saveDir = "D:/images/";
def downImg(url):
url = url[0];
ir = requests.get(url)
if ir.status_code == 200:
# wb+ 保存二进制
fileName = str(time.time()) +'.jpg';
file_put_contents(saveDir+fileName,ir.content,"wb+"); startTime = time.time(); # 不开启多线程
# length = len(data);
# for x in range(length):
# downImg(data[x][0]) # 开启多线程
pool = ThreadPool(8) # Sets the pool size to 4
results = pool.map(downImg,data);
pool.close();
pool.join(); endTime = time.time();
consumeTime = endTime - startTime
print("程序运行时间:"+str(consumeTime)+" 秒")

注意:

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

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. zoj 3573 Under Attack(线段树 标记法 最大覆盖数)

    Under Attack Time Limit:  10 Seconds      Memory Limit:  65536 KB  Doctor serves at a military air f ...

  2. HDU 6044 Limited Permutation 读入挂+组合数学

    Limited Permutation Problem Description As to a permutation p1,p2,⋯,pn from 1 to n, it is uncomplica ...

  3. weblogic启动后 登陆控制台特别慢的问题

    weblogic官方文档给出的问题原因: 江湖偏方: 修改jdk:修改$JAVA_HOME/jre/lib/security/java.security文件,替换securerandom.source ...

  4. cat /proc/cpuinfo | awk -F: '/name/{print $2}' | uniq -c

    cat /proc/cpuinfo | awk -F: '/name/{print $2}' | uniq -c

  5. js对table操作(添加删除交换上下TR)

    <table width="100%" border="0" cellpadding="2" cellspacing="1& ...

  6. extjs 4 checkboxgroup Panel的简单用法

    Ext.require([ 'Ext.tree.*', 'Ext.data.*', 'Ext.window.MessageBox', 'Ext.tip.*' ]); Ext.onReady(funct ...

  7. CentOS7.2编译GCC7.3

    1.环境 本文使用VMWare虚拟机进行实验. 4 核CPU, 4GB 内存,20GB 硬盘,CentOS 7.2 最小安装(CentOS-7-x86_64-Minimal-1511.iso) 2.需 ...

  8. adb client, adb server, adbd原理浅析(附带我的操作过程)【转】

    本文转载自:http://blog.csdn.net/stpeace/article/details/24933813 adb是什么? adb就是Android调试桥,很形象啊. 先来看adb原理的逻 ...

  9. 牛客练习赛42 E.热爆了

    这可能是全场最长的一份代码 问的其实是对于关键点的斯坦纳树大小 考虑补集转化,不合法的点就是它的子树中没有关键点的点和斯坦纳树根的祖先 树根不难求,关键点中dfs序最大最小点的LCA就是了 问题在前者 ...

  10. python中的异常处理try/except/finally/raise

    异常发生在程序执行的过程中,如果python无法正常处理程序就会发生异常,导致整个程序终止执行,python中使用try/except语句可以捕获异常. try/except 异常的种类有很多,在不确 ...