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. ng-options bug解决方案(示例)

    情况: 无法获取 ng-model 的值 解决方案: 绑定到对象的属性值上 1.页面 <ion-view hide-nav-bar="true"> <ion-co ...

  2. ACM-ICPC如何起步[转]

    ACM-ICPC如何起步 刚刚绝定投身ACM-ICPC的同学先要过两关. 第一关:程序设计语言 如果学校有开设相关课程,则省去了很多麻烦.如果没有则可以选择<程序设计导引及在线实践>作为教 ...

  3. shell学习五十六天----延迟进程调度

    延迟进程调度 前言:大部分时候,我们都希望进程快点開始,开点结束,别卡.而shell的运行,也是在前一个命令后,立即接着运行下一个命令.命令完毕的速度是与资源的限制有关,且不在shell的权限下. 在 ...

  4. 【ACdream】1157 Segments cdq分治

    Segments   Problem Description 由3钟类型操作:1)D L R(1 <= L <= R <= 1000000000) 增加一条线段[L,R]2)C i ...

  5. Mac使用小结

    1.修改pip的镜像地址及更新pip https://www.cnblogs.com/techroad4ca/p/5922389.html 2.更新python的库,比如更新six sudo pip ...

  6. java中创建对象的五种方法

    用最简单的描述来区分new关键字和newInstance()方法的区别:newInstance: 弱类型.低效率.只能调用无参构造.new: 强类型.相对高效.能调用任何public构造. newIn ...

  7. redis13-----配置文件

    ==配置文件全解=== ==基本配置 daemonize no 是否以后台进程启动 databases 创建database的数量(默认选中的是database ) #刷新快照到硬盘中,必须满足两者要 ...

  8. Android ADB实现解析【转】

    本文转载自:http://blog.csdn.net/u010223349/article/details/41120255   ADB是Android系统提供的调试工具,整个ADB工具由三部分组成: ...

  9. Linux时间子系统之四:定时器的引擎:clock_event_device【转】

    本文转载自:http://blog.csdn.net/droidphone/article/details/8017604 版权声明:本文为博主原创文章,未经博主允许不得转载.   目录(?)[+] ...

  10. repo 工具下载 以及 android代码下载【转】

    本文转载自:http://www.enjoydiy.com/608.html 我们可以从https://www.codeaurora.org/网站下载android源码. 具体方法如下: 下载repo ...