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")
请引用自己保存文件路径- 没有开启和开启多线程所耗时间:
python多线程批量下载远程图片的更多相关文章
- 批量下载网站图片的Python实用小工具
定位 本文适合于熟悉Python编程且对互联网高清图片饶有兴趣的筒鞋.读完本文后,将学会如何使用Python库批量并发地抓取网页和下载图片资源.只要懂得如何安装Python库以及运行Python程序, ...
- 批量下载网站图片的Python实用小工具(下)
引子 在 批量下载网站图片的Python实用小工具 一文中,讲解了开发一个Python小工具来实现网站图片的并发批量拉取.不过那个工具仅限于特定网站的特定规则,本文将基于其代码实现,开发一个更加通用的 ...
- php 下载远程图片 的几种方法(转)
1.获取远程文件大小及信息的函数 function getFileSize($url){ $url = parse_url($url); if($fp = @fso ...
- php下载远程图片方法总结(curl手动解析header)curl跳转问题解决
常用方法一般有:. file_get_contents file_put_contents readfile($file) //效率很高. 一般代码: /** * 抓取远程图片 * * @param ...
- php下载远程图片到本地
在使用 PHP 做简单的爬虫的时候,我们经常会遇到需要下载远程图片的需求,所以下面来简单实现这个需求1:使用curl 比如我们有下面这两张图片: $images = [ 'https://img.al ...
- 织梦dedecms 无法下载远程图片 fsockopen函数被禁用的解决方法
在linux服务器上fsockopen()函数被无情的禁用了(这其实是出于安全考虑,可以理解),下载远程图片的功能就没有办法使用了.找了一些资料之后,找到了解决方法,就是用stream_socket_ ...
- 从CSV文件中读取jpg图片的URL地址并多线程批量下载
很多时候,我们的网站上传图片时并没有根据内容进行文件夹分类,甚至会直接存储到阿里云的OSS或是七牛云等云存储上.这样,当我们需要打包图片时,就需要从数据库找寻分类图片,通过CURL进行下载.我最近刚刚 ...
- python图片爬虫 - 批量下载unsplash图片
前言 unslpash绝对是找图的绝佳场所, 但是进网站等待图片加载真的令人捉急, 仿佛是一场拼RP的战争 然后就开始思考用爬虫帮我批量下载, 等下载完再挑选, 操作了一下不算很麻烦, 顺便也给大家提 ...
- [记录][python]python爬虫,下载某图片网站的所有图集
随笔仅用于学习交流,转载时请注明出处,http://www.cnblogs.com/CaDevil/p/5958770.html 该随笔是记录我的第一个python程序,一个爬去指定图片站点的所有图集 ...
随机推荐
- JAVASE学习笔记:第八章 经常使用类Util工具包之日期类、数字类
一.Date类 日期类 所在java.Util工具包 before(Date when) 測试此日期是否在指定日期之前. getDay() 获取星期的某一天 getDate( ...
- Web优化 --利用css sprites降低图片请求
sprites是鬼怪,小妖精,调皮鬼的意思,初听这个高端洋气的名字我被震慑住了,一步步掀开其面纱后发觉非常easy的东西.作用却非常大 什么是CSS Sprites CSS Sprites是指把网页中 ...
- freeIPMI README && issue about OpenIPMI kernel driver
http://www.gnu.org/software/freeipmi/README FreeIPMI - Copyright (C) 2003-2013 FreeIPMI Core Team Fr ...
- Maple入门使用教程
http://anony3721.blog.163.com/blog/static/51197420105173915247/ 命令的运行:1.每条命令必须用":"(运行后不显示) ...
- java之集合Collection 具体解释之4
package cn.itcast_04; public class Student { private String name; private int age; public Student() ...
- label 对齐
<label for="username">用户名</label> <input type="text" id="use ...
- (转载)js(jquery)的on绑定点击事件执行两次的解决办法
js(jquery)的on绑定点击事件执行两次的解决办法—不是事件绑定而是事件冒泡 遇到的问题:jquery中用.on()给页面中新加的元素添加点击事件时,点击事件源,绑定的事件执行两次,这里的ale ...
- java -jar 与nohup的区别
——作为java程序员,经常会遇到这样一个问题,打个jar包,测试或者上线生产,于是乎面临的选择来了,java –jar or nohup? 下面我来扒一扒: 一. java -jar a.ja ...
- webpack 的编译原理
自从接触了react,vue 这两个框架,都会用到webpack这个打包工具.面试的时候,经常被问到知道webpack的编译原理吗? 可以简单的介绍一下.每每这个时候都被问的哑口无言,平时用的时候挺顺 ...
- js中一些常见写法的含义
1. 常见格式:(function() { /* code */ })(); 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数,随后一对空括号立即执行返回的未命名函数,括号 ...