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程序设计(12.3)---- 监听器0基础应用:五子棋

    1.制作五子棋游戏软件 由于老师已经基本做完了.重做的时候快了非常多--可是还是感觉思维非常混乱-- 哪边先哪边后,哪个方法在哪边好之类的问题 太纠结了-- 先是窗体 内部类:鼠标适配器  窗体的构造 ...

  2. HDU2084_数塔【简单题】【数塔】

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  3. 分析Cocos2d-x横版ACT手游源码 1、公共

    直接上代码 不说什么 这一款源码 凝视及多 PublicDef.h 公共头文件 #define NF_PLATFORM 1 //当前版本号(默觉得普通版) //版本号列表 #define NF_PLA ...

  4. 【linux驱动分析】之dm9000驱动分析(三):sk_buff结构分析

    [linux驱动分析]之dm9000驱动分析(一):dm9000原理及硬件分析 [linux驱动分析]之dm9000驱动分析(二):定义在板文件里的资源和设备以及几个宏 [linux驱动分析]之dm9 ...

  5. requirejs中的define

    关于requirejs中的define的原理理解   我们已经了解到模块模式是为单例创建私有变量和特权方法的.一个最基本的例子: var foo=(function(){ var something= ...

  6. php浏览次数累加代码

    <?php $count=0; if(file_exists("count.txt")) //判断是否存在count.txt文件 { $count=file_get_cont ...

  7. java的自定义异常类

    编写自定义异常类的模式 编写自定义异常类实际上是继承一个Exception标准异常类,用新定义的异常处理信息覆盖原有信息的过程.常用的编写自定义异常类的模式如下: public classCustom ...

  8. java sleep和wait的区别和联系

    Thread.sleep不会改变锁的行为,如果当前线程拥有锁,那么当前线程sleep之后,该锁不会被释放. Thread.sleep和Object.wait都会暂停当前的线程,让出cpu.Thread ...

  9. Statelessness Provide credentials with the request. Each request MUST stand alone and should not be affected from previous conversation happened from same client in past.

    The server never relies on information from previous requests. Statelessness As per the REST (REpres ...

  10. html5--6-52 动画效果-过渡

    html5--6-52 动画效果-过渡 实例 @charset="UTF-8"; div{ width: 300px; height: 150px; margin: 30px; f ...