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. java开始到熟悉70-71

    本次内容:file类 package array; /** * file类 */ import java.io.File; import java.io.IOException; public cla ...

  2. C++再论单例模式

    #include <iostream> #include <windows.h> #include <mutex> std::mutex gmutex; using ...

  3. Redis 事务及其应用

    参考: http://www.runoob.com/redis/redis-transactions.html https://www.cnblogs.com/qlshine/p/5958504.ht ...

  4. openwrt network 初始化

    openwrt 烧写完成之后, 第一次启动会设置 network 的相关参数, 如 ip地址, mac地址, 等. 这里跟踪一下启动之后直到网络参数设置的过程. /sbin/init -> pr ...

  5. (转)使用MAT比较多个heap dump文件

    使用MAT比较多个heap dump文件 调试内存泄露时,有时候适时比较2个或多个heap dump文件是很有用的.这时需要生成多个单独的HPROF文件. 下面是一些关于如何在MAT里比较多个heap ...

  6. A new session could not be created. (Original error: Requested a new session but one was in progress) )错误解决办法

    z在desiredCapabilities里新增这俩居然fix了问题,原因暂时不得而知: capabilities.setCapability("unicodeKeyboard", ...

  7. jsp获取sina天气

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  8. huawei校招测试题

    三道题两小时. 第一题,圈住所有点的长方形,很简单略过. 第二题:奇偶排序. 奇偶排序 描述: 输入若干(不超过1000个)非负整数数字,请先取出为奇数的数字按从大到小排序,再取出偶数从小到大进行排序 ...

  9. 简单的shell脚本编写

    http://www.cnblogs.com/wuyuegb2312/p/3399566.html

  10. 6.游戏特别离不开脚本(3)-JS脚本操作java(3)(直接操作JS文件或者调用函数)

    java直接运行JS脚本文件的语句,游戏开发时,策划的配置文件什么的就可以分开管理了,游戏逻辑也是一样,比如:一个功能一个脚本或者一个系统一个脚本. import java.io.FileNotFou ...