文章目录

  • 导包
  • 模拟浏览器登录参数
  • 一:单线程爬取
    • 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多线程下载图片相关推荐

  1. Python 多线程下载图片

    多线程下载图片 参考链接: Python标准库-urllib和urllib3 urllib实战2–urllib基础urlretrieve().urlcleanup().info().getcode() ...

  2. 【python学习】多线程下载图片实战

    python多线程下载图片(setu) 前言 python的学习其实早在两三个星期前就开始了,奈何我是个急性子,所以学的很浮躁,甚至连md笔记都没写.但是想了想,我学python的目的反正也仅仅是为了 ...

  3. Python多线程下载网络URL图片的方法

    Python多线程下载网络URL图片的方法 采用多线程的方法,通过URL地址,下载资源图片 GitHub地址:https://github.com/PanJinquan/python-learning ...

  4. python多线程下载小姐姐图片

    python多线程下载小姐姐图片 闲谈 思路 实现过程 单线程实现代码功能 问题描述 多线程处理办法 完成效果 闲谈 今日闲来无事,翻看博客,看到一篇关于python自动下载图片的文章,就萌生了也写一 ...

  5. 图片爬虫,手把手教你Python多线程下载获取图片

    图片站lemanoosh数据为异步加载的形式,往下拉会展示更多数据,也就是下一页数据,通过谷歌浏览器可以很清晰的看到数据接口地址,以及数据展现形式,与其他网站返回json数据的不同之处是,该网站返回的 ...

  6. python根据url list多线程下载图片、删除图片目录

    看到很多个版本多线程下载图片,自己改了改,主要是异常以及urlretrieve的使用 import time from multiprocessing.pool import ThreadPool i ...

  7. python多线程下载大文件_Python threading多线程断点下载文件的方法

    这是玩蛇网一篇关于Python多线程下载文件方法的代码实例.文中应用到的python模块和方法有httplib.Python urllib2.Python threading多线程模块.python ...

  8. 如何使用Python批量下载图片

    爬虫程序在采集网页的过程中,需要从网上下载一些图片,比如表情包.壁纸.素材等,如果图片的数量很多,这样做就会非常麻烦和耗时.那么有没有更方便快捷的方法呢?答案是肯定的.我们可以利用Python编程语言 ...

  9. python 多线程下载_Python 多线程下载器

    从网上找了段多线程下载图片.文件等等的代码,存个档.以后用用. from concurrent.futures import ThreadPoolExecutor, wait from threadi ...

最新文章

  1. python时区转换_在python 不同时区之间的差值与转换方法
  2. 在 VC6 中使用 GdiPlus-使用
  3. [译]SSAS下玩转PowerShell(三)
  4. ajax html例子,AJAX实例
  5. angularjs中state的参数4_一文梳理pytorch保存和重载模型参数攻略
  6. C++Dynamic Array动态数组(附完整源码)
  7. gm21模型python_python使用GM11
  8. 无线网络中终端设备接入过程
  9. python爆破脚本_snmp爆破(python脚本)
  10. 软件开发需求分析内容
  11. 各浏览器中的 WebRTC 表现对比【转】
  12. Java合并两个有序链表
  13. 黑客穷追不舍攻击“谷姐” [转]
  14. Python AutoCAD 绘图
  15. 几种设置开机启动的方法
  16. 懒惰的牛(差分) + 金发姑娘和 N 头牛(差分) + 贝茜放慢脚步(二路排序)(归并排序)
  17. OllyDbg笔记-Olly Advanced插件使用
  18. 计算机音乐制作 体会心得,音乐软件制作的学习感受和心得体会
  19. 给计算机新用户授权,AD管理之授权用户将计算机加入域的权限
  20. 计算机公务员写材料吗,公务员写材料到底从哪入手啊

热门文章

  1. 取石子游戏系列(1)
  2. 异步升压LED驱动IC7209
  3. 部品se分析_5Why分析(完整版).ppt
  4. 008_直接的样式设置
  5. 02.视频播放器整体结构
  6. 了微操作而进化成章鱼的人们
  7. 菜鸟怎样把U盘制作成系统启动盘,并且可以放两个系统,一个win7,另一个xp系统。
  8. 小程序实现天/时/分/秒倒计时效果
  9. 统计基础:1.1_正态分布及其检验
  10. 一个女孩子的创业体验