Python多线程下载图片
文章目录
- 导包
- 模拟浏览器登录参数
- 一:单线程爬取
- 1.生成网页列表
- 2.爬取图片的网址
- 3.下载图片到本地
- 二:多线程下载图片
- 0.加锁
- 1.获取图片网址
- 2.下载图片
- 3.函数调用
- 4.问题
- 完整代码
导包
import re
import os
import urllib.request
import threading
模拟浏览器登录参数
headers ={"Referer": "https://www.doutula.com/photo/list/","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
一:单线程爬取
1.生成网页列表
我们以爬取斗图啦网页图片为例:
点击最新图片,就会就会显示每一页所有图片,通过观察每一页的网址我们可以找出规律
所以可以将每一页的网址都存入一个列表里,方便爬取时使用
我们先以20页为例
url_list = []
http = "http://www.doutula.com/photo/list/?page="
for i in range(1,20):url = http+str(i)url_list.append(url)
for url in url_list:print(url)
2.爬取图片的网址
我们要获取的是上图标注的东西
for url in url_list:res = urllib.request.Request(url,headers=headers)res2 = urllib.request.urlopen(res).read().decode("UTF-8")result = re.findall(re.compile(r'<img referrerpolicy="no-referrer".*?data-original="(.*?)"',re.S),res2)
3.下载图片到本地
定义下载函数
#定义下载函数
def download_picture(url):#修改文件名split_list = url.split("/")filename = split_list.pop()path = os.path.join("doutu",filename) #文件夹要自己新建,不然会报错#下载图片,保存本地urllib.request.urlretrieve(url,filename=path)
调用函数
for url in url_list:res = urllib.request.Request(url,headers=headers)res2 = urllib.request.urlopen(res).read().decode("UTF-8")result = re.findall(re.compile(r'<img referrerpolicy="no-referrer".*?data-original="(.*?)"',re.S),res2)for relt in result:download_picture(relt)
二:多线程下载图片
多线程模式下可以很清楚的看到下载图片的快速
0.加锁
多线程在运行时,会出现同时访问某元素的情况,为避免数据变动后出现错误,需要在取数据的前后进行加锁与解锁
glock = threading.Lock()
1.获取图片网址
新建列表用来存储图片网址
pic_list = []
封装获取图片网址的函数
#生产者:源源不断产生图片网址并存入列表
def get_pic_url():while True:glock.acquire()if len(url_list) == 0:glock.release()breakelse:page_url = url_list.pop()glock.release()res = urllib.request.Request(page_url,headers=headers)res2 = urllib.request.urlopen(res).read().decode("UTF-8")result = re.findall(re.compile(r'<img referrerpolicy="no-referrer".*?data-original="(.*?)"',re.S),res2)glock.acquire()for rel in result:pic_list.append(rel)glock.release()
2.下载图片
封装下载函数
#消费者:从存储图片网址的列表中拿出网址,进行下载
def download_picture():while True:glock.acquire()if len(pic_list) ==0:glock.release()continueelse:url = pic_list.pop()glock.release()#修改文件名split_list = url.split("/")filename = split_list.pop()path = os.path.join("doutu",filename)#下载图片,保存本地urllib.request.urlretrieve(url,filename=path)
3.函数调用
def main():#创建两个线程作为生产者for x in range(2):product = threading.Thread(target=get_pic_url)product.start()#创建三个线程作为消费者for x in range(3):consumer = threading.Thread(target=download_picture)consumer.start()if __name__ == '__main__':main()
代码运行没有出错,速度飞快
可以用时间函数计时
import time
if __name__ == '__main__':d = time.time()main()d = time.time()-dprint(d)
4.问题
代码虽然可以多线程运行,但也出现不停止的情况,所以在条件判断的地方还要优化改进
完整代码
#coding: utf-8
import re
import os
import urllib.request
import threadingheaders ={"Referer": "https://www.doutula.com/photo/list/","User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
url_list = []
pic_list = []
glock = threading.Lock()
http = "http://www.doutula.com/photo/list/?page="
for i in range(1,10):url = http+str(i)url_list.append(url)
# for url in url_list:
# print(url)#生产者:源源不断产生图片网址并存入列表
def get_pic_url():while True:glock.acquire()if len(url_list) == 0:glock.release()breakelse:page_url = url_list.pop()glock.release()res = urllib.request.Request(page_url,headers=headers)res2 = urllib.request.urlopen(res).read().decode("UTF-8")result = re.findall(re.compile(r'<img referrerpolicy="no-referrer".*?data-original="(.*?)"',re.S),res2)glock.acquire()for rel in result:pic_list.append(rel)glock.release()#消费者:从存储图片网址的列表中拿出网址,进行下载def download_picture():while True:glock.acquire()if len(pic_list) ==0:glock.release()continueelse:url = pic_list.pop()glock.release()#修改文件名split_list = url.split("/")filename = split_list.pop()path = os.path.join("doutu",filename)#下载图片,保存本地urllib.request.urlretrieve(url,filename=path)def main():#创建两个线程作为生产者for x in range(2):product = threading.Thread(target=get_pic_url)product.start()#创建三个线程作为消费者for x in range(3):consumer = threading.Thread(target=download_picture)consumer.start()if __name__ == '__main__':main()
Python多线程下载图片相关推荐
- Python 多线程下载图片
多线程下载图片 参考链接: Python标准库-urllib和urllib3 urllib实战2–urllib基础urlretrieve().urlcleanup().info().getcode() ...
- 【python学习】多线程下载图片实战
python多线程下载图片(setu) 前言 python的学习其实早在两三个星期前就开始了,奈何我是个急性子,所以学的很浮躁,甚至连md笔记都没写.但是想了想,我学python的目的反正也仅仅是为了 ...
- Python多线程下载网络URL图片的方法
Python多线程下载网络URL图片的方法 采用多线程的方法,通过URL地址,下载资源图片 GitHub地址:https://github.com/PanJinquan/python-learning ...
- python多线程下载小姐姐图片
python多线程下载小姐姐图片 闲谈 思路 实现过程 单线程实现代码功能 问题描述 多线程处理办法 完成效果 闲谈 今日闲来无事,翻看博客,看到一篇关于python自动下载图片的文章,就萌生了也写一 ...
- 图片爬虫,手把手教你Python多线程下载获取图片
图片站lemanoosh数据为异步加载的形式,往下拉会展示更多数据,也就是下一页数据,通过谷歌浏览器可以很清晰的看到数据接口地址,以及数据展现形式,与其他网站返回json数据的不同之处是,该网站返回的 ...
- python根据url list多线程下载图片、删除图片目录
看到很多个版本多线程下载图片,自己改了改,主要是异常以及urlretrieve的使用 import time from multiprocessing.pool import ThreadPool i ...
- python多线程下载大文件_Python threading多线程断点下载文件的方法
这是玩蛇网一篇关于Python多线程下载文件方法的代码实例.文中应用到的python模块和方法有httplib.Python urllib2.Python threading多线程模块.python ...
- 如何使用Python批量下载图片
爬虫程序在采集网页的过程中,需要从网上下载一些图片,比如表情包.壁纸.素材等,如果图片的数量很多,这样做就会非常麻烦和耗时.那么有没有更方便快捷的方法呢?答案是肯定的.我们可以利用Python编程语言 ...
- python 多线程下载_Python 多线程下载器
从网上找了段多线程下载图片.文件等等的代码,存个档.以后用用. from concurrent.futures import ThreadPoolExecutor, wait from threadi ...
最新文章
- python时区转换_在python 不同时区之间的差值与转换方法
- 在 VC6 中使用 GdiPlus-使用
- [译]SSAS下玩转PowerShell(三)
- ajax html例子,AJAX实例
- angularjs中state的参数4_一文梳理pytorch保存和重载模型参数攻略
- C++Dynamic Array动态数组(附完整源码)
- gm21模型python_python使用GM11
- 无线网络中终端设备接入过程
- python爆破脚本_snmp爆破(python脚本)
- 软件开发需求分析内容
- 各浏览器中的 WebRTC 表现对比【转】
- Java合并两个有序链表
- 黑客穷追不舍攻击“谷姐” [转]
- Python AutoCAD 绘图
- 几种设置开机启动的方法
- 懒惰的牛(差分) + 金发姑娘和 N 头牛(差分) + 贝茜放慢脚步(二路排序)(归并排序)
- OllyDbg笔记-Olly Advanced插件使用
- 计算机音乐制作 体会心得,音乐软件制作的学习感受和心得体会
- 给计算机新用户授权,AD管理之授权用户将计算机加入域的权限
- 计算机公务员写材料吗,公务员写材料到底从哪入手啊