python多線程批量下載遠程圖片


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")
請引用自己保存文件路徑

沒有開啟和開啟多線程所耗時間:



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM